From 25d35e555671011fc6e9e73ba299b852db2952e9 Mon Sep 17 00:00:00 2001 From: SimolZimol <70102430+SimolZimol@users.noreply.github.com> Date: Sun, 2 Aug 2026 21:36:11 +0200 Subject: [PATCH] modified: routes/journal_routes.py --- routes/journal_routes.py | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/routes/journal_routes.py b/routes/journal_routes.py index 35618ad..bc9db2e 100644 --- a/routes/journal_routes.py +++ b/routes/journal_routes.py @@ -8,6 +8,7 @@ import io import json import calendar from datetime import date, datetime, timedelta +from urllib.parse import urlencode from flask import ( Blueprint, render_template, request, redirect, url_for, @@ -439,9 +440,12 @@ def month(): def _csv_response(title: str, filename: str, rows: list[dict]) -> Response: - """Baut eine CSV-Datei als HTTP-Antwort zusammen.""" + """Baut eine CSV-Datei als HTTP-Antwort zusammen. + + Trennzeichen: Semikolon (deutsches Excel erwartet ';' statt Komma). + """ output = io.StringIO() - writer = csv.writer(output) + writer = csv.writer(output, delimiter=";") writer.writerow([ "Datum", "Wochentag", "Bullet", "Typ", "Notiz", "Priorität", "Status", "Verweise", @@ -534,19 +538,13 @@ def report(): today = date.today() # Für Export-Links: aktuelle Filter als Query-String aufbauen + # (urlencode erhält wiederholte Parameter wie wd=0&wd=1 – dict() würde sie kollabieren) def _qs(fmt): - params = [ - ("range", filters["range_type"]), - ("format", fmt), - ] - for wd in filters["weekdays"]: - params.append(("wd", str(wd))) - for b in filters["bullets"]: - params.append(("bullet", b)) - for s in filters["statuses"]: - params.append(("status", s)) - for p in filters["priorities"]: - params.append(("priority", str(p))) + params = [("range", filters["range_type"]), ("format", fmt)] + params += [("wd", str(wd)) for wd in filters["weekdays"]] + params += [("bullet", b) for b in filters["bullets"]] + params += [("status", s) for s in filters["statuses"]] + params += [("priority", str(p)) for p in filters["priorities"]] if filters["range_type"] == "month": params.append(("month", filters["start"].strftime("%Y-%m"))) elif filters["range_type"] == "custom": @@ -554,7 +552,7 @@ def report(): params.append(("to", filters["end"].strftime("%Y-%m-%d"))) else: params.append(("week", filters["start"].strftime("%G-W%V"))) - return url_for("journal.report_export", **dict(params)) + return url_for("journal.report_export") + "?" + urlencode(params) export_csv_url = _qs("csv") export_pdf_url = _qs("pdf") @@ -608,9 +606,9 @@ def report_export(): }, ) - # CSV + # CSV – Semikolon als Trennzeichen (deutsches Excel erwartet ';') output = io.StringIO() - writer = csv.writer(output) + writer = csv.writer(output, delimiter=";") writer.writerow([ "Datum", "Wochentag", "Bullet", "Typ", "Notiz", "Priorität", "Status", "Verweise",