mirror of
https://github.com/Kozea/Radicale.git
synced 2025-08-01 18:18:31 +00:00
commit
5fe9f331e1
2 changed files with 15 additions and 6 deletions
|
@ -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)
|
||||||
|
|
|
@ -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={}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue