From 5c9db561586247ef3bb617dcebdd60ebc3d3da88 Mon Sep 17 00:00:00 2001 From: SysAdmin Agent Date: Thu, 12 Mar 2026 10:40:46 +0000 Subject: [PATCH] Fix DMS entity assignment and Geschichte document linking MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - DMS edit view: add Destinatär, Land, Pächter, Verpachtung dropdowns so documents can be assigned to entities after upload - Geschichte: add M2M dokumente field on GeschichteSeite model - Geschichte form: checkboxes to select/link Stiftungsgeschichte docs - Geschichte detail: show linked documents in sidebar with download Co-Authored-By: Claude Opus 4.6 --- .../0053_geschichte_dokumente_m2m.py | 18 +++++++ app/stiftung/models/geschichte.py | 8 +++ app/stiftung/views/dms.py | 21 ++++++++ app/stiftung/views/geschichte.py | 26 ++++++++-- app/templates/stiftung/dms/edit.html | 50 +++++++++++++++++++ app/templates/stiftung/geschichte/detail.html | 29 ++++++++++- app/templates/stiftung/geschichte/form.html | 27 +++++++--- 7 files changed, 167 insertions(+), 12 deletions(-) create mode 100644 app/stiftung/migrations/0053_geschichte_dokumente_m2m.py diff --git a/app/stiftung/migrations/0053_geschichte_dokumente_m2m.py b/app/stiftung/migrations/0053_geschichte_dokumente_m2m.py new file mode 100644 index 0000000..2b88c2c --- /dev/null +++ b/app/stiftung/migrations/0053_geschichte_dokumente_m2m.py @@ -0,0 +1,18 @@ +# Generated by Django 5.0.6 on 2026-03-12 10:40 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('stiftung', '0052_alter_dokumentdatei_kontext_and_more'), + ] + + operations = [ + migrations.AddField( + model_name='geschichteseite', + name='dokumente', + field=models.ManyToManyField(blank=True, related_name='geschichte_seiten', to='stiftung.dokumentdatei', verbose_name='Verknüpfte Dokumente'), + ), + ] diff --git a/app/stiftung/models/geschichte.py b/app/stiftung/models/geschichte.py index 08018ae..f4c53f0 100644 --- a/app/stiftung/models/geschichte.py +++ b/app/stiftung/models/geschichte.py @@ -36,6 +36,14 @@ class GeschichteSeite(models.Model): verbose_name="Aktualisiert von" ) + # Verknüpfte DMS-Dokumente + dokumente = models.ManyToManyField( + "DokumentDatei", + blank=True, + related_name="geschichte_seiten", + verbose_name="Verknüpfte Dokumente", + ) + # Options ist_veroeffentlicht = models.BooleanField(default=True, verbose_name="Veröffentlicht") sortierung = models.IntegerField(default=0, verbose_name="Sortierung") diff --git a/app/stiftung/views/dms.py b/app/stiftung/views/dms.py index 083ef21..b7ed0ef 100644 --- a/app/stiftung/views/dms.py +++ b/app/stiftung/views/dms.py @@ -247,13 +247,34 @@ def dms_edit(request, pk): dok.titel = request.POST.get("titel", dok.titel).strip()[:255] dok.beschreibung = request.POST.get("beschreibung", "").strip() dok.kontext = request.POST.get("kontext", dok.kontext) + + # Entity assignments + dest_id = request.POST.get("destinataer_id", "").strip() + land_id = request.POST.get("land_id", "").strip() + paechter_id = request.POST.get("paechter_id", "").strip() + verp_id = request.POST.get("verpachtung_id", "").strip() + + dok.destinataer_id = int(dest_id) if dest_id else None + dok.land_id = int(land_id) if land_id else None + dok.paechter_id = int(paechter_id) if paechter_id else None + dok.verpachtung_id = verp_id if verp_id else None + dok.save() dok.update_suchvektor() messages.success(request, "Metadaten gespeichert.") return redirect("stiftung:dms_detail", pk=dok.pk) + destinataere = Destinataer.objects.filter(aktiv=True).order_by("nachname", "vorname") + laendereien = Land.objects.filter(aktiv=True).order_by("lfd_nr") + paechter_qs = Paechter.objects.filter(aktiv=True).order_by("nachname") + verpachtungen = LandVerpachtung.objects.select_related("land", "paechter").order_by("-vertragsbeginn")[:50] + context = { "dok": dok, "kontext_choices": DokumentDatei.KONTEXT_CHOICES, + "destinataere": destinataere, + "laendereien": laendereien, + "paechter_qs": paechter_qs, + "verpachtungen": verpachtungen, } return render(request, "stiftung/dms/edit.html", context) diff --git a/app/stiftung/views/geschichte.py b/app/stiftung/views/geschichte.py index 76dc757..0618c8b 100644 --- a/app/stiftung/views/geschichte.py +++ b/app/stiftung/views/geschichte.py @@ -99,12 +99,19 @@ def geschichte_create(request): seite.erstellt_von = request.user seite.aktualisiert_von = request.user seite.save() - + form.save_m2m() + + # Link selected DMS documents + dok_ids = request.POST.getlist("dokument_ids") + if dok_ids: + from stiftung.models import DokumentDatei + seite.dokumente.set(DokumentDatei.objects.filter(pk__in=dok_ids)) + messages.success(request, f'Geschichtsseite "{seite.titel}" wurde erfolgreich erstellt.') return redirect('stiftung:geschichte_detail', slug=seite.slug) else: form = GeschichteSeiteForm() - + # Verfuegbare Stiftungsgeschichte-Dokumente aus DMS from stiftung.models import DokumentDatei geschichte_dokumente = DokumentDatei.objects.filter( @@ -115,6 +122,7 @@ def geschichte_create(request): 'form': form, 'title': 'Neue Geschichtsseite', 'geschichte_dokumente': geschichte_dokumente, + 'selected_dok_ids': [], } return render(request, 'stiftung/geschichte/form.html', context) @@ -135,23 +143,33 @@ def geschichte_edit(request, slug): seite = form.save(commit=False) seite.aktualisiert_von = request.user seite.save() - + form.save_m2m() + + # Update linked DMS documents + dok_ids = request.POST.getlist("dokument_ids") + from stiftung.models import DokumentDatei + seite.dokumente.set(DokumentDatei.objects.filter(pk__in=dok_ids)) + messages.success(request, f'Geschichtsseite "{seite.titel}" wurde erfolgreich aktualisiert.') return redirect('stiftung:geschichte_detail', slug=seite.slug) else: form = GeschichteSeiteForm(instance=seite) - + # Verfuegbare Stiftungsgeschichte-Dokumente aus DMS from stiftung.models import DokumentDatei geschichte_dokumente = DokumentDatei.objects.filter( kontext="stiftungsgeschichte" ).order_by("-erstellt_am")[:20] + # IDs der bereits verknuepften Dokumente + selected_dok_ids = list(seite.dokumente.values_list("pk", flat=True)) + context = { 'form': form, 'seite': seite, 'title': f'Bearbeiten: {seite.titel}', 'geschichte_dokumente': geschichte_dokumente, + 'selected_dok_ids': selected_dok_ids, } return render(request, 'stiftung/geschichte/form.html', context) diff --git a/app/templates/stiftung/dms/edit.html b/app/templates/stiftung/dms/edit.html index c1e81d6..4a6c2a6 100644 --- a/app/templates/stiftung/dms/edit.html +++ b/app/templates/stiftung/dms/edit.html @@ -41,6 +41,56 @@ + +
+
Zuordnung
+
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+
Abbrechen
+ {% if seite.dokumente.exists %} + + {% endif %} +
Weitere Seiten
-

Navigation zu anderen Geschichtsseiten wird hier angezeigt.

diff --git a/app/templates/stiftung/geschichte/form.html b/app/templates/stiftung/geschichte/form.html index 453ec60..53f6590 100644 --- a/app/templates/stiftung/geschichte/form.html +++ b/app/templates/stiftung/geschichte/form.html @@ -181,28 +181,41 @@ {% if geschichte_dokumente %}
-
Verfuegbare Geschichtsdokumente
+
Dokumente verknüpfen
{% for dok in geschichte_dokumente %} -
-
-
+
+ {% endfor %}
+
+ {% else %} +
+
+
Dokumente verknüpfen
+
+
+ Keine Stiftungsgeschichte-Dokumente im DMS vorhanden. Laden Sie Dokumente mit dem Kontext "Stiftungsgeschichte" im DMS hoch.
{% endif %}