1from datetime import date, datetime
2from typing import Any, ClassVar
3
4from icalendar.compatibility import Self
5from icalendar.error import JCalParsingError
6from icalendar.parser import Parameters
7from icalendar.parser_tools import from_unicode
8
9from .base import TimeBase
10from .types import vDDDTypes
11
12
13class vDDDLists:
14 """A list of vDDDTypes values."""
15
16 default_value: ClassVar[str] = "DATE-TIME"
17 params: Parameters
18 dts: list[vDDDTypes]
19
20 def __init__(self, dt_list, params: dict[str, Any] | None = None):
21 if params is None:
22 params = {}
23 if not hasattr(dt_list, "__iter__"):
24 dt_list = [dt_list]
25 vddd = []
26 tzid = None
27 for dt_l in dt_list:
28 dt = vDDDTypes(dt_l) if not isinstance(dt_l, vDDDTypes) else dt_l
29 vddd.append(dt)
30 if "TZID" in dt.params:
31 tzid = dt.params["TZID"]
32
33 if tzid:
34 # NOTE: no support for multiple timezones here!
35 params["TZID"] = tzid
36 self.params = Parameters(params)
37 self.dts = vddd
38
39 def to_ical(self):
40 dts_ical = (from_unicode(dt.to_ical()) for dt in self.dts)
41 return b",".join(dts_ical)
42
43 @staticmethod
44 def from_ical(ical, timezone=None):
45 out = []
46 ical_dates = ical.split(",")
47 for ical_dt in ical_dates:
48 out.append(vDDDTypes.from_ical(ical_dt, timezone=timezone))
49 return out
50
51 def __eq__(self, other):
52 if isinstance(other, vDDDLists):
53 return self.dts == other.dts
54 if isinstance(other, (TimeBase, date)):
55 return self.dts == [other]
56 return False
57
58 def __repr__(self):
59 """String representation."""
60 return f"{self.__class__.__name__}({self.dts})"
61
62 @classmethod
63 def examples(cls) -> list[Self]:
64 """Examples of vDDDLists."""
65 return [vDDDLists([datetime(2025, 11, 10, 16, 50)])]
66
67 def to_jcal(self, name: str) -> list:
68 """The jCal representation of this property according to :rfc:`7265`."""
69 return [
70 name,
71 self.params.to_jcal(),
72 self.VALUE.lower(),
73 *[dt.to_jcal(name)[3] for dt in self.dts],
74 ]
75
76 def _get_value(self) -> str | None:
77 return None if not self.dts else self.dts[0].VALUE
78
79 from icalendar.param import VALUE
80
81 @classmethod
82 def from_jcal(cls, jcal_property: list) -> Self:
83 """Parse jCal from :rfc:`7265`.
84
85 Parameters:
86 jcal_property: The jCal property to parse.
87
88 Raises:
89 ~error.JCalParsingError: If the jCal provided is invalid.
90 """
91 JCalParsingError.validate_property(jcal_property, cls)
92 values = jcal_property[3:]
93 prop = jcal_property[:3]
94 dts = []
95 for value in values:
96 dts.append(vDDDTypes.from_jcal(prop + [value]))
97 return cls(
98 dts,
99 params=Parameters.from_jcal_property(jcal_property),
100 )
101
102 __hash__ = None
103
104
105__all__ = ["vDDDLists"]