Add time to some events
This commit is contained in:
parent
7c5c73d649
commit
6b6e038b67
|
@ -269,6 +269,10 @@ def get_us_holidays(input_date: date) -> list[Event]:
|
||||||
]
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def as_date(d: date | datetime) -> date:
|
||||||
|
return d.date() if isinstance(d, datetime) else d
|
||||||
|
|
||||||
|
|
||||||
def get_conferences(input_date: date, filepath: str) -> List[Event]:
|
def get_conferences(input_date: date, filepath: str) -> List[Event]:
|
||||||
"""Read conferences from a YAML file and return a list of Event objects."""
|
"""Read conferences from a YAML file and return a list of Event objects."""
|
||||||
with open(filepath, "r") as f:
|
with open(filepath, "r") as f:
|
||||||
|
@ -279,7 +283,7 @@ def get_conferences(input_date: date, filepath: str) -> List[Event]:
|
||||||
event_date = conf["start"]
|
event_date = conf["start"]
|
||||||
|
|
||||||
# Skip the conference if it is before the input date.
|
# Skip the conference if it is before the input date.
|
||||||
if event_date < input_date:
|
if as_date(event_date) < input_date:
|
||||||
continue
|
continue
|
||||||
event = Event(
|
event = Event(
|
||||||
name="conference",
|
name="conference",
|
||||||
|
@ -337,7 +341,7 @@ def get_accommodation(from_date: date, filepath: str) -> list[Event]:
|
||||||
)
|
)
|
||||||
from_date = item["from"]
|
from_date = item["from"]
|
||||||
to_date = item["to"]
|
to_date = item["to"]
|
||||||
nights = (to_date - from_date).days
|
nights = (to_date.date() - from_date.date()).days
|
||||||
night_str = f"{nights} nights" if nights != 1 else "1 night"
|
night_str = f"{nights} nights" if nights != 1 else "1 night"
|
||||||
checkin = Event(
|
checkin = Event(
|
||||||
date=from_date,
|
date=from_date,
|
||||||
|
@ -359,7 +363,7 @@ def get_travel(from_date: date, method: str, filepath: str) -> list[Event]:
|
||||||
"""Get travel events."""
|
"""Get travel events."""
|
||||||
return [
|
return [
|
||||||
Event(
|
Event(
|
||||||
date=item["depart"].date(),
|
date=item["depart"],
|
||||||
name="transport",
|
name="transport",
|
||||||
title=f'{method} from {item["from"]} to {item["to"]}',
|
title=f'{method} from {item["from"]} to {item["to"]}',
|
||||||
url=item.get("url"),
|
url=item.get("url"),
|
||||||
|
@ -441,7 +445,7 @@ def get_data(now: datetime) -> dict[str, str | object]:
|
||||||
)
|
)
|
||||||
events.append(next_up_series)
|
events.append(next_up_series)
|
||||||
|
|
||||||
events.sort(key=operator.attrgetter("date"))
|
events.sort(key=operator.attrgetter("as_datetime"))
|
||||||
|
|
||||||
reply["events"] = events
|
reply["events"] = events
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
"""Types."""
|
"""Types."""
|
||||||
|
|
||||||
import dataclasses
|
import dataclasses
|
||||||
from datetime import date
|
import datetime
|
||||||
|
from datetime import date, timezone
|
||||||
|
|
||||||
|
|
||||||
@dataclasses.dataclass
|
@dataclasses.dataclass
|
||||||
|
@ -9,6 +10,44 @@ class Event:
|
||||||
"""Event."""
|
"""Event."""
|
||||||
|
|
||||||
name: str
|
name: str
|
||||||
date: date
|
date: date | datetime.datetime
|
||||||
title: str | None = None
|
title: str | None = None
|
||||||
url: 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
|
||||||
|
)
|
||||||
|
|
||||||
|
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")
|
||||||
|
|
|
@ -52,7 +52,7 @@
|
||||||
{% for event in events %}
|
{% for event in events %}
|
||||||
<tr>
|
<tr>
|
||||||
<td class="text-end">
|
<td class="text-end">
|
||||||
{{event.date.strftime("%a, %d, %b %Y")}}
|
{{event.display_date}}
|
||||||
</td>
|
</td>
|
||||||
<td class="text-start {% if event.name in class_map %} {{ class_map[event.name]}}{% endif %}">
|
<td class="text-start {% if event.name in class_map %} {{ class_map[event.name]}}{% endif %}">
|
||||||
{% if event.url %}<a href="{{ event.url }}">{% endif %}
|
{% if event.url %}<a href="{{ event.url }}">{% endif %}
|
||||||
|
@ -61,7 +61,7 @@
|
||||||
{% if event.url %}</a>{% endif %}
|
{% if event.url %}</a>{% endif %}
|
||||||
</td>
|
</td>
|
||||||
<td class="text-end">
|
<td class="text-end">
|
||||||
{{ days(event.date) }}
|
{{ event.delta_days(today) }}
|
||||||
</td>
|
</td>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
</table>
|
</table>
|
||||||
|
|
19
web_view.py
19
web_view.py
|
@ -2,11 +2,10 @@
|
||||||
|
|
||||||
"""Web page to show upcoming events."""
|
"""Web page to show upcoming events."""
|
||||||
|
|
||||||
import functools
|
|
||||||
import inspect
|
import inspect
|
||||||
import sys
|
import sys
|
||||||
import traceback
|
import traceback
|
||||||
from datetime import date, datetime
|
from datetime import datetime
|
||||||
|
|
||||||
import flask
|
import flask
|
||||||
import werkzeug
|
import werkzeug
|
||||||
|
@ -45,27 +44,13 @@ def exception_handler(e: werkzeug.exceptions.InternalServerError) -> tuple[str,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
||||||
def delta_days(today: date, when: date) -> str:
|
|
||||||
"""Return number of days from today as a string."""
|
|
||||||
delta = (when - today).days
|
|
||||||
|
|
||||||
match delta:
|
|
||||||
case 0:
|
|
||||||
return "today"
|
|
||||||
case 1:
|
|
||||||
return "1 day"
|
|
||||||
case _:
|
|
||||||
return f"{delta:,d} days"
|
|
||||||
|
|
||||||
|
|
||||||
@app.route("/")
|
@app.route("/")
|
||||||
def index() -> str:
|
def index() -> str:
|
||||||
"""Index page."""
|
"""Index page."""
|
||||||
now = datetime.now()
|
now = datetime.now()
|
||||||
data = get_data(now)
|
data = get_data(now)
|
||||||
days = functools.partial(delta_days, now.date())
|
|
||||||
|
|
||||||
return flask.render_template("index.html", days=days, **data)
|
return flask.render_template("index.html", today=now.date(), **data)
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
Loading…
Reference in a new issue