"""Dokumente-Modul (Roadmap Phase 5): polymorphe Datei-Anhänge (PDF/Bilder/ Prüfprotokolle/Wartungsberichte/Bedienungsanleitungen/Rechnungen/Zulassungs- dokumente) an beliebige Ressource. entitaet_typ/entitaet_id als String- Polymorphie, gleiches Muster wie historie.entitaet_typ/mangel.entitaet_typ (bewusst kein FK - Dokument bleibt lesbar, auch wenn die konkrete Ressource später gelöscht wird). Revision ID: 0016_dokument Revises: 0015_lagerbewegung Create Date: 2026-09-05 """ from typing import Sequence, Union from alembic import op revision: str = "0016_dokument" down_revision: Union[str, None] = "0015_lagerbewegung" branch_labels: Union[str, Sequence[str], None] = None depends_on: Union[str, Sequence[str], None] = None def upgrade() -> None: op.execute( """ CREATE TABLE dokument ( id UUID PRIMARY KEY DEFAULT gen_random_uuid(), entitaet_typ TEXT NOT NULL, entitaet_id TEXT NOT NULL, dateiname TEXT NOT NULL, speicherpfad TEXT NOT NULL, mime_type TEXT NOT NULL, groesse_bytes INTEGER NOT NULL, beschreibung TEXT, hochgeladen_von INTEGER NOT NULL REFERENCES benutzer(id), hochgeladen_am TIMESTAMPTZ NOT NULL ) """ ) op.execute("CREATE INDEX idx_dokument_entitaet ON dokument (entitaet_typ, entitaet_id)") def downgrade() -> None: op.execute("DROP TABLE dokument")