Fascicoli+Tassonomia+permessi

This commit is contained in:
2026-06-17 21:47:46 +02:00
parent e31676d22e
commit 3fd3c72f06
42 changed files with 4554 additions and 99 deletions
@@ -0,0 +1,77 @@
"""
Migrazione 0019: Tabella permission_presets (sottoruoli/template permessi).
Aggiunge la tabella `permission_presets` che consente ad admin e supervisor
di definire template nominati di permessi riutilizzabili (es. "Operatore Archivio",
"Operatore Invio", ecc.) da applicare agli operatori sulle caselle PEC.
"""
from alembic import op
import sqlalchemy as sa
from sqlalchemy.dialects import postgresql
revision = "0019"
down_revision = "0018"
branch_labels = None
depends_on = None
def upgrade() -> None:
op.create_table(
"permission_presets",
sa.Column(
"id",
postgresql.UUID(as_uuid=True),
primary_key=True,
server_default=sa.text("gen_random_uuid()"),
nullable=False,
),
sa.Column(
"tenant_id",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("tenants.id", ondelete="CASCADE"),
nullable=False,
),
sa.Column("name", sa.String(100), nullable=False),
sa.Column("description", sa.Text(), nullable=True),
sa.Column("can_read", sa.Boolean(), nullable=False, server_default="true"),
sa.Column("can_send", sa.Boolean(), nullable=False, server_default="false"),
sa.Column("can_manage", sa.Boolean(), nullable=False, server_default="false"),
sa.Column("can_conserve", sa.Boolean(), nullable=False, server_default="false"),
sa.Column(
"created_by",
postgresql.UUID(as_uuid=True),
sa.ForeignKey("users.id", ondelete="SET NULL"),
nullable=True,
),
sa.Column(
"created_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.text("now()"),
),
sa.Column(
"updated_at",
sa.DateTime(timezone=True),
nullable=False,
server_default=sa.text("now()"),
),
)
# Unicita' nome per tenant
op.create_unique_constraint(
"uq_preset_name_tenant",
"permission_presets",
["tenant_id", "name"],
)
# Indici
op.create_index("idx_preset_tenant", "permission_presets", ["tenant_id"])
op.create_index("idx_preset_created_by", "permission_presets", ["created_by"])
def downgrade() -> None:
op.drop_index("idx_preset_created_by", table_name="permission_presets")
op.drop_index("idx_preset_tenant", table_name="permission_presets")
op.drop_constraint("uq_preset_name_tenant", "permission_presets", type_="unique")
op.drop_table("permission_presets")