Vorschau erstellt

This commit is contained in:
2026-05-22 08:13:05 +02:00
parent ff386677a7
commit 19997b9f9d
4 changed files with 248 additions and 4 deletions
+45 -1
View File
@@ -1,16 +1,21 @@
import logging
from pathlib import Path
from django.contrib import messages
from django.contrib.auth.decorators import login_required
from django.http import FileResponse, Http404, HttpResponse
from django.shortcuts import get_object_or_404, redirect, render
from django.urls import reverse
from django.views.decorators.http import require_http_methods
from django.views.decorators.http import require_http_methods, require_POST
from .forms import LetterTemplateForm, MailMergeJobForm
from .models import LetterTemplate, MailMergeJob
from .services.docx_renderer import extract_placeholders
from .services.preview import PreviewError, build_preview
from .tasks import run_mailmerge
logger = logging.getLogger(__name__)
@login_required
def dashboard(request):
@@ -54,6 +59,45 @@ def job_create(request):
return render(request, "mailmerge/job_form.html", {"form": form})
@login_required
@require_POST
def job_preview(request):
"""Rendert nur die erste CSV-Zeile gegen das gewählte Template und
liefert das PDF inline aus. Persistiert nichts."""
form = MailMergeJobForm(request.POST, request.FILES)
if not form.is_valid():
# Form-Errors zurück ins Hauptformular leiten
return render(request, "mailmerge/job_form.html",
{"form": form, "preview_error": None})
template = form.cleaned_data["template"]
csv_upload = form.cleaned_data["recipients_csv"]
try:
result = build_preview(
template_path=Path(template.file.path),
csv_file=csv_upload,
)
except PreviewError as exc:
messages.error(request, str(exc))
return render(request, "mailmerge/job_form.html",
{"form": form, "preview_error": str(exc)})
except Exception as exc: # noqa: BLE001 defensiv, breite Fehlerklasse von LibreOffice
logger.exception("Preview-Render fehlgeschlagen")
messages.error(
request,
"Vorschau konnte nicht erstellt werden: " + str(exc),
)
return render(request, "mailmerge/job_form.html",
{"form": form, "preview_error": str(exc)})
response = HttpResponse(result.pdf_bytes, content_type="application/pdf")
response["Content-Disposition"] = 'inline; filename="vorschau.pdf"'
response["X-Preview-Placeholders"] = ",".join(result.placeholders)
response["X-Preview-Extra-Columns"] = ",".join(result.extra_columns)
return response
@login_required
def job_detail(request, pk):
job = get_object_or_404(