From 73d8f7eb47a867c81b99cfa297833de417c57bc3 Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Tue, 23 Jan 2024 15:58:01 +0000 Subject: [PATCH] Gap page to show trips Closes: #90, #97 --- agenda/data.py | 44 +++++++++++++++++++++++++++++++++++++++++--- templates/gaps.html | 24 ++++++++++++++++++++++-- web_view.py | 5 +++-- 3 files changed, 66 insertions(+), 7 deletions(-) diff --git a/agenda/data.py b/agenda/data.py index 1cb891f..23dd6e1 100644 --- a/agenda/data.py +++ b/agenda/data.py @@ -37,7 +37,7 @@ from . import ( uk_tz, waste_schedule, ) -from .types import Event, StrDict +from .types import Event, StrDict, Trip here = dateutil.tz.tzlocal() @@ -144,10 +144,14 @@ def get_yaml_event_end_date_field(item: dict[str, str]) -> str: ) -def read_events_yaml(data_dir: str, start: date, end: date) -> list[Event]: +def read_events_yaml( + data_dir: str, start: date, end: date, skip_trips: bool = False +) -> list[Event]: """Read eventes from YAML file.""" events: list[Event] = [] for item in yaml.safe_load(open(os.path.join(data_dir, "events.yaml"))): + if "trip" in item and skip_trips: + continue duration = ( isodate.parse_duration(item["duration"]) if "duration" in item else None ) @@ -247,10 +251,10 @@ def busy_event(e: Event) -> bool: "event", "accommodation", "conference", - "dodainville", "transport", "meetup", "party", + "trip", }: return False @@ -281,6 +285,40 @@ async def time_function( return name, result, end_time - start_time +def gap_list( + today: date, config: flask.config.Config, trips: list[Trip] +) -> list[StrDict]: + last_year = today - timedelta(days=365) + next_year = today + timedelta(days=2 * 365) + + my_data = config["PERSONAL_DATA"] + events = read_events_yaml(my_data, last_year, next_year, skip_trips=True) + + for trip in trips: + event_type = "trip" + if trip.events and not trip.conferences: + event_type = trip.events[0]["name"] + elif len(trip.conferences) == 1 and trip.conferences[0].get("hackathon"): + event_type = "hackathon" + events.append( + Event( + name=event_type, + title=trip.title + " " + trip.country_flags, + date=trip.start, + end_date=trip.end, + url=flask.url_for("trip_page", start=trip.start.isoformat()), + ) + ) + + busy_events = [ + e + for e in sorted(events, key=lambda e: e.as_date) + if e.as_date > today and e.as_date < next_year and busy_event(e) + ] + + return find_gaps(busy_events) + + async def get_data( now: datetime, config: flask.config.Config ) -> typing.Mapping[str, str | object]: diff --git a/templates/gaps.html b/templates/gaps.html index ae24883..7cb7fbf 100644 --- a/templates/gaps.html +++ b/templates/gaps.html @@ -17,11 +17,31 @@ {% for gap in gaps %} - {% for event in gap.before %}{% if not loop.first %}
{% endif %}{{ event.title or event.name }}{% endfor %} + + {% for event in gap.before %} +
+ {% if event.url %} + {{ event.title_with_emoji }} + {% else %} + {{ event.title_with_emoji }} + {% endif %} +
+ {% endfor %} + {{ gap.start.strftime("%A, %-d %b %Y") }} {{ (gap.end - gap.start).days }} days {{ gap.end.strftime("%A, %-d %b %Y") }} - {% for event in gap.after %}{% if not loop.first %}
{% endif %}{{ event.title or event.name }}{% endfor %} + + {% for event in gap.after %} +
+ {% if event.url %} + {{ event.title_with_emoji }} + {% else %} + {{ event.title_with_emoji }} + {% endif %} +
+ {% endfor %} + {% endfor %} diff --git a/web_view.py b/web_view.py index 16aa6d7..9d72286 100755 --- a/web_view.py +++ b/web_view.py @@ -86,8 +86,9 @@ def launch_list() -> str: async def gaps_page() -> str: """List of available gaps.""" now = datetime.now() - data = await agenda.data.get_data(now, app.config) - return flask.render_template("gaps.html", today=now.date(), gaps=data["gaps"]) + trip_list = agenda.trip.build_trip_list() + gaps = agenda.data.gap_list(now.date(), app.config, trip_list) + return flask.render_template("gaps.html", today=now.date(), gaps=gaps) @app.route("/travel")