migration: add missing deleted_at columns to 9 TenantMixin tables (0083)
This commit is contained in:
@@ -0,0 +1,53 @@
|
|||||||
|
"""Add missing deleted_at columns to TenantMixin tables.
|
||||||
|
|
||||||
|
Several models inherit TenantMixin (which includes SoftDeleteMixin)
|
||||||
|
but their DB tables were never migrated to include the deleted_at column.
|
||||||
|
This causes 500 errors when SQLAlchemy tries to SELECT deleted_at.
|
||||||
|
|
||||||
|
Revision ID: 0083
|
||||||
|
Revises: 0082
|
||||||
|
"""
|
||||||
|
from alembic import op
|
||||||
|
import sqlalchemy as sa
|
||||||
|
|
||||||
|
revision = "0083"
|
||||||
|
down_revision = "0082"
|
||||||
|
branch_labels = None
|
||||||
|
depends_on = None
|
||||||
|
|
||||||
|
# Tables that use TenantMixin (and therefore SoftDeleteMixin) in their models
|
||||||
|
# but are missing the deleted_at column in the database.
|
||||||
|
TABLES_NEEDING_DELETED_AT = [
|
||||||
|
"contact_folder_permissions",
|
||||||
|
"permission_delegations",
|
||||||
|
"guest_users",
|
||||||
|
"entity_policies",
|
||||||
|
"notification_types",
|
||||||
|
"password_reset_tokens",
|
||||||
|
"api_tokens",
|
||||||
|
"permission_templates",
|
||||||
|
"user_groups",
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade() -> None:
|
||||||
|
conn = op.get_bind()
|
||||||
|
for table_name in TABLES_NEEDING_DELETED_AT:
|
||||||
|
# Check if column already exists before adding
|
||||||
|
result = conn.execute(sa.text(
|
||||||
|
"SELECT 1 FROM information_schema.columns "
|
||||||
|
"WHERE table_name = :t AND column_name = 'deleted_at'"
|
||||||
|
), {"t": table_name})
|
||||||
|
if result.scalar() is None:
|
||||||
|
op.add_column(
|
||||||
|
table_name,
|
||||||
|
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
|
||||||
|
)
|
||||||
|
print(f" Added deleted_at to {table_name}")
|
||||||
|
else:
|
||||||
|
print(f" Skipped {table_name} (already has deleted_at)")
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade() -> None:
|
||||||
|
for table_name in reversed(TABLES_NEEDING_DELETED_AT):
|
||||||
|
op.drop_column(table_name, "deleted_at")
|
||||||
Reference in New Issue
Block a user