"""RTC central write modes per installation, candidate preview/approval table, richer audit + rollback tracking. Revision ID: 0028_rtc_write_modes Revises: 0027_rtc_auto_apply """ from alembic import op import sqlalchemy as sa revision = "0028_rtc_write_modes" down_revision = "0027_rtc_auto_apply" branch_labels = None depends_on = None def upgrade(): op.add_column("installations", sa.Column("rtc_write_mode", sa.String(24), nullable=False, server_default="DISABLED")) op.execute("UPDATE installations SET rtc_write_mode = 'ENABLED' WHERE rtc_auto_apply_authorized") # keeps an existing explicit authorization for name, kind in (("rule_version", sa.String(32)), ("company_crt", sa.String(8)), ("authorization_origin", sa.String(48)), ("description_snapshot", sa.String(255)), ("installation_uuid", sa.String(64)), ("rtc_status", sa.String(24)), ("action", sa.String(16)), ("rollback_state", sa.String(16)), ("rollback_of", sa.Integer()), ("local_catalog_state", sa.String(32))): op.add_column("rtc_write_audits", sa.Column(name, kind, nullable=True)) op.create_index("ix_rtc_write_audits_rollback_of", "rtc_write_audits", ["rollback_of"]) op.create_table( "rtc_candidates", sa.Column("id", sa.Integer(), primary_key=True), sa.Column("tenant_id", sa.Integer(), sa.ForeignKey("tenants.id"), nullable=False, index=True), sa.Column("installation_id", sa.Integer(), sa.ForeignKey("installations.id"), nullable=False, index=True), sa.Column("product_code", sa.String(64), nullable=False), sa.Column("description", sa.String(255), nullable=True), sa.Column("ncm", sa.String(16), nullable=True), sa.Column("current_value", sa.String(16), nullable=True), sa.Column("proposed", sa.String(16), nullable=False), sa.Column("cst_ibscbs", sa.String(8), nullable=True), sa.Column("rule_id", sa.String(32), nullable=False), sa.Column("basis", sa.String(255), nullable=True), sa.Column("status", sa.String(16), nullable=False, server_default="PENDING", index=True), sa.Column("updated_at", sa.DateTime(timezone=True), server_default=sa.func.now()), sa.UniqueConstraint("installation_id", "product_code", name="uq_rtc_candidate_product"), ) def downgrade(): op.drop_table("rtc_candidates") op.drop_index("ix_rtc_write_audits_rollback_of", table_name="rtc_write_audits") for name in ("rule_version", "company_crt", "authorization_origin", "description_snapshot", "installation_uuid", "rtc_status", "action", "rollback_state", "rollback_of", "local_catalog_state"): op.drop_column("rtc_write_audits", name) op.drop_column("installations", "rtc_write_mode")