"""Utility für das Rendering von Dokument-Vorlagen. Prüft zuerst die Datenbank (DokumentVorlage), fällt dann auf die Datei-Vorlage zurück. """ from django.template import Context, Engine, Template from django.template.loader import render_to_string def render_vorlage(template_name: str, context: dict, request=None) -> str: """Rendert eine Vorlage. Schaut zuerst in der DB nach (DokumentVorlage), fällt auf die Datei zurück. Args: template_name: Template-Pfad, z.B. "pdf/bestaetigung.html" context: Template-Kontext-Dictionary request: Optionaler Request (für RequestContext) Returns: Gerenderter HTML-String """ from stiftung.models import DokumentVorlage try: vorlage = DokumentVorlage.objects.get(schluessel=template_name) # Eigene Engine mit den Standard-Builtins, aber ohne Dateisystem-Loader engine = Engine.get_default() t = engine.from_string(vorlage.html_inhalt) return t.render(Context(context)) except DokumentVorlage.DoesNotExist: pass # Fallback: Datei-Template return render_to_string(template_name, context, request=request) def get_vorlage_original(template_name: str) -> str: """Liest den Original-Dateiinhalt einer Vorlage (für Reset-Funktion).""" from django.template.loaders.filesystem import Loader from django.template import Engine engine = Engine.get_default() for loader in engine.template_loaders: try: source, _ = loader.get_contents_and_origin(template_name) return source except Exception: # Try get_template_sources try: for origin in loader.get_template_sources(template_name): try: with open(origin.name, "r", encoding="utf-8") as f: return f.read() except OSError: continue except Exception: continue raise FileNotFoundError(f"Template-Datei nicht gefunden: {template_name}")