From 479617924e8a3d64d4ebf4a188cb06e9e7e2935e Mon Sep 17 00:00:00 2001 From: Daniel Grams Date: Wed, 2 Jun 2021 11:25:18 +0200 Subject: [PATCH] EXDATE not working for recurring events #186 --- project/dateutils.py | 31 +++++++++++++++---------------- tests/services/test_event.py | 27 +++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 16 deletions(-) diff --git a/project/dateutils.py b/project/dateutils.py index 9b74ee5..bd44f4a 100644 --- a/project/dateutils.py +++ b/project/dateutils.py @@ -32,6 +32,10 @@ def date_add_time(date, hour=0, minute=0, second=0, tzinfo=None): ) +def date_set_begin_of_day(date): + return date_add_time(date) + + def date_set_end_of_day(date): return date_add_time(date, hour=23, minute=59, second=59) @@ -49,26 +53,21 @@ def form_input_from_date(date): def dates_from_recurrence_rule(start, recurrence_rule): result = list() - adv_recurrence_rule = recurrence_rule.replace("T000000", "T235959") - start_wo_tz = start.replace(tzinfo=None) - rule_set = rrulestr(adv_recurrence_rule, forceset=True, dtstart=start_wo_tz) + start_begin_of_day = date_set_begin_of_day(start) + rule_set = rrulestr(recurrence_rule, forceset=True, dtstart=start_begin_of_day) - start_date = start_wo_tz - - # Keine Daten in der Vergangenheit laden + # Keine Daten in der Vergangenheit erstellen today = get_today() - if today > start: - start_date = today.replace(tzinfo=None) + start_date = today if today > start else start + start_date_begin_of_day = date_set_begin_of_day(start_date) - end_date = start_date + relativedelta(years=1) - start_date_begin_of_day = datetime( - start_date.year, start_date.month, start_date.day - ) - end_date_end_of_day = datetime( - end_date.year, end_date.month, end_date.day, hour=23, minute=59, second=59 - ) + # Max. 1 Jahr in die Zukunft + end_date = start_date_begin_of_day + relativedelta(years=1) + end_date_end_of_day = date_set_end_of_day(end_date) - for rule_date in rule_set.between(start_date_begin_of_day, end_date_end_of_day): + for rule_date in rule_set.between( + start_date_begin_of_day, end_date_end_of_day, inc=True + ): rule_data_w_tz = berlin_tz.localize(rule_date) result.append(rule_data_w_tz) diff --git a/tests/services/test_event.py b/tests/services/test_event.py index efdcc4e..08ad8a6 100644 --- a/tests/services/test_event.py +++ b/tests/services/test_event.py @@ -105,6 +105,33 @@ def test_update_event_dates_with_recurrence_rule_past_forever( assert event_date.end == create_berlin_date(2021, 1, 3, 16, 30) +def test_update_event_dates_with_recurrence_rule_exdate( + client, seeder, utils, app, mocker +): + user_id, admin_unit_id = seeder.setup_base() + event_id = seeder.create_event(admin_unit_id) + + with app.app_context(): + from project.dateutils import create_berlin_date + from project.models import Event + from project.services.event import update_event_dates_with_recurrence_rule + + utils.mock_now(mocker, 2021, 6, 1) + + event = Event.query.get(event_id) + event.start = create_berlin_date(2021, 4, 21, 17, 0) + event.end = create_berlin_date(2021, 4, 21, 18, 0) + + # Wiederholt sich jeden Mittwoch + event.recurrence_rule = "RRULE:FREQ=WEEKLY;BYDAY=WE;UNTIL=20211231T000000\nEXDATE:20210216T000000,20210223T000000,20210602T000000" + update_event_dates_with_recurrence_rule(event) + + # Das erste Date soll nicht der 02.06. sein (excluded), sondern der 09.06. + event_date = event.dates[0] + assert event_date.start == create_berlin_date(2021, 6, 9, 17, 0) + assert event_date.end == create_berlin_date(2021, 6, 9, 18, 0) + + def test_get_meta_data(seeder, app): user_id, admin_unit_id = seeder.setup_base() event_id = seeder.create_event(admin_unit_id)