"""Add drone flight requests Revision ID: 009_drone_requests Revises: 008_ppr_strip_acknowledgement Create Date: 2026-06-19 12:00:00.000000 """ from alembic import op import sqlalchemy as sa revision = '009_drone_requests' down_revision = '008_ppr_strip_acknowledgement' branch_labels = None depends_on = None drone_status = sa.Enum( 'NEW', 'APPROVED', 'DENIED', 'PENDING', 'CANCELED', 'INFLIGHT', 'COMPLETED', name='dronerequeststatus', ) def upgrade() -> None: op.create_table( 'drone_requests', sa.Column('id', sa.BigInteger(), autoincrement=True, nullable=False), sa.Column('reference_number', sa.String(length=24), nullable=False), sa.Column('public_token', sa.String(length=128), nullable=True), sa.Column('status', drone_status, nullable=False), sa.Column('operator_name', sa.String(length=128), nullable=False), sa.Column('operator_id', sa.String(length=64), nullable=True), sa.Column('flyer_name', sa.String(length=128), nullable=True), sa.Column('flyer_id', sa.String(length=64), nullable=True), sa.Column('email', sa.String(length=128), nullable=False), sa.Column('phone', sa.String(length=32), nullable=True), sa.Column('flight_date', sa.Date(), nullable=True), sa.Column('estimated_takeoff_time', sa.String(length=8), nullable=True), sa.Column('estimated_completion_time', sa.String(length=8), nullable=True), sa.Column('estimated_takeoff_at', sa.DateTime(), nullable=False), sa.Column('estimated_completion_at', sa.DateTime(), nullable=False), sa.Column('maximum_elevation_ft_amsl', sa.Integer(), nullable=False), sa.Column('location_description', sa.Text(), nullable=True), sa.Column('location_latitude', sa.Float(), nullable=False), sa.Column('location_longitude', sa.Float(), nullable=False), sa.Column('location_inside_frz', sa.Boolean(), nullable=True), sa.Column('prototype_overlay', sa.JSON(), nullable=True), sa.Column('applicant_notes', sa.Text(), nullable=True), sa.Column('operator_comments', sa.Text(), nullable=True), sa.Column('submitted_via', sa.String(length=32), nullable=False, server_default='PUBLIC'), sa.Column('submitted_ip', sa.String(length=45), nullable=True), sa.Column('created_by', sa.String(length=50), nullable=True), sa.Column('submitted_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False), sa.Column('updated_at', sa.DateTime(), server_default=sa.text('CURRENT_TIMESTAMP'), nullable=False), sa.Column('status_changed_at', sa.DateTime(), nullable=True), sa.Column('status_changed_by', sa.String(length=50), nullable=True), sa.PrimaryKeyConstraint('id'), sa.UniqueConstraint('reference_number'), ) op.create_index(op.f('ix_drone_requests_created_by'), 'drone_requests', ['created_by'], unique=False) op.create_index(op.f('ix_drone_requests_email'), 'drone_requests', ['email'], unique=False) op.create_index(op.f('ix_drone_requests_estimated_completion_at'), 'drone_requests', ['estimated_completion_at'], unique=False) op.create_index(op.f('ix_drone_requests_estimated_takeoff_at'), 'drone_requests', ['estimated_takeoff_at'], unique=False) op.create_index(op.f('ix_drone_requests_flight_date'), 'drone_requests', ['flight_date'], unique=False) op.create_index(op.f('ix_drone_requests_operator_name'), 'drone_requests', ['operator_name'], unique=False) op.create_index(op.f('ix_drone_requests_public_token'), 'drone_requests', ['public_token'], unique=True) op.create_index(op.f('ix_drone_requests_reference_number'), 'drone_requests', ['reference_number'], unique=True) op.create_index(op.f('ix_drone_requests_status'), 'drone_requests', ['status'], unique=False) op.create_index(op.f('ix_drone_requests_submitted_at'), 'drone_requests', ['submitted_at'], unique=False) op.create_index('idx_drone_status_takeoff', 'drone_requests', ['status', 'estimated_takeoff_at'], unique=False) def downgrade() -> None: op.drop_index('idx_drone_status_takeoff', table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_submitted_at'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_status'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_reference_number'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_public_token'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_operator_name'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_flight_date'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_estimated_takeoff_at'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_estimated_completion_at'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_email'), table_name='drone_requests') op.drop_index(op.f('ix_drone_requests_created_by'), table_name='drone_requests') op.drop_table('drone_requests')