72 lines
1.9 KiB
Python
72 lines
1.9 KiB
Python
"""Types."""
|
|
|
|
import dataclasses
|
|
import datetime
|
|
from datetime import date, timezone
|
|
|
|
|
|
@dataclasses.dataclass
|
|
class Event:
|
|
"""Event."""
|
|
|
|
name: str
|
|
date: date | datetime.datetime
|
|
title: str | None = None
|
|
url: str | None = None
|
|
|
|
@property
|
|
def as_datetime(self) -> datetime.datetime:
|
|
"""Date/time of event."""
|
|
d = self.date
|
|
t0 = datetime.datetime.min.time()
|
|
return (
|
|
d
|
|
if isinstance(d, datetime.datetime)
|
|
else datetime.datetime.combine(d, t0).replace(tzinfo=timezone.utc)
|
|
)
|
|
|
|
@property
|
|
def as_date(self) -> datetime.date:
|
|
"""Date of event."""
|
|
return (
|
|
self.date.date() if isinstance(self.date, datetime.datetime) else self.date
|
|
)
|
|
|
|
@property
|
|
def display_time(self) -> str | None:
|
|
"""Time for display on web page."""
|
|
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.datetime)
|
|
else None
|
|
)
|
|
|
|
def delta_days(self, today: datetime.date) -> str:
|
|
"""Return number of days from today as a string."""
|
|
delta = (self.as_date - today).days
|
|
|
|
match delta:
|
|
case 0:
|
|
return "today"
|
|
case 1:
|
|
return "1 day"
|
|
case _:
|
|
return f"{delta:,d} days"
|
|
|
|
@property
|
|
def display_date(self) -> str:
|
|
"""Date for display on web page."""
|
|
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")
|