From fcf935271ca0807f54cd6c63042479ade656e544 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Tue, 18 Jun 2024 06:51:45 +0100 Subject: [PATCH] Market display filter Closes: #158 Closes: #150 --- agenda/data.py | 33 ++++++++++++++++++++++++--------- templates/index.html | 7 +++++++ web_view.py | 18 ++++++++++++++++-- 3 files changed, 47 insertions(+), 11 deletions(-) diff --git a/agenda/data.py b/agenda/data.py index 056f508..b64ed9f 100644 --- a/agenda/data.py +++ b/agenda/data.py @@ -35,7 +35,7 @@ from . import ( uk_holiday, waste_schedule, ) -from .types import Event +from .types import Event, StrDict here = dateutil.tz.tzlocal() @@ -128,9 +128,27 @@ def hide_markets_while_away( events.remove(market) -async def get_data( - now: datetime, config: flask.config.Config -) -> typing.Mapping[str, str | object]: +class AgendaData(typing.TypedDict, total=False): + """Agenda Data.""" + + now: datetime + stock_markets: list[str] + rockets: list[thespacedevs.Summary] + gwr_advance_tickets: date | None + data_gather_seconds: float + stock_market_times_seconds: float + timings: list[tuple[str, float]] + events: list[Event] + accommodation_events: list[Event] + gaps: list[StrDict] + sunrise: datetime + sunset: datetime + last_week: date + two_weeks_ago: date + errors: list[tuple[str, Exception]] + + +async def get_data(now: datetime, config: flask.config.Config) -> AgendaData: """Get data to display on agenda dashboard.""" data_dir = config["DATA_DIR"] @@ -176,7 +194,7 @@ async def get_data( stock_market_times = stock_market.open_and_close() stock_market_times_seconds = time() - t0 - reply: dict[str, typing.Any] = { + reply: AgendaData = { "now": now, "stock_markets": stock_market_times, "rockets": rockets, @@ -228,9 +246,6 @@ async def get_data( events += hn.whoishiring(last_year, next_year) events += carnival.rio_carnival_events(last_year, next_year) - if config["HIDE_MARKETS_WHILE_AWAY"]: - hide_markets_while_away(events, accommodation_events) - for launch in rockets: dt = None @@ -281,10 +296,10 @@ async def get_data( reply["sunrise"] = sun.sunrise(observer) reply["sunset"] = sun.sunset(observer) reply["events"] = events + reply["accommodation_events"] = accommodation_events reply["last_week"] = last_week reply["two_weeks_ago"] = two_weeks_ago - reply["fullcalendar_events"] = calendar.build_events(events) reply["errors"] = errors return reply diff --git a/templates/index.html b/templates/index.html index 9b719a3..bed0a9f 100644 --- a/templates/index.html +++ b/templates/index.html @@ -144,6 +144,13 @@

Agenda

+
+ Markets: + Hide while away + | Show all + | Hide all +
+ {% for event in events if event.as_date >= two_weeks_ago %} {% if loop.first or event.date.year != loop.previtem.date.year or event.date.month != loop.previtem.date.month %}
diff --git a/web_view.py b/web_view.py index 8c81927..d2f8a2b 100755 --- a/web_view.py +++ b/web_view.py @@ -23,7 +23,7 @@ import agenda.fx import agenda.holidays import agenda.thespacedevs import agenda.trip -from agenda import format_list_with_ampersand, travel, uk_tz +from agenda import calendar, format_list_with_ampersand, travel, uk_tz from agenda.types import StrDict, Trip app = flask.Flask(__name__) @@ -72,7 +72,21 @@ async def index() -> str: now = datetime.now() data = await agenda.data.get_data(now, app.config) - return flask.render_template("index.html", today=now.date(), **data) + events = data.pop("events") + + markets_arg = flask.request.args.get("markets") + if markets_arg == "hide": + events = [e for e in events if e.name != "market"] + if markets_arg != "show": + agenda.data.hide_markets_while_away(events, data["accommodation_events"]) + + return flask.render_template( + "index.html", + today=now.date(), + events=events, + fullcalendar_events=calendar.build_events(events), + **data, + ) @app.route("/launches")