Accommodation must be within 5km of conference

This commit is contained in:
Edward Betts 2025-10-30 17:30:27 +00:00
parent 623e20c273
commit 4143190a8a

View file

@ -4,9 +4,11 @@
import os
import sys
import typing
from datetime import date, timedelta, datetime
from datetime import date, datetime, timedelta
from typing import Tuple, TypeVar
import yaml
from geopy.distance import distance
from rich.pretty import pprint
import agenda
@ -32,6 +34,29 @@ def check_currency(item: agenda.types.StrDict) -> None:
sys.exit(-1)
def get_coords(item):
if "latitude" in item and "longitude" in item:
return (item["latitude"], item["longitude"])
else:
return None
T = TypeVar("T")
def remove_nones(items: list[T | None]) -> list[T]:
"""Return a new list with None values removed."""
return [item for item in items if item is not None]
LatLon = Tuple[float, float]
def distance_km(a: LatLon, b: LatLon) -> float:
"""Return the great-circle distance between two (lat, lon) points in km."""
return distance(a, b).km
def check_trips() -> None:
"""Check trips and ensure they are in chronological order."""
filepath = os.path.join(data_dir, "trips.yaml")
@ -42,12 +67,14 @@ def check_trips() -> None:
for trip_data in trips_data:
current_trip = normalize_datetime(trip_data["trip"])
if prev_trip and current_trip < prev_trip:
print(f"Out of order trip found:")
print("Out of order trip found:")
print(
f" Previous: {prev_trip_data.get('trip')} - {prev_trip_data.get('name', 'No name')}"
f" Previous: {prev_trip_data.get('trip')} - "
+ f"{prev_trip_data.get('name', 'No name')}"
)
print(
f" Current: {trip_data.get('trip')} - {trip_data.get('name', 'No name')}"
f" Current: {trip_data.get('trip')} - "
+ f"{trip_data.get('name', 'No name')}"
)
assert False, "Trips are not in chronological order by trip date."
prev_trip = current_trip
@ -56,6 +83,16 @@ def check_trips() -> None:
trip_list = agenda.trip.build_trip_list(data_dir)
print(len(trip_list), "trips")
for trip in trip_list:
if not trip.accommodation or not trip.conferences:
continue
accommodation_coords = remove_nones([get_coords(a) for a in trip.accommodation])
conference_coords = remove_nones([get_coords(c) for c in trip.conferences])
if len(accommodation_coords) != 1 or len(conference_coords) != 1:
continue
dist = distance_km(conference_coords[0], accommodation_coords[0])
assert dist < 5.0
coords, routes = agenda.trip.get_coordinates_and_routes(trip_list, data_dir)
print(len(coords), "coords")
print(len(routes), "routes")