From a92debea5b18427071125722d8a11ba02df436cd Mon Sep 17 00:00:00 2001 From: Edward Betts Date: Wed, 16 Jul 2025 04:09:29 +0200 Subject: [PATCH] Fix same-day flight location tracking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When multiple flights arrived on the same date, location tracking only compared dates and missed later flights. Now compares both date and time to handle same-day connecting flights correctly. Example: Nov 21, 2023 - 06:15: Arrive Madrid (MVD → MAD) - 09:15: Arrive London (MAD → LHR) ← Now properly detected as most recent This ensures users show as "home" when they've returned to UK on the same day as an international connection. 🤖 Generated with [Claude Code](https://claude.ai/code) Co-Authored-By: Claude --- agenda/busy.py | 59 +++++++++++++++++++++++++++++----------------- tests/test_busy.py | 21 +++++++++++++---- 2 files changed, 53 insertions(+), 27 deletions(-) diff --git a/agenda/busy.py b/agenda/busy.py index 91233ad..2def1de 100644 --- a/agenda/busy.py +++ b/agenda/busy.py @@ -82,10 +82,10 @@ def get_busy_events( def get_location_for_date( - target_date: date, - trips: list[Trip], + target_date: date, + trips: list[Trip], bookings: list[dict], - accommodations: list[dict], + accommodations: list[dict], airports: dict ) -> tuple[str, pycountry.db.Country | None]: """Get location (city, country) for a specific date using travel history.""" @@ -101,24 +101,30 @@ def get_location_for_date( trip_most_recent_location = None # Check flights within trip period + trip_most_recent_datetime = None for booking in bookings: for flight in booking.get("flights", []): if "arrive" in flight: - arrive_date = flight["arrive"] - if hasattr(arrive_date, "date"): - arrive_date = arrive_date.date() - elif isinstance(arrive_date, str): - arrive_date = datetime.fromisoformat( - arrive_date.replace("Z", "+00:00") - ).date() + arrive_datetime_obj = flight["arrive"] + if hasattr(arrive_datetime_obj, "date"): + arrive_datetime = arrive_datetime_obj + arrive_date = arrive_datetime_obj.date() + elif isinstance(arrive_datetime_obj, str): + arrive_datetime = datetime.fromisoformat( + arrive_datetime_obj.replace("Z", "+00:00") + ) + arrive_date = arrive_datetime.date() # Only consider flights within this trip and before target date if trip.start <= arrive_date <= target_date: - if ( - trip_most_recent_date is None - or arrive_date > trip_most_recent_date - ): + # Compare both date and time to handle same-day flights correctly + if (trip_most_recent_date is None or + arrive_date > trip_most_recent_date or + (arrive_date == trip_most_recent_date and + (trip_most_recent_datetime is None or arrive_datetime > trip_most_recent_datetime))): + trip_most_recent_date = arrive_date + trip_most_recent_datetime = arrive_datetime destination_airport = flight["to"] if destination_airport in uk_airports: @@ -189,20 +195,29 @@ def get_location_for_date( most_recent_date = None # Check flights + most_recent_datetime = None for booking in bookings: for flight in booking.get("flights", []): if "arrive" in flight: - arrive_date = flight["arrive"] - if hasattr(arrive_date, "date"): - arrive_date = arrive_date.date() - elif isinstance(arrive_date, str): - arrive_date = datetime.fromisoformat( - arrive_date.replace("Z", "+00:00") - ).date() + arrive_datetime_obj = flight["arrive"] + if hasattr(arrive_datetime_obj, "date"): + arrive_datetime = arrive_datetime_obj + arrive_date = arrive_datetime_obj.date() + elif isinstance(arrive_datetime_obj, str): + arrive_datetime = datetime.fromisoformat( + arrive_datetime_obj.replace("Z", "+00:00") + ) + arrive_date = arrive_datetime.date() if arrive_date <= target_date: - if most_recent_date is None or arrive_date > most_recent_date: + # Compare both date and time to handle same-day flights correctly + if (most_recent_date is None or + arrive_date > most_recent_date or + (arrive_date == most_recent_date and + (most_recent_datetime is None or arrive_datetime > most_recent_datetime))): + most_recent_date = arrive_date + most_recent_datetime = arrive_datetime destination_airport = flight["to"] # If arriving at UK airport, assume back home in Bristol diff --git a/tests/test_busy.py b/tests/test_busy.py index b267997..fd8e9a1 100644 --- a/tests/test_busy.py +++ b/tests/test_busy.py @@ -1,5 +1,6 @@ from datetime import date, datetime +import agenda.travel as travel import agenda.trip from web_view import app @@ -10,20 +11,30 @@ def test_get_location_for_date() -> None: today = datetime.now().date() start = date(today.year, 1, 1) trips = [ - t for t in agenda.trip.build_trip_list() if t.start == date(2025, 2, 9) + t + for t in agenda.trip.build_trip_list() + if t.start in [date(2023, 11, 14), date(2025, 2, 9)] ] - assert len(trips) == 1 + assert len(trips) == 2 data_dir = app.config["PERSONAL_DATA"] # Parse YAML files once for the test - import agenda.travel as travel bookings = travel.parse_yaml("flights", data_dir) accommodations = travel.parse_yaml("accommodation", data_dir) airports = travel.parse_yaml("airports", data_dir) - l1 = agenda.busy.get_location_for_date(date(2025, 2, 15), trips, bookings, accommodations, airports) + l1 = agenda.busy.get_location_for_date( + date(2025, 2, 15), trips, bookings, accommodations, airports + ) assert l1[0] == "Hackettstown" - l2 = agenda.busy.get_location_for_date(date(2025, 7, 1), trips, bookings, accommodations, airports) + l2 = agenda.busy.get_location_for_date( + date(2025, 7, 1), trips, bookings, accommodations, airports + ) + assert l2[0] == "Bristol" + + l2 = agenda.busy.get_location_for_date( + date(2023, 12, 2), trips, bookings, accommodations, airports + ) assert l2[0] == "Bristol"