Before refactor
This commit is contained in:
@@ -25,7 +25,7 @@ def upgrade() -> None:
|
||||
op.add_column('local_flights', sa.Column('takeoff_dt', sa.DateTime(), nullable=True))
|
||||
|
||||
# Add GROUND and ARRIVED to arrivals status enum
|
||||
op.execute("ALTER TABLE arrivals MODIFY COLUMN status ENUM('BOOKED_IN','LANDED','GROUND','ARRIVED','CANCELLED')")
|
||||
op.execute("ALTER TABLE arrivals MODIFY COLUMN status ENUM('BOOKED_IN','LANDED','GROUND','LOCAL','CIRCUIT','ARRIVED','CANCELLED')")
|
||||
|
||||
# Add timestamp column to arrivals
|
||||
op.add_column('arrivals', sa.Column('arrived_dt', sa.DateTime(), nullable=True))
|
||||
@@ -36,9 +36,22 @@ def upgrade() -> None:
|
||||
# Add timestamp columns to departures
|
||||
op.add_column('departures', sa.Column('contact_dt', sa.DateTime(), nullable=True))
|
||||
op.add_column('departures', sa.Column('takeoff_dt', sa.DateTime(), nullable=True))
|
||||
|
||||
# Add arrival_id column to circuits table to support circuit logging for arrivals
|
||||
op.add_column('circuits', sa.Column('arrival_id', sa.BigInteger(), nullable=True))
|
||||
op.create_foreign_key('fk_circuits_arrival_id', 'circuits', 'arrivals', ['arrival_id'], ['id'], ondelete='CASCADE')
|
||||
op.create_index('idx_circuit_arrival_id', 'circuits', ['arrival_id'])
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
# Remove arrival_id column from circuits table
|
||||
op.drop_constraint('fk_circuits_arrival_id', 'circuits', type_='foreignkey')
|
||||
op.drop_index('idx_circuit_arrival_id', table_name='circuits')
|
||||
op.drop_column('circuits', 'arrival_id')
|
||||
|
||||
# Update departures with new status values to valid old values before modifying enum
|
||||
op.execute("UPDATE departures SET status = 'DEPARTED' WHERE status IN ('GROUND', 'LOCAL')")
|
||||
|
||||
# Remove timestamp columns from departures
|
||||
op.drop_column('departures', 'takeoff_dt')
|
||||
op.drop_column('departures', 'contact_dt')
|
||||
@@ -46,12 +59,18 @@ def downgrade() -> None:
|
||||
# Remove GROUND and LOCAL from departures status enum
|
||||
op.execute("ALTER TABLE departures MODIFY COLUMN status ENUM('BOOKED_OUT','DEPARTED','CANCELLED')")
|
||||
|
||||
# Update arrivals with new status values to valid old values before modifying enum
|
||||
op.execute("UPDATE arrivals SET status = 'LANDED' WHERE status IN ('GROUND', 'LOCAL', 'CIRCUIT', 'ARRIVED')")
|
||||
|
||||
# Remove timestamp column from arrivals
|
||||
op.drop_column('arrivals', 'arrived_dt')
|
||||
|
||||
# Remove GROUND and ARRIVED from arrivals status enum
|
||||
op.execute("ALTER TABLE arrivals MODIFY COLUMN status ENUM('BOOKED_IN','LANDED','CANCELLED')")
|
||||
|
||||
# Update local_flights with new status values to valid old values before modifying enum
|
||||
op.execute("UPDATE local_flights SET status = 'DEPARTED' WHERE status IN ('GROUND', 'LOCAL', 'CIRCUIT')")
|
||||
|
||||
# Remove timestamp columns from local_flights
|
||||
op.drop_column('local_flights', 'takeoff_dt')
|
||||
op.drop_column('local_flights', 'contact_dt')
|
||||
|
||||
@@ -33,6 +33,17 @@ async def get_circuits_by_flight(
|
||||
return circuits
|
||||
|
||||
|
||||
@router.get("/arrival/{arrival_id}", response_model=List[Circuit])
|
||||
async def get_circuits_by_arrival(
|
||||
arrival_id: int,
|
||||
db: Session = Depends(get_db),
|
||||
current_user: User = Depends(get_current_read_user)
|
||||
):
|
||||
"""Get all circuits for a specific arrival"""
|
||||
circuits = crud_circuit.get_by_arrival(db, arrival_id=arrival_id)
|
||||
return circuits
|
||||
|
||||
|
||||
@router.post("/", response_model=Circuit)
|
||||
async def create_circuit(
|
||||
request: Request,
|
||||
@@ -40,7 +51,19 @@ async def create_circuit(
|
||||
db: Session = Depends(get_db),
|
||||
current_user: User = Depends(get_current_operator_user)
|
||||
):
|
||||
"""Record a new circuit (touch and go) for a local flight"""
|
||||
"""Record a new circuit (touch and go) for a local flight or arrival"""
|
||||
# Validate that exactly one of local_flight_id or arrival_id is provided
|
||||
if not circuit_in.local_flight_id and not circuit_in.arrival_id:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="Either local_flight_id or arrival_id must be provided"
|
||||
)
|
||||
if circuit_in.local_flight_id and circuit_in.arrival_id:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_400_BAD_REQUEST,
|
||||
detail="Cannot provide both local_flight_id and arrival_id"
|
||||
)
|
||||
|
||||
circuit = crud_circuit.create(db, obj_in=circuit_in)
|
||||
|
||||
# Send real-time update via WebSocket
|
||||
|
||||
@@ -16,6 +16,12 @@ class CRUDCircuit:
|
||||
Circuit.local_flight_id == local_flight_id
|
||||
).order_by(Circuit.circuit_timestamp).all()
|
||||
|
||||
def get_by_arrival(self, db: Session, arrival_id: int) -> List[Circuit]:
|
||||
"""Get all circuits for a specific arrival"""
|
||||
return db.query(Circuit).filter(
|
||||
Circuit.arrival_id == arrival_id
|
||||
).order_by(Circuit.circuit_timestamp).all()
|
||||
|
||||
def get_multi(
|
||||
self,
|
||||
db: Session,
|
||||
@@ -27,6 +33,7 @@ class CRUDCircuit:
|
||||
def create(self, db: Session, obj_in: CircuitCreate) -> Circuit:
|
||||
db_obj = Circuit(
|
||||
local_flight_id=obj_in.local_flight_id,
|
||||
arrival_id=obj_in.arrival_id,
|
||||
circuit_timestamp=obj_in.circuit_timestamp
|
||||
)
|
||||
db.add(db_obj)
|
||||
|
||||
@@ -14,6 +14,7 @@ from app.models.journal import JournalEntry
|
||||
from app.models.local_flight import LocalFlight
|
||||
from app.models.departure import Departure
|
||||
from app.models.arrival import Arrival
|
||||
from app.models.circuit import Circuit
|
||||
|
||||
# Set up logging
|
||||
logging.basicConfig(level=logging.INFO)
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
from sqlalchemy import Column, BigInteger, String, Integer, Text, DateTime, Enum as SQLEnum, func
|
||||
from sqlalchemy.ext.declarative import declarative_base
|
||||
from enum import Enum
|
||||
from datetime import datetime
|
||||
|
||||
Base = declarative_base()
|
||||
from app.db.session import Base
|
||||
|
||||
|
||||
class SubmissionSource(str, Enum):
|
||||
@@ -15,6 +13,8 @@ class ArrivalStatus(str, Enum):
|
||||
BOOKED_IN = "BOOKED_IN"
|
||||
LANDED = "LANDED"
|
||||
GROUND = "GROUND"
|
||||
LOCAL = "LOCAL"
|
||||
CIRCUIT = "CIRCUIT"
|
||||
ARRIVED = "ARRIVED"
|
||||
CANCELLED = "CANCELLED"
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ class Circuit(Base):
|
||||
__tablename__ = "circuits"
|
||||
|
||||
id = Column(BigInteger, primary_key=True, autoincrement=True)
|
||||
local_flight_id = Column(BigInteger, ForeignKey("local_flights.id", ondelete="CASCADE"), nullable=False, index=True)
|
||||
local_flight_id = Column(BigInteger, ForeignKey("local_flights.id", ondelete="CASCADE"), nullable=True, index=True)
|
||||
arrival_id = Column(BigInteger, ForeignKey("arrivals.id", ondelete="CASCADE"), nullable=True, index=True)
|
||||
circuit_timestamp = Column(DateTime, nullable=False, index=True)
|
||||
created_at = Column(DateTime, nullable=False, server_default=func.current_timestamp())
|
||||
|
||||
@@ -8,6 +8,8 @@ class ArrivalStatus(str, Enum):
|
||||
BOOKED_IN = "BOOKED_IN"
|
||||
LANDED = "LANDED"
|
||||
GROUND = "GROUND"
|
||||
LOCAL = "LOCAL"
|
||||
CIRCUIT = "CIRCUIT"
|
||||
ARRIVED = "ARRIVED"
|
||||
CANCELLED = "CANCELLED"
|
||||
|
||||
|
||||
@@ -4,7 +4,8 @@ from typing import Optional
|
||||
|
||||
|
||||
class CircuitBase(BaseModel):
|
||||
local_flight_id: int
|
||||
local_flight_id: Optional[int] = None
|
||||
arrival_id: Optional[int] = None
|
||||
circuit_timestamp: datetime
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user