Gap page to show trips

Closes: #90
Closes: #97
This commit is contained in:
Edward Betts 2024-01-23 15:58:01 +00:00
parent d6ebd86232
commit 6c1c638104
3 changed files with 66 additions and 7 deletions

View file

@ -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]: