diff --git a/aleksis/core/util/core_helpers.py b/aleksis/core/util/core_helpers.py index a041fa79751a9574924190165ea371d8ecdda948..154d87ca2347be7d01a35d9bf49dfb6f5166ff1c 100644 --- a/aleksis/core/util/core_helpers.py +++ b/aleksis/core/util/core_helpers.py @@ -533,6 +533,9 @@ class ExtendedICal20Feed(feedgenerator.ICal20Feed): cal, with_meta=with_meta, with_reference_object=with_reference_object, params=params ) + if params is not None and "VTIMEZONE" in params and params["VTIMEZONE"]: + cal.add_missing_timezones() + return cal def to_ical(self, params: Optional[dict[str, any]] = None): diff --git a/aleksis/core/util/dav_handler/calendar.py b/aleksis/core/util/dav_handler/calendar.py index 4e80905a071e24c25efe421ae89ba866dcd1a9d2..74638bf2e777be7070b31e1d95f97ba147dc3a95 100644 --- a/aleksis/core/util/dav_handler/calendar.py +++ b/aleksis/core/util/dav_handler/calendar.py @@ -81,7 +81,7 @@ class CalDAVProp(ElementHandler): def pre_handle(self): calendar_data = self._get_calendar_data(self.parent.parent) - comp_name = self.parent.attrs.get("name") + comp_name = self.parent.attrs.get((None, "name")) prop = self.attrs.get((None, "name")) calendar_data.params.setdefault(comp_name, []).append(prop) @@ -103,11 +103,18 @@ class CalDAVComp(ElementHandler): name = "{urn:ietf:params:xml:ns:caldav}comp" invisible = True + @classmethod + def get_name(cls, attrs): + name = attrs.get((None, "name")) + return f"{cls.name}-{name}" + def pre_handle(self): - if self.attrs.get("name") == "VCALENDAR": - attrs = {"name": "VEVENT"} - vevent = CalDAVComp(self.request, self, attrs) - self.children[CalDAVComp.name] = vevent + if self.attrs.get((None, "name")) == "VCALENDAR": + self.children = {} + self.parent.params["VTIMEZONE"] = False + + elif self.attrs.get((None, "name")) == "VTIMEZONE": + self.parent.parent.params["VTIMEZONE"] = True class CalendarData(ElementHandler): @@ -116,10 +123,17 @@ class CalendarData(ElementHandler): def pre_handle(self): self.params = {} - attrs = {"name": "VCALENDAR"} + attrs = {(None, "name"): "VCALENDAR"} vcalendar = CalDAVComp(self.request, self, attrs) self.children[CalDAVComp.name] = vcalendar + self.params["VTIMEZONE"] = True + + for comp_name in ("VTIMEZONE", "VEVENT"): + attrs = {(None, "name"): comp_name} + comp = CalDAVComp(self.request, self, attrs) + vcalendar.children[CalDAVComp.name] = comp + def process_xml(self, base, response): super().process_xml(base, response) if not self.invisible: