Implement basic aircraft management
This commit is contained in:
101
api/schemas/aircraft.py
Normal file
101
api/schemas/aircraft.py
Normal file
@@ -0,0 +1,101 @@
|
||||
from enum import Enum
|
||||
from typing import Annotated
|
||||
|
||||
from pydantic import BaseModel, field_validator, Field
|
||||
from pydantic_core.core_schema import ValidationInfo
|
||||
|
||||
from schemas.flight import PyObjectId
|
||||
|
||||
|
||||
class AircraftCategory(Enum):
|
||||
airplane = "Airplane"
|
||||
rotorcraft = "Rotorcraft"
|
||||
powered_lift = "Powered Lift"
|
||||
glider = "Glider"
|
||||
lighter_than_air = "Lighter-Than-Air"
|
||||
ppg = "Powered Parachute"
|
||||
weight_shift = "Weight-Shift Control"
|
||||
|
||||
|
||||
class AircraftClass(Enum):
|
||||
# Airplane
|
||||
sel = "Single-Engine Land"
|
||||
ses = "Single-Engine Sea"
|
||||
mel = "Multi-Engine Land"
|
||||
mes = "Multi-Engine Sea"
|
||||
|
||||
# Rotorcraft
|
||||
helicopter = "Helicopter"
|
||||
gyroplane = "Gyroplane"
|
||||
|
||||
# Powered Lift
|
||||
powered_lift = "Powered Lift"
|
||||
|
||||
# Glider
|
||||
glider = "Glider"
|
||||
|
||||
# Lighther-than-air
|
||||
airship = "Airship"
|
||||
balloon = "Balloon"
|
||||
|
||||
# Powered Parachute
|
||||
ppl = "Powered Parachute Land"
|
||||
pps = "Powered Parachute Sea"
|
||||
|
||||
# Weight-Shift
|
||||
wsl = "Weight-Shift Control Land"
|
||||
wss = "Weight-Shift Control Sea"
|
||||
|
||||
|
||||
PositiveFloat = Annotated[float, Field(default=0., ge=0)]
|
||||
|
||||
|
||||
class AircraftCreateSchema(BaseModel):
|
||||
tail_no: str
|
||||
make: str
|
||||
model: str
|
||||
aircraft_category: AircraftCategory
|
||||
aircraft_class: AircraftClass
|
||||
|
||||
hobbs: PositiveFloat
|
||||
tach: PositiveFloat
|
||||
|
||||
@field_validator('aircraft_class')
|
||||
def validate_class(cls, v: str, info: ValidationInfo, **kwargs):
|
||||
"""
|
||||
Dependent field validator for aircraft class. Ensures class corresponds to the correct category
|
||||
|
||||
:param v: Value of aircraft_class
|
||||
:param values: Other values in schema
|
||||
:param kwargs:
|
||||
:return: v
|
||||
"""
|
||||
if 'aircraft_category' in info.data.keys():
|
||||
category = info.data['aircraft_category']
|
||||
if category == AircraftCategory.airplane and v not in [AircraftClass.sel, AircraftClass.mel,
|
||||
AircraftClass.ses, AircraftClass.mes]:
|
||||
raise ValueError("Class must be SEL, MEL, SES, or MES for Airplane category")
|
||||
elif category == AircraftCategory.rotorcraft and v not in [AircraftClass.helicopter,
|
||||
AircraftClass.gyroplane]:
|
||||
raise ValueError("Class must be Helicopter or Gyroplane for Rotorcraft category")
|
||||
elif category == AircraftCategory.powered_lift and not v == AircraftClass.powered_lift:
|
||||
raise ValueError("Class must be Powered Lift for Powered Lift category")
|
||||
elif category == AircraftCategory.glider and not v == AircraftClass.glider:
|
||||
raise ValueError("Class must be Glider for Glider category")
|
||||
elif category == AircraftCategory.lighter_than_air and v not in [
|
||||
AircraftClass.airship, AircraftClass.balloon]:
|
||||
raise ValueError("Class must be Airship or Balloon for Lighter-Than-Air category")
|
||||
elif category == AircraftCategory.ppg and v not in [AircraftClass.ppl,
|
||||
AircraftClass.pps]:
|
||||
raise ValueError("Class must be Powered Parachute Land or "
|
||||
"Powered Parachute Sea for Powered Parachute category")
|
||||
elif category == AircraftCategory.weight_shift and v not in [AircraftClass.wsl,
|
||||
AircraftClass.wss]:
|
||||
raise ValueError("Class must be Weight-Shift Control Land or Weight-Shift "
|
||||
"Control Sea for Weight-Shift Control category")
|
||||
return v
|
||||
|
||||
|
||||
class AircraftDisplaySchema(AircraftCreateSchema):
|
||||
user: PyObjectId
|
||||
id: PyObjectId
|
Reference in New Issue
Block a user