Add Vorlagen editor, upload portal, onboarding, and participant import command
- Dokument-Vorlagen-Editor: create/edit/reset document templates (admin) - Upload-Portal: public portal for Nachweis uploads via token - Onboarding: invite Destinatäre via email with multi-step wizard - Bestätigungsschreiben: preview and send confirmation letters - Email settings: SMTP configuration UI - Management command: import_veranstaltung_teilnehmer for bulk participant import Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
54
app/stiftung/models/vorlagen.py
Normal file
54
app/stiftung/models/vorlagen.py
Normal file
@@ -0,0 +1,54 @@
|
||||
import uuid
|
||||
|
||||
from django.contrib.auth.models import User
|
||||
from django.db import models
|
||||
|
||||
|
||||
class DokumentVorlage(models.Model):
|
||||
"""Web-editierbare Vorlagen für generierte Dokumente (PDF, E-Mail, Berichte)."""
|
||||
|
||||
KATEGORIE_CHOICES = [
|
||||
("pdf", "PDF-Dokument"),
|
||||
("email", "E-Mail"),
|
||||
("bericht", "Bericht"),
|
||||
("serienbrief", "Serienbrief"),
|
||||
]
|
||||
|
||||
id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
|
||||
schluessel = models.CharField(
|
||||
max_length=200,
|
||||
unique=True,
|
||||
verbose_name="Schlüssel",
|
||||
help_text="Interner Template-Pfad, z.B. pdf/bestaetigung.html",
|
||||
)
|
||||
bezeichnung = models.CharField(max_length=200, verbose_name="Bezeichnung")
|
||||
kategorie = models.CharField(
|
||||
max_length=30,
|
||||
choices=KATEGORIE_CHOICES,
|
||||
verbose_name="Kategorie",
|
||||
)
|
||||
html_inhalt = models.TextField(verbose_name="HTML-Inhalt")
|
||||
verfuegbare_variablen = models.JSONField(
|
||||
default=dict,
|
||||
blank=True,
|
||||
verbose_name="Verfügbare Variablen",
|
||||
help_text="JSON-Dokumentation der verfügbaren Template-Variablen",
|
||||
)
|
||||
zuletzt_bearbeitet_von = models.ForeignKey(
|
||||
User,
|
||||
null=True,
|
||||
blank=True,
|
||||
on_delete=models.SET_NULL,
|
||||
related_name="bearbeitete_vorlagen",
|
||||
verbose_name="Zuletzt bearbeitet von",
|
||||
)
|
||||
zuletzt_bearbeitet_am = models.DateTimeField(auto_now=True, verbose_name="Zuletzt bearbeitet")
|
||||
erstellt_am = models.DateTimeField(auto_now_add=True, verbose_name="Erstellt am")
|
||||
|
||||
class Meta:
|
||||
verbose_name = "Dokument-Vorlage"
|
||||
verbose_name_plural = "Dokument-Vorlagen"
|
||||
ordering = ["kategorie", "bezeichnung"]
|
||||
|
||||
def __str__(self):
|
||||
return f"{self.bezeichnung} ({self.schluessel})"
|
||||
Reference in New Issue
Block a user