Merge pull request #187 from DanielGrams/issue/186

EXDATE not working for recurring events #186
This commit is contained in:
Daniel Grams 2021-06-02 12:01:42 +02:00 committed by GitHub
commit d20ff48256
2 changed files with 42 additions and 16 deletions

View File

@ -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)

View File

@ -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)