"""create class memberships table if missing Revision ID: 20260427_create_memberships Revises: 20260426_remove_legacy Create Date: 2026-04-27 10:45:00 """ from __future__ import annotations from alembic import op import sqlalchemy as sa revision = "20260427_create_memberships" down_revision = "20260426_remove_legacy" branch_labels = None depends_on = None def upgrade() -> None: bind = op.get_bind() inspector = sa.inspect(bind) if "class_memberships" not in set(inspector.get_table_names()): op.create_table( "class_memberships", sa.Column("id", sa.Integer(), autoincrement=True, nullable=False), sa.Column("user_id", sa.Integer(), nullable=False), sa.Column("class_id", sa.Integer(), nullable=False), sa.Column("membership_role", sa.String(length=20), nullable=False, server_default="student"), sa.Column("committee_role", sa.String(length=50), nullable=True), sa.Column("class_permissions", sa.Text(), nullable=True), sa.Column("created_at", sa.DateTime(), server_default=sa.func.now(), nullable=False), sa.Column("updated_at", sa.DateTime(), server_default=sa.func.now(), nullable=False), sa.ForeignKeyConstraint(["user_id"], ["users.id"]), sa.ForeignKeyConstraint(["class_id"], ["classes.id"]), sa.PrimaryKeyConstraint("id"), sa.UniqueConstraint("user_id", "class_id", name="uq_class_membership_user_class"), ) op.create_index("ix_class_memberships_user_id", "class_memberships", ["user_id"]) op.create_index("ix_class_memberships_class_id", "class_memberships", ["class_id"]) def downgrade() -> None: bind = op.get_bind() inspector = sa.inspect(bind) tables = set(inspector.get_table_names()) if "class_memberships" in tables: indexes = {index["name"] for index in inspector.get_indexes("class_memberships")} if "ix_class_memberships_class_id" in indexes: op.drop_index("ix_class_memberships_class_id", table_name="class_memberships") if "ix_class_memberships_user_id" in indexes: op.drop_index("ix_class_memberships_user_id", table_name="class_memberships") op.drop_table("class_memberships")