From 031a280a6293c18463df6c852609c8cc9d109014 Mon Sep 17 00:00:00 2001 From: Floke Date: Fri, 20 Mar 2026 12:43:33 +0000 Subject: [PATCH] feat(list-generator): add logo to pdf header [32788f42] --- .../backend/app/services/pdf_generator.py | 21 +++++++++++++++++- .../backend/app/templates/school_list.html | 20 +++++++++++++++-- list-generator/backend/assets/logo.png | Bin 0 -> 19210 bytes 3 files changed, 38 insertions(+), 3 deletions(-) create mode 100644 list-generator/backend/assets/logo.png diff --git a/list-generator/backend/app/services/pdf_generator.py b/list-generator/backend/app/services/pdf_generator.py index b4ab4093..80a51baf 100644 --- a/list-generator/backend/app/services/pdf_generator.py +++ b/list-generator/backend/app/services/pdf_generator.py @@ -3,6 +3,16 @@ import os from jinja2 import Environment, FileSystemLoader from weasyprint import HTML import datetime +import base64 + +def get_logo_base64(): + logo_path = os.path.join(os.path.dirname(__file__), "..", "..", "assets", "logo.png") + try: + with open(logo_path, "rb") as image_file: + return base64.b64encode(image_file.read()).decode('utf-8') + except FileNotFoundError: + print(f"Warning: Logo file not found at {logo_path}") + return None def generate_school_pdf(institution: str, date_info: str, list_type: str, students_csv_path: str, families_csv_path: str = None, output_dir: str = "/tmp") -> str: df = None @@ -43,7 +53,16 @@ def generate_school_pdf(institution: str, date_info: str, list_type: str, studen env = Environment(loader=FileSystemLoader(template_dir)) template = env.get_template("school_list.html") current_time = datetime.datetime.now().strftime("%d.%m.%Y %H:%M Uhr") - html_out = template.render(institution=institution, date_info=date_info, class_counts=class_counts, total_students=total_students, class_data=class_data, current_time=current_time) + logo_base64 = get_logo_base64() + html_out = template.render( + institution=institution, + date_info=date_info, + class_counts=class_counts, + total_students=total_students, + class_data=class_data, + current_time=current_time, + logo_base64=logo_base64 + ) clean_inst = institution.replace(" ", "_").replace("/", "-") time_str = datetime.datetime.now().strftime("%Y-%m-%d_%H-%M") output_filename = f"Listen_{clean_inst}_{list_type}_{time_str}.pdf" diff --git a/list-generator/backend/app/templates/school_list.html b/list-generator/backend/app/templates/school_list.html index 53b35a57..4718d566 100644 --- a/list-generator/backend/app/templates/school_list.html +++ b/list-generator/backend/app/templates/school_list.html @@ -20,7 +20,15 @@ .footer-left { text-align: left; } .footer-right { text-align: right; white-space: pre-wrap; } -
{{ institution }}
{{ date_info }}
+
+
+
{{ institution }}
+
{{ date_info }}
+
+
+ Logo +
+

Übersicht der Anmeldungen:

{% for count in class_counts %} @@ -28,7 +36,15 @@
Klasse {{ count.name }}{{ count.count }} Anmeldungen
Gesamt: {{ total_students }} Anmeldungen
{% for class_info in class_data %}
-
{{ institution }}
{{ date_info }}
+
+
+
{{ institution }}
+
{{ date_info }}
+
+
+ Logo +
+
{% for student in class_info.students %} diff --git a/list-generator/backend/assets/logo.png b/list-generator/backend/assets/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..d19467dddd8949fe17492c4d8e824ebbdf5284ac GIT binary patch literal 19210 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
NachnameVornameKlasse
{{ student.Nachname }}{{ student.Vorname }}{{ student.Klasse }}