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