"""project rule + topic suppressions Revision ID: 0060 Revises: 0059 Create Date: 2026-06-01 Lets a project mute specific rules or whole topics from rulebooks it subscribes to, without unsubscribing the rulebook. Two pure many-to-many association tables; FKs CASCADE so removing a project / rule / topic cleans the suppression rows automatically. """ from alembic import op import sqlalchemy as sa revision = "0060" down_revision = "0059" branch_labels = None depends_on = None def upgrade() -> None: op.create_table( "project_rule_suppressions", sa.Column( "project_id", sa.BigInteger(), sa.ForeignKey("projects.id", ondelete="CASCADE"), primary_key=True, nullable=False, ), sa.Column( "rule_id", sa.BigInteger(), sa.ForeignKey("rules.id", ondelete="CASCADE"), primary_key=True, nullable=False, ), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), ) op.create_table( "project_topic_suppressions", sa.Column( "project_id", sa.BigInteger(), sa.ForeignKey("projects.id", ondelete="CASCADE"), primary_key=True, nullable=False, ), sa.Column( "topic_id", sa.BigInteger(), sa.ForeignKey("rulebook_topics.id", ondelete="CASCADE"), primary_key=True, nullable=False, ), sa.Column( "created_at", sa.DateTime(timezone=True), server_default=sa.text("now()"), nullable=False, ), ) def downgrade() -> None: op.drop_table("project_topic_suppressions") op.drop_table("project_rule_suppressions")