48 lines
1.2 KiB
Python
48 lines
1.2 KiB
Python
|
|
"""Add deleted_at column to core tables that don't have it yet.
|
||
|
|
|
||
|
|
Revision ID: 0012_soft_delete
|
||
|
|
Revises: 0011_attachments
|
||
|
|
Create Date: 2026-07-04
|
||
|
|
"""
|
||
|
|
|
||
|
|
from __future__ import annotations
|
||
|
|
|
||
|
|
from typing import Sequence, Union
|
||
|
|
|
||
|
|
from alembic import op
|
||
|
|
import sqlalchemy as sa
|
||
|
|
|
||
|
|
revision: str = "0012_soft_delete"
|
||
|
|
down_revision: Union[str, None] = "0011_attachments"
|
||
|
|
branch_labels: Union[str, Sequence[str], None] = None
|
||
|
|
depends_on: Union[str, Sequence[str], None] = None
|
||
|
|
|
||
|
|
# Core tables that need deleted_at added
|
||
|
|
# Excludes: audit_log (immutable), deletion_log (already has it),
|
||
|
|
# tenants (top-level), user_tenants (join table with cascade delete)
|
||
|
|
TABLES_NEEDING_SOFT_DELETE = [
|
||
|
|
"users",
|
||
|
|
"roles",
|
||
|
|
"sessions",
|
||
|
|
"notifications",
|
||
|
|
"ai_conversations",
|
||
|
|
"ai_messages",
|
||
|
|
"workflows",
|
||
|
|
"workflow_instances",
|
||
|
|
"workflow_step_history",
|
||
|
|
"company_contacts",
|
||
|
|
]
|
||
|
|
|
||
|
|
|
||
|
|
def upgrade() -> None:
|
||
|
|
for table_name in TABLES_NEEDING_SOFT_DELETE:
|
||
|
|
op.add_column(
|
||
|
|
table_name,
|
||
|
|
sa.Column("deleted_at", sa.DateTime(timezone=True), nullable=True),
|
||
|
|
)
|
||
|
|
|
||
|
|
|
||
|
|
def downgrade() -> None:
|
||
|
|
for table_name in reversed(TABLES_NEEDING_SOFT_DELETE):
|
||
|
|
op.drop_column(table_name, "deleted_at")
|