1
0
Fork 0
mirror of https://github.com/Kozea/Radicale.git synced 2025-08-01 18:18:31 +00:00

Merge pull request #1833 from pbiering/fix-1827

Fix 1827
This commit is contained in:
Peter Bieringer 2025-07-21 19:47:41 +02:00 committed by GitHub
commit 5fe9f331e1
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 15 additions and 6 deletions

View file

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

View file

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