Add trips page
Creating a new entity called a trip. This will group together any travel accommodation and conferences that happen together on one trip. A trip is assumed to start when leaving home and finish when returning home. The start date of a trip in is the trip ID. The date is written in ISO format. This assumes there cannot be multiple trips one one day. This assumption might be wrong, for example a morning day trip by rail, then another trip starts in the afternoon. I can change my choice of using dates as trip IDs if that happens. Sometimes during the planning of a trip the start date is unknown. For now we make up a start date, we can always change it later. If we use the start date in URLs then the URLs will change. Might need to keep a file of redirects, or could think of a different style of identifier. Trip ID have been added to accommodation, conferences, trains and flights. Later there will be a trips.yaml with notes about each trip.
This commit is contained in:
parent
5786e3d575
commit
ce9faa654f
10 changed files with 234 additions and 120 deletions
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
from datetime import date, datetime, time
|
||||
|
||||
import pycountry
|
||||
import pytz
|
||||
|
||||
uk_tz = pytz.timezone("Europe/London")
|
||||
|
|
@ -10,3 +11,23 @@ uk_tz = pytz.timezone("Europe/London")
|
|||
def uk_time(d: date, t: time) -> datetime:
|
||||
"""Combine time and date for UK timezone."""
|
||||
return uk_tz.localize(datetime.combine(d, t))
|
||||
|
||||
|
||||
def format_list_with_ampersand(items: list[str]) -> str:
|
||||
"""Join a list of strings with commas and an ampersand."""
|
||||
if len(items) > 1:
|
||||
return ", ".join(items[:-1]) + " & " + items[-1]
|
||||
elif items:
|
||||
return items[0]
|
||||
return ""
|
||||
|
||||
|
||||
def get_country(alpha_2: str) -> pycountry.db.Country | None:
|
||||
"""Lookup country by alpha-2 country code."""
|
||||
if not alpha_2:
|
||||
return None
|
||||
if alpha_2 == "xk":
|
||||
return pycountry.db.Country(flag="\U0001F1FD\U0001F1F0", name="Kosovo")
|
||||
|
||||
country: pycountry.db.Country = pycountry.countries.get(alpha_2=alpha_2.upper())
|
||||
return country
|
||||
|
|
|
|||
|
|
@ -18,6 +18,7 @@ class Conference:
|
|||
location: str
|
||||
start: date | datetime
|
||||
end: date | datetime
|
||||
trip: date | None = None
|
||||
country: str | None = None
|
||||
venue: str | None = None
|
||||
address: str | None = None
|
||||
|
|
|
|||
|
|
@ -36,9 +36,7 @@ from . import (
|
|||
uk_tz,
|
||||
waste_schedule,
|
||||
)
|
||||
from .types import Event, Holiday
|
||||
|
||||
StrDict = dict[str, typing.Any]
|
||||
from .types import Event, Holiday, StrDict
|
||||
|
||||
here = dateutil.tz.tzlocal()
|
||||
|
||||
|
|
|
|||
|
|
@ -2,6 +2,53 @@
|
|||
|
||||
import dataclasses
|
||||
import datetime
|
||||
import typing
|
||||
|
||||
from pycountry.db import Country
|
||||
|
||||
import agenda
|
||||
from agenda import format_list_with_ampersand
|
||||
|
||||
StrDict = dict[str, typing.Any]
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
class Trip:
|
||||
"""Trip."""
|
||||
|
||||
date: datetime.date
|
||||
travel: list[StrDict] = dataclasses.field(default_factory=list)
|
||||
accommodation: list[StrDict] = dataclasses.field(default_factory=list)
|
||||
conferences: list[StrDict] = dataclasses.field(default_factory=list)
|
||||
|
||||
@property
|
||||
def title(self) -> str:
|
||||
"""Trip title."""
|
||||
names = (
|
||||
format_list_with_ampersand([conf["name"] for conf in self.conferences])
|
||||
or "[no conferences in trip]"
|
||||
)
|
||||
return f'{names} ({self.date.strftime("%b %Y")})'
|
||||
|
||||
@property
|
||||
def countries(self) -> set[Country]:
|
||||
"""Trip countries."""
|
||||
found: set[Country] = set()
|
||||
for item in self.conferences + self.accommodation:
|
||||
if "country" not in item:
|
||||
continue
|
||||
country = agenda.get_country(item["country"])
|
||||
assert country
|
||||
found.add(country)
|
||||
|
||||
return found
|
||||
|
||||
@property
|
||||
def countries_str(self) -> str:
|
||||
"""List of countries visited on this trip."""
|
||||
return format_list_with_ampersand(
|
||||
[f"{c.flag} {c.name}" for c in self.countries]
|
||||
)
|
||||
|
||||
|
||||
@dataclasses.dataclass
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue