Pilot self-bookout

This commit is contained in:
2026-02-20 11:52:43 -05:00
parent 24971ac5fc
commit 7f4e4a8459
14 changed files with 1354 additions and 46 deletions

View File

@@ -10,6 +10,11 @@ class ArrivalStatus(str, Enum):
CANCELLED = "CANCELLED"
class SubmissionSource(str, Enum):
ADMIN = "ADMIN"
PUBLIC = "PUBLIC"
class ArrivalBase(BaseModel):
registration: str
type: Optional[str] = None
@@ -63,6 +68,8 @@ class Arrival(ArrivalBase):
landed_dt: Optional[datetime] = None
created_by: Optional[str] = None
updated_at: datetime
submitted_via: Optional[SubmissionSource] = None
pilot_email: Optional[str] = None
class Config:
from_attributes = True

View File

@@ -10,6 +10,11 @@ class DepartureStatus(str, Enum):
CANCELLED = "CANCELLED"
class SubmissionSource(str, Enum):
ADMIN = "ADMIN"
PUBLIC = "PUBLIC"
class DepartureBase(BaseModel):
registration: str
type: Optional[str] = None
@@ -63,3 +68,9 @@ class Departure(DepartureBase):
created_dt: datetime
etd: Optional[datetime] = None
departed_dt: Optional[datetime] = None
updated_at: datetime
submitted_via: Optional[SubmissionSource] = None
pilot_email: Optional[str] = None
class Config:
from_attributes = True

View File

@@ -17,6 +17,11 @@ class LocalFlightStatus(str, Enum):
CANCELLED = "CANCELLED"
class SubmissionSource(str, Enum):
ADMIN = "ADMIN"
PUBLIC = "PUBLIC"
class LocalFlightBase(BaseModel):
registration: str
type: Optional[str] = None # Aircraft type - optional, can be looked up later
@@ -81,6 +86,8 @@ class LocalFlightInDBBase(LocalFlightBase):
circuits: Optional[int] = None
created_by: Optional[str] = None
updated_at: datetime
submitted_via: Optional[SubmissionSource] = None
pilot_email: Optional[str] = None
class Config:
from_attributes = True

View File

@@ -0,0 +1,129 @@
from pydantic import BaseModel, validator, EmailStr
from datetime import datetime
from typing import Optional
from enum import Enum
class LocalFlightType(str, Enum):
LOCAL = "LOCAL"
CIRCUITS = "CIRCUITS"
DEPARTURE = "DEPARTURE"
class PublicLocalFlightCreate(BaseModel):
"""Schema for public local flight booking"""
registration: str
type: Optional[str] = None # Aircraft type - optional
callsign: Optional[str] = None
pob: int
flight_type: LocalFlightType
duration: Optional[int] = 45 # Duration in minutes, default 45
etd: Optional[datetime] = None # Estimated Time of Departure
notes: Optional[str] = None
pilot_email: Optional[str] = None # Pilot's email for contact (optional)
pilot_name: Optional[str] = None # Pilot's name
@validator('registration')
def validate_registration(cls, v):
if not v or len(v.strip()) == 0:
raise ValueError('Aircraft registration is required')
return v.strip().upper()
@validator('pob')
def validate_pob(cls, v):
if v is not None and v < 1:
raise ValueError('Persons on board must be at least 1')
return v
@validator('pilot_email', pre=True, always=False)
def validate_pilot_email(cls, v):
if v is None or v == '':
return None
return v.strip().lower()
class PublicCircuitCreate(BaseModel):
"""Schema for public circuit (touch and go) recording"""
local_flight_id: int
circuit_timestamp: datetime
pilot_email: Optional[str] = None
@validator('pilot_email', pre=True, always=False)
def validate_pilot_email(cls, v):
if v is None or v == '':
return None
return v.strip().lower()
class PublicDepartureCreate(BaseModel):
"""Schema for public departure booking"""
registration: str
type: Optional[str] = None
callsign: Optional[str] = None
pob: int
out_to: str
etd: Optional[datetime] = None # Estimated Time of Departure
notes: Optional[str] = None
pilot_email: Optional[str] = None
pilot_name: Optional[str] = None
@validator('registration')
def validate_registration(cls, v):
if not v or len(v.strip()) == 0:
raise ValueError('Aircraft registration is required')
return v.strip().upper()
@validator('out_to')
def validate_out_to(cls, v):
if not v or len(v.strip()) == 0:
raise ValueError('Destination airport is required')
return v.strip()
@validator('pob')
def validate_pob(cls, v):
if v is not None and v < 1:
raise ValueError('Persons on board must be at least 1')
return v
@validator('pilot_email', pre=True, always=False)
def validate_pilot_email(cls, v):
if v is None or v == '':
return None
return v.strip().lower()
class PublicArrivalCreate(BaseModel):
"""Schema for public arrival booking"""
registration: str
type: Optional[str] = None
callsign: Optional[str] = None
pob: int
in_from: str
eta: Optional[datetime] = None
notes: Optional[str] = None
pilot_email: Optional[str] = None
pilot_name: Optional[str] = None
@validator('registration')
def validate_registration(cls, v):
if not v or len(v.strip()) == 0:
raise ValueError('Aircraft registration is required')
return v.strip().upper()
@validator('in_from')
def validate_in_from(cls, v):
if not v or len(v.strip()) == 0:
raise ValueError('Origin airport is required')
return v.strip()
@validator('pob')
def validate_pob(cls, v):
if v is not None and v < 1:
raise ValueError('Persons on board must be at least 1')
return v
@validator('pilot_email', pre=True, always=False)
def validate_pilot_email(cls, v):
if v is None or v == '':
return None
return v.strip().lower()