Browse Source

Merge pull request #1833 from pbiering/fix-1827

Fix 1827
Peter Bieringer 7 months ago
parent
commit
5fe9f331e1
2 changed files with 15 additions and 6 deletions
  1. 1 0
      CHANGELOG.md
  2. 14 6
      radicale/app/report.py

+ 1 - 0
CHANGELOG.md

@@ -11,6 +11,7 @@
 * Improve: add options [logging] trace_on_debug and trace_filter for supporting trace logging
 * Fix: catch case where getpwuid is not returning a username
 * Fix: add support for query without comp-type
+* Fix: expanded event with dates are missing VALUE=DATE
 
 ## 3.5.4
 * Improve: item filter enhanced for 3rd level supporting VALARM and honoring TRIGGER (offset or absolute)

+ 14 - 6
radicale/app/report.py

@@ -43,6 +43,9 @@ from radicale.app.base import Access, ApplicationBase
 from radicale.item import filter as radicale_filter
 from radicale.log import logger
 
+DT_FORMAT_TIMESTAMP: str = '%Y%m%dT%H%M%SZ'
+DT_FORMAT_DATE: str = '%Y%m%d'
+
 
 def free_busy_report(base_prefix: str, path: str, xml_request: Optional[ET.Element],
                      collection: storage.BaseCollection, encoding: str,
@@ -295,10 +298,10 @@ def xml_report(base_prefix: str, path: str, xml_request: Optional[ET.Element],
                             xmlutils.webdav_error("C:expand")
 
                     start = datetime.datetime.strptime(
-                        starts, '%Y%m%dT%H%M%SZ'
+                        starts, DT_FORMAT_TIMESTAMP
                     ).replace(tzinfo=datetime.timezone.utc)
                     end = datetime.datetime.strptime(
-                        ends, '%Y%m%dT%H%M%SZ'
+                        ends, DT_FORMAT_TIMESTAMP
                     ).replace(tzinfo=datetime.timezone.utc)
 
                     time_range_start = None
@@ -362,13 +365,13 @@ def _expand(
     # override instances.
     vevent_recurrence, vevents_overridden = _split_overridden_vevents(vevent_component)
 
-    dt_format = '%Y%m%dT%H%M%SZ'
+    dt_format = DT_FORMAT_TIMESTAMP
     all_day_event = False
 
     if type(vevent_recurrence.dtstart.value) is datetime.date:
         # If an event comes to us with a dtstart specified as a date
         # then in the response we return the date, not datetime
-        dt_format = '%Y%m%d'
+        dt_format = DT_FORMAT_DATE
         all_day_event = True
         # In case of dates, we need to remove timezone information since
         # rruleset.between computes with datetimes without timezone information
@@ -475,14 +478,19 @@ def _expand(
                     value=recurrence_id, params={}
                 )
                 _convert_to_utc(vevent, 'recurrence_id', dt_format)
+                suffix = ''
+                if (dt_format == DT_FORMAT_DATE):
+                    suffix = ';VALUE=DATE'
+                else:
+                    suffix = ''
                 vevent.dtstart = ContentLine(
-                    name='DTSTART',
+                    name='DTSTART' + suffix,
                     value=recurrence_id.strftime(dt_format), params={}
                 )
                 # if there is a DTEND, override it. Duration does not need changing
                 if hasattr(vevent, "dtend"):
                     vevent.dtend = ContentLine(
-                        name='DTEND',
+                        name='DTEND' + suffix,
                         value=(recurrence_id + duration).strftime(dt_format), params={}
                     )