81 lines
2.8 KiB
Python
81 lines
2.8 KiB
Python
"""
|
|
Migrazione 0018: Livello di Rischio e Riservatezza per Comunicazione (Feature N3).
|
|
|
|
Aggiunge alla tabella `messages`:
|
|
- risk_level ENUM(low, medium, high, critical) nullable
|
|
- confidentiality ENUM(public, internal, confidential, secret) nullable
|
|
|
|
Entrambi i campi sono nullable: rimangono NULL finche' non vengono
|
|
impostati manualmente o da una regola di smistamento (set_risk_level /
|
|
set_confidentiality).
|
|
"""
|
|
|
|
from alembic import op
|
|
import sqlalchemy as sa
|
|
from sqlalchemy.dialects import postgresql
|
|
|
|
revision = "0018"
|
|
down_revision = "0017"
|
|
branch_labels = None
|
|
depends_on = None
|
|
|
|
|
|
def upgrade() -> None:
|
|
# ── Crea i nuovi ENUM types ─────────────────────────────────────────────────
|
|
risk_level_enum = postgresql.ENUM(
|
|
"low", "medium", "high", "critical",
|
|
name="risk_level",
|
|
create_type=True,
|
|
)
|
|
confidentiality_enum = postgresql.ENUM(
|
|
"public", "internal", "confidential", "secret",
|
|
name="confidentiality_level",
|
|
create_type=True,
|
|
)
|
|
risk_level_enum.create(op.get_bind(), checkfirst=True)
|
|
confidentiality_enum.create(op.get_bind(), checkfirst=True)
|
|
|
|
# ── Aggiunge le colonne a messages ──────────────────────────────────────────
|
|
op.add_column(
|
|
"messages",
|
|
sa.Column(
|
|
"risk_level",
|
|
sa.Enum("low", "medium", "high", "critical", name="risk_level", create_type=False),
|
|
nullable=True,
|
|
),
|
|
)
|
|
op.add_column(
|
|
"messages",
|
|
sa.Column(
|
|
"confidentiality",
|
|
sa.Enum("public", "internal", "confidential", "secret", name="confidentiality_level", create_type=False),
|
|
nullable=True,
|
|
),
|
|
)
|
|
|
|
# ── Indici per filtrare rapidamente per rischio/riservatezza ────────────────
|
|
op.create_index(
|
|
"idx_messages_risk_level",
|
|
"messages",
|
|
["tenant_id", "risk_level"],
|
|
postgresql_where=sa.text("risk_level IS NOT NULL"),
|
|
)
|
|
op.create_index(
|
|
"idx_messages_confidentiality",
|
|
"messages",
|
|
["tenant_id", "confidentiality"],
|
|
postgresql_where=sa.text("confidentiality IS NOT NULL"),
|
|
)
|
|
|
|
|
|
def downgrade() -> None:
|
|
op.drop_index("idx_messages_confidentiality", table_name="messages")
|
|
op.drop_index("idx_messages_risk_level", table_name="messages")
|
|
op.drop_column("messages", "confidentiality")
|
|
op.drop_column("messages", "risk_level")
|
|
|
|
risk_level_enum = postgresql.ENUM(name="risk_level")
|
|
confidentiality_enum = postgresql.ENUM(name="confidentiality_level")
|
|
risk_level_enum.drop(op.get_bind(), checkfirst=True)
|
|
confidentiality_enum.drop(op.get_bind(), checkfirst=True)
|