138 lines
3.3 KiB
Python
138 lines
3.3 KiB
Python
"""Pydantic models for all operational data."""
|
|
|
|
from datetime import datetime
|
|
from enum import Enum
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class FlightStatus(str, Enum):
|
|
ON_TIME = "ON_TIME"
|
|
DELAYED = "DELAYED"
|
|
CANCELLED = "CANCELLED"
|
|
DIVERTED = "DIVERTED"
|
|
|
|
|
|
class DelayCause(str, Enum):
|
|
WEATHER = "WEATHER"
|
|
MAINTENANCE = "MAINTENANCE"
|
|
CREW = "CREW"
|
|
ATC = "ATC"
|
|
LATE_AIRCRAFT = "LATE_AIRCRAFT"
|
|
|
|
|
|
class CrewRole(str, Enum):
|
|
CAPTAIN = "CAPTAIN"
|
|
FIRST_OFFICER = "FIRST_OFFICER"
|
|
FA = "FA"
|
|
|
|
|
|
class MPStatus(str, Enum):
|
|
GLOBAL_SERVICES = "GLOBAL_SERVICES"
|
|
K1 = "1K"
|
|
PLATINUM = "PLATINUM"
|
|
GOLD = "GOLD"
|
|
SILVER = "SILVER"
|
|
GENERAL = "GENERAL"
|
|
|
|
|
|
class FlightData(BaseModel):
|
|
flight_id: str
|
|
origin: str
|
|
destination: str
|
|
scheduled_departure: datetime
|
|
actual_departure: datetime | None = None
|
|
scheduled_arrival: datetime
|
|
actual_arrival: datetime | None = None
|
|
status: FlightStatus
|
|
delay_minutes: int = 0
|
|
delay_cause: DelayCause | None = None
|
|
aircraft_tail: str
|
|
gate: str
|
|
inbound_flight: str | None = None
|
|
crew_ids: list[str] = []
|
|
passenger_count: int = 0
|
|
|
|
|
|
class CrewMember(BaseModel):
|
|
crew_id: str
|
|
name: str
|
|
role: CrewRole
|
|
duty_hours_elapsed: float
|
|
duty_hours_limit: float
|
|
rest_hours_since_last: float
|
|
next_scheduled_flight: str | None = None
|
|
base_hub: str
|
|
|
|
|
|
class Passenger(BaseModel):
|
|
pax_id: str
|
|
name: str
|
|
mileage_plus_status: MPStatus
|
|
flight_id: str
|
|
destination: str
|
|
connection_flight: str | None = None
|
|
connection_deadline: datetime | None = None
|
|
special_needs: list[str] = []
|
|
|
|
|
|
class MELItem(BaseModel):
|
|
mel_id: str
|
|
aircraft_tail: str
|
|
system: str
|
|
description: str
|
|
restriction: str | None = None
|
|
expires: datetime
|
|
|
|
|
|
class RebookingCase(BaseModel):
|
|
pax_id: str
|
|
name: str
|
|
original_flight: str
|
|
mileage_plus_status: MPStatus
|
|
destination: str
|
|
next_available: str | None = None
|
|
urgency: str # HIGH | MEDIUM | LOW
|
|
|
|
|
|
class HubInfo(BaseModel):
|
|
code: str
|
|
name: str
|
|
city: str
|
|
timezone: str
|
|
latitude: float
|
|
longitude: float
|
|
terminals: int
|
|
gates: int
|
|
runways: int
|
|
|
|
|
|
# Hub reference data
|
|
HUBS: dict[str, HubInfo] = {
|
|
"ORD": HubInfo(
|
|
code="ORD", name="O'Hare International", city="Chicago",
|
|
timezone="America/Chicago", latitude=41.9742, longitude=-87.9073,
|
|
terminals=4, gates=191, runways=8,
|
|
),
|
|
"EWR": HubInfo(
|
|
code="EWR", name="Newark Liberty International", city="Newark",
|
|
timezone="America/New_York", latitude=40.6895, longitude=-74.1745,
|
|
terminals=3, gates=120, runways=3,
|
|
),
|
|
"IAH": HubInfo(
|
|
code="IAH", name="George Bush Intercontinental", city="Houston",
|
|
timezone="America/Chicago", latitude=29.9902, longitude=-95.3368,
|
|
terminals=5, gates=130, runways=5,
|
|
),
|
|
"SFO": HubInfo(
|
|
code="SFO", name="San Francisco International", city="San Francisco",
|
|
timezone="America/Los_Angeles", latitude=37.6213, longitude=-122.3790,
|
|
terminals=4, gates=115, runways=4,
|
|
),
|
|
"DEN": HubInfo(
|
|
code="DEN", name="Denver International", city="Denver",
|
|
timezone="America/Denver", latitude=39.8561, longitude=-104.6737,
|
|
terminals=1, gates=95, runways=6,
|
|
),
|
|
}
|