Events are sorted by date

Closes: #16
This commit is contained in:
Edward Betts 2023-10-05 11:07:01 +01:00
parent 81d7d62620
commit e56cf111e8
3 changed files with 68 additions and 10 deletions

View file

@ -1,5 +1,6 @@
import configparser import configparser
import json import json
import operator
import os import os
import typing import typing
import warnings import warnings
@ -96,12 +97,12 @@ def next_uk_fathers_day(input_date: date) -> date:
return fathers_day return fathers_day
def get_next_timezone_transition(tz_name: str) -> datetime: def get_next_timezone_transition(tz_name: str) -> date:
"""Datetime of the next time the clocks change.""" """Datetime of the next time the clocks change."""
tz = pytz.timezone(tz_name) tz = pytz.timezone(tz_name)
dt = next(t for t in tz._utc_transition_times if t > now) dt = next(t for t in tz._utc_transition_times if t > now)
return typing.cast(datetime, dt) return typing.cast(date, dt.date())
def get_next_bank_holiday() -> dict[str, date | str]: def get_next_bank_holiday() -> dict[str, date | str]:
@ -276,9 +277,8 @@ def get_data() -> dict[str, str | object]:
"next_economist": next_economist(today), "next_economist": next_economist(today),
"bank_holiday": get_next_bank_holiday(), "bank_holiday": get_next_bank_holiday(),
"us_holiday": get_us_holiday(), "us_holiday": get_us_holiday(),
"next_uk_general_election": next_uk_general_election, # "next_uk_general_election": next_uk_general_election,
"next_us_presidential_election": next_us_presidential_election, "next_us_presidential_election": next_us_presidential_election,
# "spacex": spacexdata.get_next_spacex_launch(limit=20),
"stock_markets": stock_markets(), "stock_markets": stock_markets(),
"uk_clock_change": get_next_timezone_transition("Europe/London"), "uk_clock_change": get_next_timezone_transition("Europe/London"),
"us_clock_change": get_next_timezone_transition("America/New_York"), "us_clock_change": get_next_timezone_transition("America/New_York"),
@ -290,4 +290,24 @@ def get_data() -> dict[str, str | object]:
"rockets": thespacedevs.get_launches(rocket_dir, limit=40), "rockets": thespacedevs.get_launches(rocket_dir, limit=40),
} }
skip = {"now", "gbpusd", "rockets", "stock_markets", "xmas_last_posting_dates"}
events = []
for key, value in reply.items():
if key in skip:
continue
if "holiday" in key:
assert isinstance(value, dict)
event = value
event["name"] = key
else:
event = {"name": key, "date": value}
events.append(event)
for key, value in xmas_last_posting_dates.items():
events.append({"name": f"xmas_last_{key}", "date": value})
events.sort(key=operator.itemgetter("date"))
reply["events"] = events
return reply return reply

View file

@ -1,3 +1,5 @@
{# vim: set ft=htmljinja
#}
<!doctype html> <!doctype html>
<html lang="en"> <html lang="en">
<head> <head>
@ -7,6 +9,22 @@
<link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous"> <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.2/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-T3c6CoIi6uLrA9TneNEoa7RxnatzjcDSCmG1MXxSR1GAsXEV/Dwwykc2MPK8M2HN" crossorigin="anonymous">
</head> </head>
{% set event_labels = {
"next_economist": "The Economist",
"mothers_day": "Mothers' day",
"fathers_day": "Fathers' day",
"uk_financial_year_end": "End of financial year",
"bank_holiday": "UK bank holiday",
"us_holiday": "US holiday",
"uk_clock_change": "UK clock change",
"us_clock_change": "US clock change",
"next_us_presidential_election": "US pres. election",
"xmas_last_second": "Christmas last posting 2nd class",
"xmas_last_first": "Christmas last posting 1st class",
"xmas_day": "Christmas day",
}
%}
<body> <body>
<div class="container mt-2"> <div class="container mt-2">
@ -17,7 +35,7 @@
<li>GBPUSD: {{"{:,.3f}".format(gbpusd)}}</li> <li>GBPUSD: {{"{:,.3f}".format(gbpusd)}}</li>
{# <li>lock down: {# <li>lock down:
{{"{:.1f}".format(lockdown_days)}} days {{"{:.1f}".format(lockdown_days)}} days
({{"{:.2f}".format(lockdown_days / 7)}} weeks) so far</li> #} ({{"{:.2f}".format(lockdown_days / 7)}} weeks) so far</li>
<li>The Economist: {{days(next_economist)}} (Thursday)</li> <li>The Economist: {{days(next_economist)}} (Thursday)</li>
<li>Mothers' day: <li>Mothers' day:
@ -43,17 +61,17 @@
{{us_holiday["title"]}}</li> {{us_holiday["title"]}}</li>
<li>UK clock change: <li>UK clock change:
{{days(uk_clock_change.date())}} {{days(uk_clock_change)}}
{{uk_clock_change.strftime("%a, %d, %b %Y")}}</li> {{uk_clock_change.strftime("%a, %d, %b %Y")}}</li>
<li>US clock change: <li>US clock change:
{{days(us_clock_change.date())}} {{days(us_clock_change)}}
{{us_clock_change.strftime("%a, %d, %b %Y")}}</li> {{us_clock_change.strftime("%a, %d, %b %Y")}}</li>
{#
<li>general election: <li>general election:
{{days(next_uk_general_election)}} {{days(next_uk_general_election)}}
{{next_uk_general_election.strftime("%a, %d %b %Y")}}</li> #} {{next_uk_general_election.strftime("%a, %d %b %Y")}}</li>
<li>US pres. election: <li>US pres. election:
{{days(next_us_presidential_election)}} {{days(next_us_presidential_election)}}
{{next_us_presidential_election.strftime("%a, %d %b %Y")}}</li> {{next_us_presidential_election.strftime("%a, %d %b %Y")}}</li>
@ -70,9 +88,27 @@
{{days(xmas_day)}} {{days(xmas_day)}}
{{xmas_day.strftime("%a, %d %b %Y")}}</li> {{xmas_day.strftime("%a, %d %b %Y")}}</li>
#}
</ul> </ul>
<table class="table table-hover w-auto">
{% for event in events %}
<tr>
<td class="text-end">
{{event.date.strftime("%a, %d, %b %Y")}}
</td>
<td>
{{ event_labels[event.name] }}
{%- if "title" in event -%}: {{ event.title }}{% endif %}
</td>
<td class="text-end">
{{ days(event.date) }}
</td>
{% endfor %}
</table>
<h3>Stock markets</h3> <h3>Stock markets</h3>
{% for market in stock_markets %} {% for market in stock_markets %}
<p>{{ market }}</p> <p>{{ market }}</p>
@ -113,5 +149,7 @@
</table> </table>
</div> </div>
<pre>{{ events | pprint }}</pre>
</body> </body>
</html> </html>

View file

@ -25,7 +25,7 @@ def index() -> str:
return f"{delta.days:>5,d} days {delta.seconds // 3600:>2.0f} hours" return f"{delta.days:>5,d} days {delta.seconds // 3600:>2.0f} hours"
def days(when: date) -> str: def days(when: date) -> str:
return " today" if when == today else f"{(when - today).days:>5,d} days" return "today" if when == today else f"{(when - today).days:,d} days"
return render_template("index.html", days=days, days_hours=days_hours, **data) return render_template("index.html", days=days, days_hours=days_hours, **data)