From 086ee211ced10771efbde6ec11ed48966c3a2136 Mon Sep 17 00:00:00 2001 From: Daniel Grams Date: Fri, 18 Jun 2021 10:40:33 +0200 Subject: [PATCH] Offset in event dates generated by update_recurring_dates #195 (#196) Offset in event dates generated by update_recurring_dates #195 --- project/api/event/schemas.py | 4 ++-- project/api/event_date/schemas.py | 9 +++++---- project/api/fields.py | 6 ++++++ project/cli/event.py | 6 +++++- project/services/event.py | 2 +- project/templates/layout.html | 2 +- tests/api/test_event_date.py | 3 ++- tests/cli/test_event.py | 2 +- tests/services/test_event.py | 17 +++++++++++++++++ 9 files changed, 40 insertions(+), 11 deletions(-) diff --git a/project/api/event/schemas.py b/project/api/event/schemas.py index 3cefda5..85b1b7c 100644 --- a/project/api/event/schemas.py +++ b/project/api/event/schemas.py @@ -170,8 +170,8 @@ class EventRefSchema(EventIdSchema): class EventSearchItemSchema(EventRefSchema): description = marshmallow.auto_field() - start = marshmallow.auto_field() - end = marshmallow.auto_field() + start = CustomDateTimeField() + end = CustomDateTimeField() recurrence_rule = marshmallow.auto_field() photo = fields.Nested(ImageSchema) place = fields.Nested(PlaceSearchItemSchema, attribute="event_place") diff --git a/project/api/event_date/schemas.py b/project/api/event_date/schemas.py index 70841e6..1ce48cd 100644 --- a/project/api/event_date/schemas.py +++ b/project/api/event_date/schemas.py @@ -6,6 +6,7 @@ from project.api.event.schemas import ( EventSearchItemSchema, EventSearchRequestSchema, ) +from project.api.fields import CustomDateTimeField from project.api.schemas import PaginationRequestSchema, PaginationResponseSchema from project.models import EventDate @@ -16,8 +17,8 @@ class EventDateSchema(marshmallow.SQLAlchemySchema): load_instance = True id = marshmallow.auto_field() - start = marshmallow.auto_field() - end = marshmallow.auto_field() + start = CustomDateTimeField() + end = CustomDateTimeField() event = fields.Nested(EventRefSchema) @@ -27,7 +28,7 @@ class EventDateRefSchema(marshmallow.SQLAlchemySchema): load_instance = True id = marshmallow.auto_field() - start = marshmallow.auto_field() + start = CustomDateTimeField() class EventDateListRequestSchema(PaginationRequestSchema): @@ -49,7 +50,7 @@ class EventDateSearchItemSchema(EventDateRefSchema): model = EventDate load_instance = True - end = marshmallow.auto_field() + end = CustomDateTimeField() event = fields.Nested(EventSearchItemSchema) diff --git a/project/api/fields.py b/project/api/fields.py index 56b9d6e..626227d 100644 --- a/project/api/fields.py +++ b/project/api/fields.py @@ -18,6 +18,12 @@ class NumericStr(fields.String): class CustomDateTimeField(fields.DateTime): + def _serialize(self, value, attr, obj, **kwargs): + if value: + value = value.astimezone(berlin_tz) + + return super()._serialize(value, attr, obj, **kwargs) + def deserialize(self, value, attr, data, **kwargs): result = super().deserialize(value, attr, data, **kwargs) diff --git a/project/cli/event.py b/project/cli/event.py index 255cec7..98d7520 100644 --- a/project/cli/event.py +++ b/project/cli/event.py @@ -2,6 +2,7 @@ import click from flask.cli import AppGroup from project import app, db +from project.dateutils import berlin_tz from project.services.event import ( get_recurring_events, update_event_dates_with_recurrence_rule, @@ -12,13 +13,16 @@ event_cli = AppGroup("event") @event_cli.command("update-recurring-dates") def update_recurring_dates(): + # Setting the timezone is neccessary for cli command + db.session.execute("SET timezone TO :val;", {"val": berlin_tz.zone}) + events = get_recurring_events() for event in events: update_event_dates_with_recurrence_rule(event) db.session.commit() - click.echo(f"{len(events)} event(s) where updated.") + click.echo(f"{len(events)} event(s) were updated.") app.cli.add_command(event_cli) diff --git a/project/services/event.py b/project/services/event.py index 6921829..528776e 100644 --- a/project/services/event.py +++ b/project/services/event.py @@ -273,7 +273,7 @@ def get_events_query(params): def get_recurring_events(): - return Event.query.filter(Event.recurrence_rule is not None).all() + return Event.query.filter(func.coalesce(Event.recurrence_rule, "") != "").all() def update_event_dates_with_recurrence_rule(event): diff --git a/project/templates/layout.html b/project/templates/layout.html index 7d5d935..2181787 100644 --- a/project/templates/layout.html +++ b/project/templates/layout.html @@ -42,7 +42,7 @@ - + diff --git a/tests/api/test_event_date.py b/tests/api/test_event_date.py index 22935ed..261c513 100644 --- a/tests/api/test_event_date.py +++ b/tests/api/test_event_date.py @@ -19,4 +19,5 @@ def test_search(client, seeder, utils): seeder.create_event(admin_unit_id) url = utils.get_url("api_v1_event_date_search", sort="-rating") - utils.get_ok(url) + response = utils.get_ok(url) + assert response.json["items"][0]["start"].endswith("+02:00") diff --git a/tests/cli/test_event.py b/tests/cli/test_event.py index a76a6ed..59e9d30 100644 --- a/tests/cli/test_event.py +++ b/tests/cli/test_event.py @@ -4,4 +4,4 @@ def test_update_recurring_dates(client, seeder, app): runner = app.test_cli_runner() result = runner.invoke(args=["event", "update-recurring-dates"]) - assert "1 event(s) where updated." in result.output + assert "1 event(s) were updated." in result.output diff --git a/tests/services/test_event.py b/tests/services/test_event.py index 08ad8a6..30746b2 100644 --- a/tests/services/test_event.py +++ b/tests/services/test_event.py @@ -152,3 +152,20 @@ def test_get_meta_data(seeder, app): with app.test_request_context(): meta = get_meta_data(event) assert meta is not None + + +def test_get_recurring_events(client, seeder, app): + user_id, admin_unit_id = seeder.setup_base() + event_id = seeder.create_event( + admin_unit_id, recurrence_rule="RRULE:FREQ=DAILY;COUNT=7" + ) + seeder.create_event(admin_unit_id, recurrence_rule=None) + seeder.create_event(admin_unit_id, recurrence_rule="") + + with app.app_context(): + from project.services.event import get_recurring_events + + recurring_events = get_recurring_events() + + assert len(recurring_events) == 1 + assert recurring_events[0].id == event_id