Source code for icalendar.prop.dt.list

from collections.abc import Sequence
from datetime import date, datetime
from typing import Any, ClassVar

from icalendar.compatibility import Self
from icalendar.error import JCalParsingError
from icalendar.parser import Parameters
from icalendar.parser_tools import from_unicode

from .base import TimeBase
from .types import vDDDTypes


[docs] class vDDDLists: """A list of vDDDTypes values.""" default_value: ClassVar[str] = "DATE-TIME" params: Parameters dts: list[vDDDTypes] def __init__(self, dt_list, params: dict[str, Any] | None = None): if params is None: params = {} if not hasattr(dt_list, "__iter__") or ( isinstance(dt_list, Sequence) and len(dt_list) == 2 and dt_list[1] is None ): # A ``(dt, None)`` pair (tuple or list) is the rdates form of a single # date, not a list of two values, so don't iterate it element-wise (#1439). dt_list = [dt_list] vddd = [] tzid = None for dt_l in dt_list: dt = vDDDTypes(dt_l) if not isinstance(dt_l, vDDDTypes) else dt_l vddd.append(dt) if "TZID" in dt.params: tzid = dt.params["TZID"] if tzid: # NOTE: no support for multiple timezones here! params["TZID"] = tzid self.params = Parameters(params) self.dts = vddd
[docs] def to_ical(self): dts_ical = (from_unicode(dt.to_ical()) for dt in self.dts) return b",".join(dts_ical)
[docs] @staticmethod def from_ical(ical, timezone=None): out = [] ical_dates = ical.split(",") for ical_dt in ical_dates: out.append(vDDDTypes.from_ical(ical_dt, timezone=timezone)) return out
def __eq__(self, other): if isinstance(other, vDDDLists): return self.dts == other.dts if isinstance(other, (TimeBase, date)): return self.dts == [other] return False def __repr__(self): """String representation.""" return f"{self.__class__.__name__}({self.dts})"
[docs] @classmethod def examples(cls) -> list[Self]: """Examples of vDDDLists.""" return [vDDDLists([datetime(2025, 11, 10, 16, 50)])]
[docs] def to_jcal(self, name: str) -> list: """The jCal representation of this property according to :rfc:`7265`.""" return [ name, self.params.to_jcal(), self.VALUE.lower(), *[dt.to_jcal(name)[3] for dt in self.dts], ]
def _get_value(self) -> str | None: return None if not self.dts else self.dts[0].VALUE from icalendar.param import VALUE
[docs] @classmethod def from_jcal(cls, jcal_property: list) -> Self: """Parse jCal from :rfc:`7265`. Parameters: jcal_property: The jCal property to parse. Raises: ~error.JCalParsingError: If the jCal provided is invalid. """ JCalParsingError.validate_property(jcal_property, cls) values = jcal_property[3:] prop = jcal_property[:3] dts = [] for value in values: dts.append(vDDDTypes.from_jcal(prop + [value])) return cls( dts, params=Parameters.from_jcal_property(jcal_property), )
__hash__ = None
__all__ = ["vDDDLists"]