import datetime
This commit is contained in:
parent
199eb82bce
commit
82de51109f
|
@ -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")
|
||||
|
|
Loading…
Reference in a new issue