51 lines
2.6 KiB
Python
51 lines
2.6 KiB
Python
"""Add video_consents and consent_audit_log tables for per-video consent management.
|
|
|
|
Revision ID: 017_add_consent_tables
|
|
Revises: 016_add_users_and_invite_codes
|
|
"""
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.dialects.postgresql import UUID
|
|
|
|
revision = "017_add_consent_tables"
|
|
down_revision = "016_add_users_and_invite_codes"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# Create video_consents table
|
|
op.create_table(
|
|
"video_consents",
|
|
sa.Column("id", UUID(as_uuid=True), primary_key=True, server_default=sa.func.gen_random_uuid()),
|
|
sa.Column("source_video_id", UUID(as_uuid=True), sa.ForeignKey("source_videos.id", ondelete="CASCADE"), nullable=False),
|
|
sa.Column("creator_id", UUID(as_uuid=True), sa.ForeignKey("creators.id", ondelete="CASCADE"), nullable=False),
|
|
sa.Column("kb_inclusion", sa.Boolean(), nullable=False, server_default="false"),
|
|
sa.Column("training_usage", sa.Boolean(), nullable=False, server_default="false"),
|
|
sa.Column("public_display", sa.Boolean(), nullable=False, server_default="true"),
|
|
sa.Column("updated_by", UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="RESTRICT"), nullable=False),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.now()),
|
|
sa.Column("updated_at", sa.DateTime(), nullable=False, server_default=sa.func.now()),
|
|
sa.UniqueConstraint("source_video_id", name="uq_video_consent_video"),
|
|
)
|
|
|
|
# Create consent_audit_log table
|
|
op.create_table(
|
|
"consent_audit_log",
|
|
sa.Column("id", UUID(as_uuid=True), primary_key=True, server_default=sa.func.gen_random_uuid()),
|
|
sa.Column("video_consent_id", UUID(as_uuid=True), sa.ForeignKey("video_consents.id", ondelete="CASCADE"), nullable=False),
|
|
sa.Column("version", sa.Integer(), nullable=False),
|
|
sa.Column("field_name", sa.String(50), nullable=False),
|
|
sa.Column("old_value", sa.Boolean(), nullable=True),
|
|
sa.Column("new_value", sa.Boolean(), nullable=False),
|
|
sa.Column("changed_by", UUID(as_uuid=True), sa.ForeignKey("users.id", ondelete="RESTRICT"), nullable=False),
|
|
sa.Column("ip_address", sa.String(45), nullable=True),
|
|
sa.Column("created_at", sa.DateTime(), nullable=False, server_default=sa.func.now()),
|
|
)
|
|
op.create_index("ix_consent_audit_log_video_consent_id", "consent_audit_log", ["video_consent_id"])
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_index("ix_consent_audit_log_video_consent_id", table_name="consent_audit_log")
|
|
op.drop_table("consent_audit_log")
|
|
op.drop_table("video_consents")
|