Skip to content

Commit cf1b78a

Browse files
authored
Merge pull request #1982 from metallerok/recurrence_all_day_comparsion
Recurrence all day comparsion
2 parents a92dd6a + c4362b6 commit cf1b78a

File tree

3 files changed

+64
-16
lines changed

3 files changed

+64
-16
lines changed

radicale/app/report.py

Lines changed: 31 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -395,7 +395,7 @@ def _expand(
395395
time_range_end = time_range_end.replace(tzinfo=None)
396396

397397
for vevent in vevents_overridden:
398-
_strip_single_event(vevent, dt_format)
398+
_strip_single_event(vevent, dt_format, all_day_event)
399399

400400
duration = None
401401
if hasattr(base_vevent, "dtend"):
@@ -457,7 +457,7 @@ def _expand(
457457
.format(max_occurrence))
458458

459459
_strip_component(vevent_component)
460-
_strip_single_event(base_vevent, dt_format)
460+
_strip_single_event(base_vevent, dt_format, all_day_event)
461461

462462
i_overridden = 0
463463

@@ -480,7 +480,13 @@ def _expand(
480480
continue
481481

482482
# Check for overridden instances
483-
i_overridden, vevent = _find_overridden(i_overridden, vevents_overridden, recurrence_utc, dt_format)
483+
i_overridden, vevent = _find_overridden(
484+
i_overridden,
485+
vevents_overridden,
486+
recurrence_utc,
487+
dt_format,
488+
all_day_event,
489+
)
484490

485491
if not vevent:
486492
# Create new instance from recurrence
@@ -568,15 +574,20 @@ def _expand(
568574
return element, len(filtered_vevents)
569575

570576

571-
def _convert_timezone(vevent: vobject.icalendar.RecurringComponent,
572-
name_prop: str,
573-
name_content_line: str):
577+
def _convert_timezone(
578+
vevent: vobject.icalendar.RecurringComponent,
579+
name_prop: str,
580+
name_content_line: str,
581+
all_day_event: bool = False
582+
):
574583
prop = getattr(vevent, name_prop, None)
575584
if prop:
576585
if type(prop.value) is datetime.date:
577586
date_time = datetime.datetime.fromordinal(
578587
prop.value.toordinal()
579-
).replace(tzinfo=datetime.timezone.utc)
588+
)
589+
if not all_day_event:
590+
date_time = date_time.replace(tzinfo=datetime.timezone.utc)
580591
else:
581592
date_time = prop.value.astimezone(datetime.timezone.utc)
582593

@@ -591,10 +602,14 @@ def _convert_to_utc(vevent: vobject.icalendar.RecurringComponent,
591602
setattr(vevent, name_prop, ContentLine(name=prop.name, value=prop.value.strftime(dt_format), params=[]))
592603

593604

594-
def _strip_single_event(vevent: vobject.icalendar.RecurringComponent, dt_format: str) -> None:
595-
_convert_timezone(vevent, 'dtstart', 'DTSTART')
596-
_convert_timezone(vevent, 'dtend', 'DTEND')
597-
_convert_timezone(vevent, 'recurrence_id', 'RECURRENCE-ID')
605+
def _strip_single_event(
606+
vevent: vobject.icalendar.RecurringComponent,
607+
dt_format: str,
608+
all_day_event: bool = False,
609+
) -> None:
610+
_convert_timezone(vevent, 'dtstart', 'DTSTART', all_day_event)
611+
_convert_timezone(vevent, 'dtend', 'DTEND', all_day_event)
612+
_convert_timezone(vevent, 'recurrence_id', 'RECURRENCE-ID', all_day_event)
598613

599614
# There is something strange behaviour during serialization native datetime, so converting manually
600615
_convert_to_utc(vevent, 'dtstart', dt_format)
@@ -675,13 +690,13 @@ def _find_overridden(
675690
start: int,
676691
vevents: List[vobject.icalendar.RecurringComponent],
677692
dt: datetime.datetime,
678-
dt_format: str
693+
dt_format: str,
694+
all_day_event: bool,
679695
) -> Tuple[int, Optional[vobject.icalendar.RecurringComponent]]:
680696
for i in range(start, len(vevents)):
681-
dt_event = datetime.datetime.strptime(
682-
vevents[i].recurrence_id.value,
683-
dt_format
684-
).replace(tzinfo=datetime.timezone.utc)
697+
dt_event = datetime.datetime.strptime(vevents[i].recurrence_id.value, dt_format)
698+
if not all_day_event:
699+
dt_event = dt_event.replace(tzinfo=datetime.timezone.utc)
685700
if dt_event == dt:
686701
return (i + 1, vevents[i])
687702
return (start, None)
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
BEGIN:VCALENDAR
2+
VERSION:2.0
3+
PRODID:-//Radicale//Test//EN
4+
5+
BEGIN:VEVENT
6+
DTSTART;VALUE=DATE:20060102
7+
DTEND;VALUE=DATE:20060103
8+
RRULE:FREQ=DAILY;COUNT=3
9+
UID:event_full_day_rrule_overridden
10+
SUMMARY:All day recurring
11+
END:VEVENT
12+
13+
BEGIN:VEVENT
14+
DTSTART;VALUE=DATE:20060110
15+
DTEND;VALUE=DATE:20060111
16+
RECURRENCE-ID;VALUE=DATE:20060103
17+
UID:event_full_day_rrule_overridden
18+
SUMMARY:Overridden instance
19+
END:VEVENT
20+
21+
END:VCALENDAR

radicale/tests/test_expand.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -738,3 +738,15 @@ def test_report_with_incompatible_recurrence_id_dt_types(self, caplog) -> None:
738738
assert event_id in error_logs[0]
739739
assert "base DTSTART is datetime" in error_logs[0]
740740
assert "override RECURRENCE-ID is date" in error_logs[0]
741+
742+
def test_report_with_expand_property_all_day_event_overridden(self) -> None:
743+
self._test_expand(
744+
"event_full_day_rrule_overridden",
745+
"20060101T000000Z",
746+
"20060111T235959Z",
747+
["RECURRENCE-ID:20060102", "RECURRENCE-ID:20060104", "RECURRENCE-ID:20060103"],
748+
["DTSTART:20060102", "DTSTART:20060104", "DTSTART:20060110"],
749+
["DTEND:20060103", "DTEND:20060105", "DTEND:20060111"],
750+
ONLY_DATES,
751+
2
752+
)

0 commit comments

Comments
 (0)