From 82de51109f5ccc705e6c05c9f9501fb8eded55ff Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Wed, 10 Jan 2024 13:06:29 +0000 Subject: [PATCH] import datetime --- agenda/types.py | 65 +++++++++++++++++++++++++++++-------------------- 1 file changed, 38 insertions(+), 27 deletions(-) diff --git a/agenda/types.py b/agenda/types.py index 1e0ba44..293e977 100644 --- a/agenda/types.py +++ b/agenda/types.py @@ -1,8 +1,8 @@ """Types.""" +import datetime import typing from dataclasses import dataclass, field -from datetime import date, datetime, timezone from pycountry.db import Country @@ -10,13 +10,14 @@ import agenda from agenda import format_list_with_ampersand StrDict = dict[str, typing.Any] +DateOrDateTime = datetime.datetime | datetime.date -def as_date(d: datetime | date) -> date: +def as_date(d: DateOrDateTime) -> datetime.date: """Convert datetime to date.""" - if isinstance(d, datetime): + if isinstance(d, datetime.datetime): return d.date() - assert isinstance(d, date) + assert isinstance(d, datetime.date) return d @@ -24,7 +25,7 @@ def as_date(d: datetime | date) -> date: class Trip: """Trip.""" - start: date + start: datetime.date travel: list[StrDict] = field(default_factory=list) accommodation: list[StrDict] = field(default_factory=list) conferences: list[StrDict] = field(default_factory=list) @@ -38,21 +39,21 @@ class Trip: ) @property - def end(self) -> date | None: + def end(self) -> datetime.date | None: """End date for trip.""" max_conference_end = ( max(as_date(item["end"]) for item in self.conferences) if self.conferences - else date.min + else datetime.date.min ) - assert isinstance(max_conference_end, date) + assert isinstance(max_conference_end, datetime.date) arrive = [item["arrive"].date() for item in self.travel if "arrive" in item] - travel_end = max(arrive) if arrive else date.min - assert isinstance(travel_end, date) + travel_end = max(arrive) if arrive else datetime.date.min + assert isinstance(travel_end, datetime.date) max_date = max(max_conference_end, travel_end) - return max_date if max_date != date.min else None + return max_date if max_date != datetime.date.min else None @property def countries(self) -> list[Country]: @@ -85,7 +86,7 @@ class Holiday: name: str country: str - date: date + date: datetime.date @dataclass @@ -93,40 +94,42 @@ class Event: """Event.""" name: str - date: date | datetime - end_date: date | datetime | None = None + date: DateOrDateTime + end_date: DateOrDateTime | None = None title: str | None = None url: str | None = None going: bool | None = None @property - def as_datetime(self) -> datetime: + def as_datetime(self) -> datetime.datetime: """Date/time of event.""" d = self.date - t0 = datetime.min.time() + t0 = datetime.datetime.min.time() return ( d - if isinstance(d, datetime) - else datetime.combine(d, t0).replace(tzinfo=timezone.utc) + if isinstance(d, datetime.datetime) + else datetime.datetime.combine(d, t0).replace(tzinfo=datetime.timezone.utc) ) @property def has_time(self) -> bool: """Event has a time associated with it.""" - return isinstance(self.date, datetime) + return isinstance(self.date, datetime.datetime) @property - def as_date(self) -> date: + def as_date(self) -> datetime.date: """Date of event.""" - return self.date.date() if isinstance(self.date, datetime) else self.date + return ( + self.date.date() if isinstance(self.date, datetime.datetime) else self.date + ) @property - def end_as_date(self) -> date: + def end_as_date(self) -> datetime.date: """Date of event.""" return ( ( self.end_date.date() - if isinstance(self.end_date, datetime) + if isinstance(self.end_date, datetime.datetime) else self.end_date ) if self.end_date @@ -136,14 +139,22 @@ class Event: @property def display_time(self) -> str | None: """Time for display on web page.""" - return self.date.strftime("%H:%M") if isinstance(self.date, datetime) else None + return ( + self.date.strftime("%H:%M") + if isinstance(self.date, datetime.datetime) + else None + ) @property def display_timezone(self) -> str | None: """Timezone for display on web page.""" - return self.date.strftime("%z") if isinstance(self.date, datetime) else None + return ( + self.date.strftime("%z") + if isinstance(self.date, datetime.datetime) + else None + ) - def delta_days(self, today: date) -> str: + def delta_days(self, today: datetime.date) -> str: """Return number of days from today as a string.""" delta = (self.as_date - today).days @@ -158,7 +169,7 @@ class Event: @property def display_date(self) -> str: """Date for display on web page.""" - if isinstance(self.date, datetime): + if isinstance(self.date, datetime.datetime): return self.date.strftime("%a, %d, %b %Y %H:%M %z") else: return self.date.strftime("%a, %d, %b %Y")