fix: expand all events that are active in the defined window

pull/139/head
Martin Eigenmann 2024-09-09 15:04:36 +02:00
rodzic cefbd2966c
commit 24951787ab
Nie znaleziono w bazie danych klucza dla tego podpisu
3 zmienionych plików z 44 dodań i 1 usunięć

Wyświetl plik

@ -404,7 +404,12 @@ def parse_events(
if e.recurring:
rule = parse_rrule(component)
for dt in rule.between(f, t, inc=True):
# We can not use rule.between because the event has to fit in between https://github.com/jazzband/icalevents/issues/101
for dt in [
dt
for dt in list(rule.between(f - (end - start), t + (end - start)))
if dt >= f and dt <= t
]:
# Recompute the start time in the current timezone *on* the
# date of *this* occurrence. This handles the case where the
# recurrence has crossed over the daylight savings time boundary.

Wyświetl plik

@ -0,0 +1,25 @@
BEGIN:VCALENDAR
VERSION:2.0
BEGIN:VTIMEZONE
TZID:Europe/Berlin
BEGIN:STANDARD
DTSTART:19701025T030000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=10
TZNAME:CET
TZOFFSETFROM:+0200
TZOFFSETTO:+0100
END:STANDARD
BEGIN:DAYLIGHT
DTSTART:19700329T020000
RRULE:FREQ=YEARLY;BYDAY=-1SU;BYMONTH=3
TZNAME:CEST
TZOFFSETFROM:+0100
TZOFFSETTO:+0200
END:DAYLIGHT
END:VTIMEZONE
BEGIN:VEVENT
DTSTART;TZID=Europe/Berlin:20211129T000000
DTEND;TZID=Europe/Berlin:20211129T080000
RRULE:FREQ=WEEKLY;UNTIL=20221230T230000Z;BYDAY=MO,TU,WE
END:VEVENT
END:VCALENDAR

Wyświetl plik

@ -5,6 +5,7 @@ from time import sleep
from dateutil.relativedelta import relativedelta
from dateutil.tz import UTC, gettz
from re import search
import textwrap
import pytz
@ -932,3 +933,15 @@ class ICalEventsTests(unittest.TestCase):
"fourth event on 1. jan - 18. and 25. dec are excluded",
)
self.assertEqual(events[4].start, date(2024, 1, 8), "fifth event on 8. jan")
def test_regression_recurring_events_with_timezones(self):
# we need to test if all active events are returned, even if they do not fit fully in the defined window
tz = gettz("Europe/Berlin")
ical = "test/test_data/recurring_small_window.ics"
start = datetime(2022, 1, 11, 0, 0, 1, tzinfo=tz)
end = datetime(2022, 1, 11, 8, 0, 1, tzinfo=tz)
events = icalevents.events(file=ical, start=start, end=end, strict=True)
self.assertEqual(len(events), 1)
self.assertEqual(events[0].end.hour, 8)