Vorschau erstellt
This commit is contained in:
+45
-1
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user