From ad01bca2b07f1fa76e0160ecfac5b4211364559c Mon Sep 17 00:00:00 2001 From: Classic298 <27028174+Classic298@users.noreply.github.com> Date: Tue, 29 Sep 2026 18:25:18 +0200 Subject: [PATCH] fix: repeating calendar events are missing when they began before the visible dates (#31606) A repeating event that was still running when the visible dates began was left out of the calendar. A weekly event from 23:00 to 01:00, for example, did not show on the following day, while the same event without a repeat did. Repeating events are now shown whenever any part of them falls within the visible dates. Fixes #31605 --- backend/open_webui/utils/calendar.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/backend/open_webui/utils/calendar.py b/backend/open_webui/utils/calendar.py index 0406db38f6..063cbc8e3c 100644 --- a/backend/open_webui/utils/calendar.py +++ b/backend/open_webui/utils/calendar.py @@ -40,7 +40,6 @@ def expand_recurring_event( range_start = to_local_datetime(range_start_ns) range_end = to_local_datetime(range_end_ns) - scan_start = range_start - dt.timedelta(days=1) original_start_ns = event_dict['start_at'] original_start = to_local_datetime(original_start_ns) @@ -55,6 +54,9 @@ def expand_recurring_event( original_end_ns = event_dict.get('end_at') duration_ns = (original_end_ns - original_start_ns) if original_end_ns else None + # Look back by the event length so occurrences still running at range start are found + event_length = dt.timedelta(microseconds=max(duration_ns or 0, 0) // 1000) + scan_start = range_start - dt.timedelta(days=1) - event_length instances = [] previous_start = None @@ -64,12 +66,13 @@ def expand_recurring_event( previous_start = occurrence_start instance_start_ns = int(occurrence_start.replace(tzinfo=user_timezone).timestamp() * 1_000_000_000) + instance_end_ns = (instance_start_ns + duration_ns) if duration_ns else None - if instance_start_ns >= range_start_ns: + if instance_start_ns >= range_start_ns or (instance_end_ns and instance_end_ns > range_start_ns): instance = { **event_dict, 'start_at': instance_start_ns, - 'end_at': (instance_start_ns + duration_ns) if duration_ns else None, + 'end_at': instance_end_ns, 'instance_id': f'{event_dict["id"]}_{instance_start_ns}', } instances.append(instance)