From 6209c7acce66b07e64c5305ebb2e428a3d49cc41 Mon Sep 17 00:00:00 2001 From: James Pattinson Date: Tue, 16 Dec 2025 09:47:26 -0500 Subject: [PATCH] Book in functions --- backend/alembic/versions/002_local_flights.py | 6 +- backend/app/api/endpoints/public.py | 22 ++ backend/app/crud/crud_arrival.py | 10 +- backend/app/models/arrival.py | 3 +- backend/app/schemas/arrival.py | 5 +- web/admin.html | 357 +++++++++++++++++- web/index.html | 29 +- web/lookups.js | 47 +++ 8 files changed, 452 insertions(+), 27 deletions(-) diff --git a/backend/alembic/versions/002_local_flights.py b/backend/alembic/versions/002_local_flights.py index cdf20e5..1596c26 100644 --- a/backend/alembic/versions/002_local_flights.py +++ b/backend/alembic/versions/002_local_flights.py @@ -91,7 +91,8 @@ def upgrade() -> None: sa.Column('in_from', sa.String(length=64), nullable=False), sa.Column('status', sa.Enum('BOOKED_IN', 'LANDED', 'CANCELLED', name='arrivalsstatus'), nullable=False, server_default='BOOKED_IN'), sa.Column('notes', sa.Text(), nullable=True), - sa.Column('booked_in_dt', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False), + sa.Column('created_dt', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False), + sa.Column('eta', sa.DateTime(), nullable=True), sa.Column('landed_dt', sa.DateTime(), nullable=True), sa.Column('created_by', sa.String(length=16), nullable=True), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'), nullable=False), @@ -104,7 +105,8 @@ def upgrade() -> None: op.create_index('idx_arr_registration', 'arrivals', ['registration']) op.create_index('idx_arr_in_from', 'arrivals', ['in_from']) op.create_index('idx_arr_status', 'arrivals', ['status']) - op.create_index('idx_arr_booked_in_dt', 'arrivals', ['booked_in_dt']) + op.create_index('idx_arr_created_dt', 'arrivals', ['created_dt']) + op.create_index('idx_arr_eta', 'arrivals', ['eta']) op.create_index('idx_arr_created_by', 'arrivals', ['created_by']) diff --git a/backend/app/api/endpoints/public.py b/backend/app/api/endpoints/public.py index 1b77640..b40add2 100644 --- a/backend/app/api/endpoints/public.py +++ b/backend/app/api/endpoints/public.py @@ -63,6 +63,28 @@ async def get_public_arrivals(db: Session = Depends(get_db)): 'flight_type': flight.flight_type.value }) + # Add booked-in arrivals + booked_in_arrivals = crud_arrival.get_multi(db, limit=1000) + for arrival in booked_in_arrivals: + # Only include BOOKED_IN and LANDED arrivals + if arrival.status not in (ArrivalStatus.BOOKED_IN, ArrivalStatus.LANDED): + continue + # For BOOKED_IN, only include those from today; for LANDED, include all + if arrival.status == ArrivalStatus.BOOKED_IN: + if not (today_start <= arrival.created_dt < today_end): + continue + + arrivals_list.append({ + 'registration': arrival.registration, + 'callsign': arrival.callsign, + 'type': arrival.type, + 'in_from': arrival.in_from, + 'eta': arrival.eta, + 'landed_dt': arrival.landed_dt, + 'status': arrival.status.value, + 'isBookedIn': True + }) + return arrivals_list diff --git a/backend/app/crud/crud_arrival.py b/backend/app/crud/crud_arrival.py index 202aa4a..4abd830 100644 --- a/backend/app/crud/crud_arrival.py +++ b/backend/app/crud/crud_arrival.py @@ -25,25 +25,25 @@ class CRUDArrival: query = query.filter(Arrival.status == status) if date_from: - query = query.filter(func.date(Arrival.booked_in_dt) >= date_from) + query = query.filter(func.date(Arrival.created_dt) >= date_from) if date_to: - query = query.filter(func.date(Arrival.booked_in_dt) <= date_to) + query = query.filter(func.date(Arrival.created_dt) <= date_to) - return query.order_by(desc(Arrival.booked_in_dt)).offset(skip).limit(limit).all() + return query.order_by(desc(Arrival.created_dt)).offset(skip).limit(limit).all() def get_arrivals_today(self, db: Session) -> List[Arrival]: """Get today's arrivals (booked in or landed)""" today = date.today() return db.query(Arrival).filter( and_( - func.date(Arrival.booked_in_dt) == today, + func.date(Arrival.created_dt) == today, or_( Arrival.status == ArrivalStatus.BOOKED_IN, Arrival.status == ArrivalStatus.LANDED ) ) - ).order_by(Arrival.booked_in_dt).all() + ).order_by(Arrival.created_dt).all() def create(self, db: Session, obj_in: ArrivalCreate, created_by: str) -> Arrival: db_obj = Arrival( diff --git a/backend/app/models/arrival.py b/backend/app/models/arrival.py index a2e2930..e913e7c 100644 --- a/backend/app/models/arrival.py +++ b/backend/app/models/arrival.py @@ -23,7 +23,8 @@ class Arrival(Base): in_from = Column(String(4), nullable=False, index=True) status = Column(SQLEnum(ArrivalStatus), default=ArrivalStatus.BOOKED_IN, nullable=False, index=True) notes = Column(Text, nullable=True) - booked_in_dt = Column(DateTime, server_default=func.now(), nullable=False, index=True) + created_dt = Column(DateTime, server_default=func.now(), nullable=False, index=True) + eta = Column(DateTime, nullable=True, index=True) landed_dt = Column(DateTime, nullable=True) created_by = Column(String(16), nullable=True, index=True) updated_at = Column(DateTime, server_default=func.now(), onupdate=func.now(), nullable=False) diff --git a/backend/app/schemas/arrival.py b/backend/app/schemas/arrival.py index 7081d05..1fd42fc 100644 --- a/backend/app/schemas/arrival.py +++ b/backend/app/schemas/arrival.py @@ -38,7 +38,7 @@ class ArrivalBase(BaseModel): class ArrivalCreate(ArrivalBase): - pass + eta: Optional[datetime] = None class ArrivalUpdate(BaseModel): @@ -57,7 +57,8 @@ class ArrivalStatusUpdate(BaseModel): class Arrival(ArrivalBase): id: int status: ArrivalStatus - booked_in_dt: datetime + created_dt: datetime + eta: Optional[datetime] = None landed_dt: Optional[datetime] = None created_by: Optional[str] = None updated_at: datetime diff --git a/web/admin.html b/web/admin.html index 918b4c0..3eed947 100644 --- a/web/admin.html +++ b/web/admin.html @@ -19,6 +19,9 @@ + @@ -505,6 +508,65 @@ + + +