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 %}
+ {% endif %}
Übersicht der Anmeldungen:
{% for count in class_counts %}
- | Klasse {{ count.name }} | {{ count.count }} Anmeldungen |
+ | {{ group_label }} {{ count.name }} | {{ count.count }} Anmeldungen |
{% endfor %}
Gesamt: {{ total_students }} Anmeldungen
{% for class_info in class_data %}
@@ -41,17 +43,19 @@
{{ institution }}
{{ date_info }}
+ {% if logo_base64 %}
+ {% endif %}
- | Nachname | Vorname | Klasse |
+ | Nachname | Vorname | {{ group_label }} |
{% for student in class_info.students %}
- | {{ student.Nachname }} | {{ student.Vorname }} | {{ student.Klasse }} |
+ | {{ student.Nachname }} | {{ student.Vorname }} | {{ student[group_column_name] }} |
{% endfor %}
- {{ 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 %}