import uuid import django.db.models.deletion from django.conf import settings from django.db import migrations, models def seed_vorlagen(apps, schema_editor): """Seed initial DokumentVorlage records from file templates.""" import os from django.template.loader import get_template from django.template import TemplateDoesNotExist DokumentVorlage = apps.get_model("stiftung", "DokumentVorlage") # Map: (schluessel, bezeichnung, kategorie, variablen) vorlagen_def = [ ( "pdf/bestaetigung.html", "Bestätigung PDF", "pdf", { "destinataer.vorname": "Vorname", "destinataer.nachname": "Nachname", "destinataer.anrede": "Anrede (Herr/Frau)", "destinataer.strasse": "Straße", "destinataer.plz": "PLZ", "destinataer.ort": "Ort", "betrag_quartal": "Betrag pro Quartal", "betrag_jaehrlich": "Jährlicher Betrag", "zeitraum": "Förderzeitraum", "zweck": "Förderzweck", "unterstuetzungen": "Liste der Unterstützungen", "gesamtbetrag": "Gesamtbetrag", "datum": "Datum der Erstellung", }, ), ( "email/bestaetigung.html", "Bestätigung E-Mail (HTML)", "email", { "destinataer.vorname": "Vorname", "destinataer.nachname": "Nachname", "destinataer.anrede": "Anrede", "zeitraum": "Förderzeitraum", "gesamtbetrag": "Gesamtbetrag", "datum": "Datum", }, ), ( "email/nachweis_aufforderung.html", "Nachweis-Aufforderung E-Mail (HTML)", "email", { "destinataer.vorname": "Vorname", "destinataer.nachname": "Nachname", "halbjahr_label": "Halbjahr-Bezeichnung", "upload_url": "Upload-URL", "gueltig_bis": "Gültig bis", "qr_code_base64": "QR-Code (base64)", "ist_erinnerung": "True wenn Erinnerung", }, ), ( "email/nachweis_aufforderung.txt", "Nachweis-Aufforderung E-Mail (Text)", "email", { "destinataer.vorname": "Vorname", "destinataer.nachname": "Nachname", "halbjahr_label": "Halbjahr-Bezeichnung", "upload_url": "Upload-URL", "gueltig_bis": "Gültig bis", "ist_erinnerung": "True wenn Erinnerung", }, ), ( "email/onboarding_einladung.html", "Onboarding-Einladung E-Mail (HTML)", "email", { "einladung.vorname": "Vorname", "einladung.nachname": "Nachname", "onboarding_url": "Onboarding-URL", "gueltig_bis": "Gültig bis", }, ), ( "email/onboarding_einladung.txt", "Onboarding-Einladung E-Mail (Text)", "email", { "einladung.vorname": "Vorname", "einladung.nachname": "Nachname", "onboarding_url": "Onboarding-URL", "gueltig_bis": "Gültig bis", }, ), ] templates_dir = os.path.join(settings.BASE_DIR, "templates") for schluessel, bezeichnung, kategorie, variablen in vorlagen_def: template_path = os.path.join(templates_dir, schluessel) if os.path.exists(template_path): with open(template_path, "r", encoding="utf-8") as f: html_inhalt = f.read() DokumentVorlage.objects.get_or_create( schluessel=schluessel, defaults={ "bezeichnung": bezeichnung, "kategorie": kategorie, "html_inhalt": html_inhalt, "verfuegbare_variablen": variablen, }, ) class Migration(migrations.Migration): dependencies = [ ("stiftung", "0060_portal_upload_token_onboarding"), migrations.swappable_dependency(settings.AUTH_USER_MODEL), ] operations = [ migrations.CreateModel( name="DokumentVorlage", fields=[ ("id", models.UUIDField(default=uuid.uuid4, editable=False, primary_key=True, serialize=False)), ("schluessel", models.CharField(help_text="Interner Template-Pfad, z.B. pdf/bestaetigung.html", max_length=200, unique=True, verbose_name="Schlüssel")), ("bezeichnung", models.CharField(max_length=200, verbose_name="Bezeichnung")), ("kategorie", models.CharField( choices=[("pdf", "PDF-Dokument"), ("email", "E-Mail"), ("bericht", "Bericht"), ("serienbrief", "Serienbrief")], max_length=30, verbose_name="Kategorie", )), ("html_inhalt", models.TextField(verbose_name="HTML-Inhalt")), ("verfuegbare_variablen", models.JSONField(blank=True, default=dict, help_text="JSON-Dokumentation der verfügbaren Template-Variablen", verbose_name="Verfügbare Variablen")), ("zuletzt_bearbeitet_am", models.DateTimeField(auto_now=True, verbose_name="Zuletzt bearbeitet")), ("erstellt_am", models.DateTimeField(auto_now_add=True, verbose_name="Erstellt am")), ("zuletzt_bearbeitet_von", models.ForeignKey( blank=True, null=True, on_delete=django.db.models.deletion.SET_NULL, related_name="bearbeitete_vorlagen", to=settings.AUTH_USER_MODEL, verbose_name="Zuletzt bearbeitet von", )), ], options={ "verbose_name": "Dokument-Vorlage", "verbose_name_plural": "Dokument-Vorlagen", "ordering": ["kategorie", "bezeichnung"], }, ), migrations.RunPython(seed_vorlagen, migrations.RunPython.noop), ]