from enum import Enum from sqlalchemy import BigInteger, Boolean, Column, Date, DateTime, Enum as SQLEnum, Float, Index, Integer, JSON, String, Text from sqlalchemy.sql import func from app.db.session import Base class DroneRequestStatus(str, Enum): NEW = "NEW" APPROVED = "APPROVED" DENIED = "DENIED" CANCELED = "CANCELED" INFLIGHT = "INFLIGHT" COMPLETED = "COMPLETED" class DroneRequest(Base): __tablename__ = "drone_requests" id = Column(BigInteger, primary_key=True, autoincrement=True) reference_number = Column(String(24), nullable=False, unique=True, index=True) public_token = Column(String(128), nullable=True, unique=True, index=True) status = Column(SQLEnum(DroneRequestStatus), nullable=False, default=DroneRequestStatus.NEW, index=True) operator_name = Column(String(128), nullable=False, index=True) operator_id = Column(String(64), nullable=True) flyer_name = Column(String(128), nullable=True) flyer_id = Column(String(64), nullable=True) email = Column(String(128), nullable=False, index=True) phone = Column(String(32), nullable=True) flight_date = Column(Date, nullable=True, index=True) estimated_takeoff_time = Column(String(8), nullable=True) estimated_completion_time = Column(String(8), nullable=True) estimated_takeoff_at = Column(DateTime, nullable=False, index=True) estimated_completion_at = Column(DateTime, nullable=False, index=True) maximum_elevation_ft_amsl = Column(Integer, nullable=False) location_description = Column(Text, nullable=True) location_latitude = Column(Float, nullable=False) location_longitude = Column(Float, nullable=False) location_inside_frz = Column(Boolean, nullable=True) prototype_overlay = Column(JSON, nullable=True) applicant_notes = Column(Text, nullable=True) operator_comments = Column(Text, nullable=True) submitted_via = Column(String(32), nullable=False, default="PUBLIC") submitted_ip = Column(String(45), nullable=True) created_by = Column(String(50), nullable=True, index=True) submitted_at = Column(DateTime, nullable=False, server_default=func.current_timestamp(), index=True) updated_at = Column(DateTime, nullable=False, server_default=func.current_timestamp(), onupdate=func.current_timestamp()) status_changed_at = Column(DateTime, nullable=True) status_changed_by = Column(String(50), nullable=True) __table_args__ = ( Index("idx_drone_status_takeoff", "status", "estimated_takeoff_at"), ) @property def notes(self): return self.applicant_notes