feat(dokumente): DOC-001 Duplikat-Erkennung + Fix Online-Ansicht (Popup-Blocker)
Duplikat-Erkennung: SHA-256-Hash je Dokument (Migration 0024), Upload wird mit 409 abgelehnt, wenn dieselbe Datei bereits an derselben Entität liegt (Vergleich bewusst pro Entität, nicht global - gleiche Datei an zwei Objekten ist kein Duplikat). Frontend zeigt die Backend-Fehlermeldung (Dateiname/Datum des bestehenden Dokuments) statt generischem Text. Nebenbei gefunden+gefixt: "Ansehen" (PDF/JPG/PNG online statt Download) funktionierte nicht zuverlässig, weil window.open() erst nach einem await fetch() aufgerufen wurde - Popup-Blocker werten das nicht mehr als direkte Nutzeraktion. Jetzt öffnet der Tab sofort synchron, die Blob-URL wird nachgeladen. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CVgbozhYmuEhiEJHffRXCV
This commit is contained in:
@@ -0,0 +1,30 @@
|
||||
"""DOC-001: SHA-256-Hash am Dokument für Duplikat-Erkennung beim Upload.
|
||||
|
||||
Revision ID: 0024_dokument_hash
|
||||
Revises: 0023_suchindex
|
||||
Create Date: 2026-09-08
|
||||
"""
|
||||
from typing import Sequence, Union
|
||||
|
||||
from alembic import op
|
||||
|
||||
revision: str = "0024_dokument_hash"
|
||||
down_revision: Union[str, None] = "0023_suchindex"
|
||||
branch_labels: Union[str, Sequence[str], None] = None
|
||||
depends_on: Union[str, Sequence[str], None] = None
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
# Nullable: Altbestand vor dieser Migration hat keinen Hash (nachträgliche
|
||||
# Befüllung würde Dateizugriff je Dokument brauchen, kein Datenverlust-
|
||||
# Risiko - Duplikatprüfung greift nur für Dokumente, die NACH dieser
|
||||
# Migration hochgeladen werden).
|
||||
op.execute("ALTER TABLE dokument ADD COLUMN dateihash VARCHAR(64)")
|
||||
op.execute(
|
||||
"CREATE INDEX ix_dokument_entitaet_hash ON dokument (entitaet_typ, entitaet_id, dateihash)"
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
op.execute("DROP INDEX IF EXISTS ix_dokument_entitaet_hash")
|
||||
op.execute("ALTER TABLE dokument DROP COLUMN dateihash")
|
||||
Reference in New Issue
Block a user