61 lines
2.2 KiB
Python
61 lines
2.2 KiB
Python
"""Serialize trip details for the debug page."""
|
|
|
|
import json
|
|
|
|
import yaml
|
|
|
|
from agenda.types import Trip
|
|
|
|
|
|
def serialize_trip(trip: Trip) -> tuple[str, str]:
|
|
"""Return JSON and YAML including computed trip properties."""
|
|
# Convert trip object to dictionary for display
|
|
trip_dict = {
|
|
"start": trip.start.isoformat(),
|
|
"name": trip.name,
|
|
"private": trip.private,
|
|
"travel": trip.travel,
|
|
"accommodation": trip.accommodation,
|
|
"conferences": trip.conferences,
|
|
"events": trip.events,
|
|
"flight_bookings": trip.flight_bookings,
|
|
"computed_properties": {
|
|
"title": trip.title,
|
|
"end": trip.end.isoformat() if trip.end else None,
|
|
"countries": [
|
|
{"name": c.name, "alpha_2": c.alpha_2, "flag": c.flag}
|
|
for c in trip.countries
|
|
],
|
|
"locations": [
|
|
{
|
|
"location": loc,
|
|
"country": {"name": country.name, "alpha_2": country.alpha_2},
|
|
}
|
|
for loc, country in trip.locations()
|
|
],
|
|
"total_distance": trip.total_distance(),
|
|
"total_co2_kg": trip.total_co2_kg(),
|
|
"distances_by_transport_type": trip.distances_by_transport_type(),
|
|
"co2_by_transport_type": trip.co2_by_transport_type(),
|
|
},
|
|
"schengen_compliance": (
|
|
{
|
|
"total_days_used": trip.schengen_compliance.total_days_used,
|
|
"days_remaining": trip.schengen_compliance.days_remaining,
|
|
"is_compliant": trip.schengen_compliance.is_compliant,
|
|
"current_180_day_period": [
|
|
trip.schengen_compliance.current_180_day_period[0].isoformat(),
|
|
trip.schengen_compliance.current_180_day_period[1].isoformat(),
|
|
],
|
|
"days_over_limit": trip.schengen_compliance.days_over_limit,
|
|
}
|
|
if trip.schengen_compliance
|
|
else None
|
|
),
|
|
}
|
|
|
|
# Convert to JSON for pretty printing
|
|
trip_json = json.dumps(trip_dict, indent=2, default=str)
|
|
trip_yaml = yaml.safe_dump(json.loads(trip_json), sort_keys=False)
|
|
|
|
return trip_json, trip_yaml
|