"""Add video clipper models Revision ID: a175c1c319c5 Revises: fe56fa70289e Create Date: 2026-02-08 18:20:20.594193 """ from alembic import op import sqlalchemy as sa import sqlmodel.sql.sqltypes # revision identifiers, used by Alembic. revision = 'a175c1c319c5' down_revision = 'fe56fa70289e' branch_labels = None depends_on = None def upgrade(): # ### commands auto generated by Alembic - please adjust! ### op.create_table('project', sa.Column('title', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=False), sa.Column('source_type', sa.Enum('LOCAL_UPLOAD', 'YOUTUBE_URL', name='projectsourcetype'), nullable=False), sa.Column('source_url', sqlmodel.sql.sqltypes.AutoString(length=2048), nullable=True), sa.Column('num_clips', sa.Integer(), nullable=False), sa.Column('min_duration', sa.Float(), nullable=False), sa.Column('max_duration', sa.Float(), nullable=False), sa.Column('crop_mode', sqlmodel.sql.sqltypes.AutoString(length=50), nullable=False), sa.Column('detection_model', sqlmodel.sql.sqltypes.AutoString(length=50), nullable=False), sa.Column('custom_prompt', sqlmodel.sql.sqltypes.AutoString(length=2048), nullable=True), sa.Column('id', sa.Uuid(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('updated_at', sa.DateTime(timezone=True), nullable=False), sa.Column('owner_id', sa.Uuid(), nullable=False), sa.Column('video_filename', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=False), sa.Column('video_path', sqlmodel.sql.sqltypes.AutoString(length=1024), nullable=False), sa.Column('duration_seconds', sa.Float(), nullable=True), sa.Column('width', sa.Integer(), nullable=True), sa.Column('height', sa.Integer(), nullable=True), sa.Column('fps', sa.Float(), nullable=True), sa.Column('file_size_bytes', sa.Integer(), nullable=True), sa.Column('status', sa.Enum('UPLOADING', 'ANALYZING', 'ANALYSIS_COMPLETE', 'PROCESSING', 'COMPLETED', 'FAILED', name='projectstatus'), nullable=False), sa.Column('error_message', sqlmodel.sql.sqltypes.AutoString(length=2048), nullable=True), sa.ForeignKeyConstraint(['owner_id'], ['user.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) op.create_table('processingjob', sa.Column('job_type', sa.Enum('ANALYZE_VIDEO', 'GENERATE_CLIPS', name='jobtype'), nullable=False), sa.Column('status', sqlmodel.sql.sqltypes.AutoString(length=50), nullable=False), sa.Column('progress_percent', sa.Float(), nullable=False), sa.Column('current_step', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=True), sa.Column('id', sa.Uuid(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('started_at', sa.DateTime(), nullable=True), sa.Column('completed_at', sa.DateTime(), nullable=True), sa.Column('project_id', sa.Uuid(), nullable=False), sa.Column('celery_task_id', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=True), sa.Column('error_message', sqlmodel.sql.sqltypes.AutoString(length=2048), nullable=True), sa.ForeignKeyConstraint(['project_id'], ['project.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) op.create_index(op.f('ix_processingjob_celery_task_id'), 'processingjob', ['celery_task_id'], unique=True) op.create_table('segment', sa.Column('start_time', sa.Float(), nullable=False), sa.Column('end_time', sa.Float(), nullable=False), sa.Column('score', sa.Float(), nullable=False), sa.Column('description', sqlmodel.sql.sqltypes.AutoString(length=1024), nullable=False), sa.Column('is_selected', sa.Boolean(), nullable=False), sa.Column('order_index', sa.Integer(), nullable=False), sa.Column('id', sa.Uuid(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('project_id', sa.Uuid(), nullable=False), sa.Column('is_modified', sa.Boolean(), nullable=False), sa.ForeignKeyConstraint(['project_id'], ['project.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) op.create_table('clip', sa.Column('filename', sqlmodel.sql.sqltypes.AutoString(length=255), nullable=False), sa.Column('file_path', sqlmodel.sql.sqltypes.AutoString(length=1024), nullable=False), sa.Column('status', sa.Enum('QUEUED', 'PROCESSING', 'COMPLETED', 'FAILED', name='clipstatus'), nullable=False), sa.Column('progress_percent', sa.Float(), nullable=False), sa.Column('id', sa.Uuid(), nullable=False), sa.Column('created_at', sa.DateTime(timezone=True), nullable=False), sa.Column('completed_at', sa.DateTime(), nullable=True), sa.Column('project_id', sa.Uuid(), nullable=False), sa.Column('segment_id', sa.Uuid(), nullable=False), sa.Column('file_size_bytes', sa.Integer(), nullable=True), sa.Column('duration_seconds', sa.Float(), nullable=True), sa.Column('error_message', sqlmodel.sql.sqltypes.AutoString(length=2048), nullable=True), sa.ForeignKeyConstraint(['project_id'], ['project.id'], ondelete='CASCADE'), sa.ForeignKeyConstraint(['segment_id'], ['segment.id'], ondelete='CASCADE'), sa.PrimaryKeyConstraint('id') ) # ### end Alembic commands ### def downgrade(): # ### commands auto generated by Alembic - please adjust! ### op.drop_table('clip') op.drop_table('segment') op.drop_index(op.f('ix_processingjob_celery_task_id'), table_name='processingjob') op.drop_table('processingjob') op.drop_table('project') # ### end Alembic commands ###