When attend_start or attend_end is set, display the full conference
date range in parentheses after the attended dates, e.g.
"Wed 6 Mar to Sun 10 Mar (full conference: Sun 3 Mar to Sun 10 Mar)".
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Allows recording when you arrive late or leave early at a multi-day
conference. Both fields accept a plain date or datetime with time.
Trip pages display the attendance dates instead of the official
conference dates when these fields are set.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Extract `load_road_transport()` as a shared helper for bus and coach,
combining the near-identical route rendering blocks in `get_trip_routes`
and `Trip.elements()` into single `in ("coach", "bus")` branches.
Document transport type patterns in AGENTS.md.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Add case "bus" to get_locations() and bus route handling to
get_trip_routes() in trip.py. Coach stations now populate a dedicated
"coach_station" dict instead of the train station list. Add
"coach_station" (🚌) and "bus_stop" (🚏) emoji types to map.js.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Use Bootstrap cards and collapsible sections to make the long
lists of airlines, airports, and stations easier to read. Items
are now displayed as badges and hidden by default.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Aggregate yearly stats into overall totals so the trip stats page
shows flight segments by airline, airports used, and stations used
in the summary section at the top.
Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
Previously Trip.total_distance returned None if any travel leg lacked a
distance, which led to undercounted trip stats (less than flight + train
totals).
Now it accumulates only distances that are present and ignores
missing/falsy values. The method returns a float and yields 0.0 when no
distances are available. Docstring updated accordingly.
Fixes#185
In addition to the configured FOLLOW_LAUNCHES, also send emails for any
launch whose mission.type == "Test Flight" even if its slug is not in
FOLLOW_LAUNCHES.
Fixes#192.