From c39661c7e47e4f42873399f91919f588f6c9e1d3 Mon Sep 17 00:00:00 2001 From: Floke Date: Fri, 20 Mar 2026 12:50:24 +0000 Subject: [PATCH] feat(list-generator): implement dynamic labels and fix logo rendering [32788f42] --- list-generator/.gitignore | 12 ++++ .../backend/app/services/pdf_generator.py | 56 ++++++++++++++----- .../backend/app/templates/school_list.html | 14 +++-- 3 files changed, 63 insertions(+), 19 deletions(-) create mode 100644 list-generator/.gitignore diff --git a/list-generator/.gitignore b/list-generator/.gitignore new file mode 100644 index 00000000..f581847f --- /dev/null +++ b/list-generator/.gitignore @@ -0,0 +1,12 @@ +# Python +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +env/ +venv/ +*.egg-info/ +dist/ +build/ +.pytest_cache/ diff --git a/list-generator/backend/app/services/pdf_generator.py b/list-generator/backend/app/services/pdf_generator.py index 80a51baf..2b3a4a28 100644 --- a/list-generator/backend/app/services/pdf_generator.py +++ b/list-generator/backend/app/services/pdf_generator.py @@ -15,6 +15,16 @@ def get_logo_base64(): 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: + # Determine labels based on list_type + if list_type.lower() == 'k': + group_label = "Gruppe" + person_label = "Kinder" + person_label_plural = "Kinder" + else: # Default to 'school' + group_label = "Klasse" + person_label = "Schüler" + person_label_plural = "Schüler" + df = None for sep in [";", ","]: try: @@ -26,8 +36,10 @@ def generate_school_pdf(institution: str, date_info: str, list_type: str, studen continue if df is None: df = pd.read_csv(students_csv_path, sep=";", encoding="latin1") + df.columns = df.columns.str.strip().str.replace("\"", "") print(f"Detected columns: {list(df.columns)}") + col_mapping = {} for col in df.columns: lower_col = col.lower().strip() @@ -36,36 +48,52 @@ def generate_school_pdf(institution: str, date_info: str, list_type: str, studen elif lower_col in ["nachname kind", "nachname", "last name"]: col_mapping[col] = "Nachname" elif lower_col in ["gruppe", "klasse", "group", "class"]: - col_mapping[col] = "Klasse" + col_mapping[col] = group_label # Use dynamic label + df = df.rename(columns=col_mapping) df = df.fillna("") - for col in ["Vorname", "Nachname", "Klasse"]: + + for col in ["Vorname", "Nachname", group_label]: if col not in df.columns: - df[col] = "Alle" if col == "Klasse" else "" - df = df.sort_values(by=["Klasse", "Nachname", "Vorname"]) - grouped = df.groupby("Klasse") + df[col] = "Alle" if col == group_label else "" + + df = df.sort_values(by=[group_label, "Nachname", "Vorname"]) + grouped = df.groupby(group_label) + class_data = [] for class_name, group in grouped: class_data.append({"name": class_name, "students": group.to_dict("records")}) + class_counts = [{"name": c, "count": len(g)} for c, g in grouped] total_students = len(df) + template_dir = os.path.join(os.path.dirname(__file__), "..", "templates") 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") 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 - ) + + render_context = { + "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, + "group_label": group_label, + "person_label": person_label, + "person_label_plural": person_label_plural, + "group_column_name": group_label # Pass the actual column name for the table header + } + + html_out = template.render(render_context) + 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" output_path = os.path.join(output_dir, output_filename) + HTML(string=html_out).write_pdf(output_path) return output_path diff --git a/list-generator/backend/app/templates/school_list.html b/list-generator/backend/app/templates/school_list.html index b014f88d..aa1ceade 100644 --- a/list-generator/backend/app/templates/school_list.html +++ b/list-generator/backend/app/templates/school_list.html @@ -25,13 +25,15 @@
{{ institution }}
{{ date_info }}
+ {% if logo_base64 %}
Logo
+ {% endif %}

Übersicht der Anmeldungen:

{% for count in class_counts %} - + {% endfor %}
Klasse {{ count.name }}{{ count.count }} Anmeldungen
{{ group_label }} {{ count.name }}{{ count.count }} Anmeldungen
Gesamt: {{ total_students }} Anmeldungen
{% for class_info in class_data %} @@ -41,17 +43,19 @@
{{ institution }}
{{ date_info }}
+ {% if logo_base64 %}
Logo
+ {% endif %} - +
NachnameVornameKlasse
{% for student in class_info.students %} - + {% endfor %}
NachnameVorname{{ group_label }}
{{ student.Nachname }}{{ student.Vorname }}{{ student.Klasse }}
{{ student.Nachname }}{{ student.Vorname }}{{ student[group_column_name] }}
-
{{ class_info.students|length }} angemeldete Kinder
-
Dies ist die Liste der bereits angemeldeten Schüler. Bitte die noch fehlenden
Schüler an die Anmeldung erinnern.
+
{{ class_info.students|length }} angemeldete {{ person_label_plural }}
+
Dies ist die Liste der bereits angemeldeten {{ person_label_plural }}. Bitte die noch fehlenden
{{ person_label_plural }} an die Anmeldung erinnern.
{% endfor %}