diff --git a/list_generator.py b/list_generator.py new file mode 100644 index 00000000..8c053bb9 --- /dev/null +++ b/list_generator.py @@ -0,0 +1,138 @@ +import csv +from datetime import datetime +import collections +import os # For path handling, though not strictly needed if files are in same dir + +# --- Konfiguration --- +CSV_FILENAME = 'Namensliste.csv' +OUTPUT_FILENAME = 'Gruppenlisten_Output.txt' + +EINRICHTUNG = "Kinderhaus St. Martin Neuching" +# Bitte das Datum anpassen, falls die Annahme nicht korrekt war: +# Mögliche Optionen: +# FOTODATUM = "02.06. & 05.06.2025" # Für zwei spezifische Tage +# FOTODATUM = "02.06. + 05.06.2025" # Alternative für zwei Tage +FOTODATUM = "02. - 05.06.2025" # Für einen Zeitraum + +GRUPPENNAME_SUFFIX = "gruppe" # Wird an den Gruppennamen aus der CSV angehängt + +FOTOGRAF_NAME = "Kinderfotos Erding" +FOTOGRAF_ADRESSE = "Gartenstr. 10 85445 Oberding" +FOTOGRAF_WEB = "www.kinderfotos-erding.de" +FOTOGRAF_TEL = "08122-8470867" +# --- Ende Konfiguration --- + +def generate_group_lists(): + """ + Liest die CSV-Datei, verarbeitet die Daten und generiert die gruppierten Listen. + """ + kinder_nach_gruppen = collections.defaultdict(list) + + try: + # 'utf-8-sig' handhabt das BOM (Byte Order Mark), falls vorhanden + with open(CSV_FILENAME, mode='r', encoding='utf-8-sig', newline='') as csvfile: + # Korrektur für das BOM-Zeichen, falls es manuell am Anfang der CSV-Daten steht + # und nicht durch utf-8-sig entfernt wird (bei String-Input nötig, bei Datei seltener) + # content = csvfile.read() + # if content.startswith('\ufeff'): + # content = content[1:] + # reader = csv.DictReader(content.splitlines(), delimiter=';') # Für String-Input + + reader = csv.DictReader(csvfile, delimiter=';') + for row in reader: + vorname = row.get('Vorname', '').strip() + nachname = row.get('Nachname', '').strip() + gruppe_original = row.get('Gruppe', '').strip() + + if not vorname or not nachname or not gruppe_original: + print(f"Warnung: Zeile übersprungen wegen fehlender Daten: {row}") + continue + + kinder_nach_gruppen[gruppe_original].append({ + 'Nachname': nachname, + 'Vorname': vorname + }) + except FileNotFoundError: + print(f"FEHLER: Die Datei '{CSV_FILENAME}' wurde nicht gefunden.") + return + except Exception as e: + print(f"FEHLER beim Lesen der CSV-Datei: {e}") + return + + if not kinder_nach_gruppen: + print("Keine Daten aus der CSV-Datei geladen.") + return + + # Kinder innerhalb jeder Gruppe sortieren + for gruppe in kinder_nach_gruppen: + kinder_nach_gruppen[gruppe].sort(key=lambda x: (x['Nachname'].lower(), x['Vorname'].lower())) + + # Alphabetisch sortierte Gruppenliste für die Ausgabe + sorted_gruppen_namen = sorted(kinder_nach_gruppen.keys()) + + gesamtdokument_teile = [] + stand_zeit = datetime.now().strftime("%d.%m.%Y %H:%M Uhr") + + for gruppe_original in sorted_gruppen_namen: + kinder_liste = kinder_nach_gruppen[gruppe_original] + anzahl_kinder = len(kinder_liste) + + # Gruppennamen für die Anzeige anpassen + gruppe_display_name = gruppe_original + GRUPPENNAME_SUFFIX + + seiteninhalt = [] + + # Header + # Für die Spaltenausrichtung in Google Docs ist es besser, Tabulatoren zu verwenden + # und dann in Docs "Text in Tabelle umwandeln" zu nutzen oder manuell zu formatieren. + seiteninhalt.append(f"{EINRICHTUNG}\t\t\t{FOTOGRAF_NAME}") + seiteninhalt.append(FOTODATUM) + seiteninhalt.append("") # Leerzeile + + # Tabellenkopf + # Die Spaltenbreiten hier sind nur für die Textausgabe gedacht. + # Feste Breiten sind besser als nur Tabs für die reine Textansicht. + seiteninhalt.append(f"{'Nachname':<25}{'Vorname':<25}{'Gruppe'}") + seiteninhalt.append("-" * (25 + 25 + len(gruppe_display_name) + 2)) # Linie unter Kopf + + # Tabellenzeilen + for kind in kinder_liste: + seiteninhalt.append(f"{kind['Nachname']:<25}{kind['Vorname']:<25}{gruppe_display_name}") + + seiteninhalt.append("") # Leerzeile + + # Footer + seiteninhalt.append(f"{anzahl_kinder} angemeldete Kinder") + seiteninhalt.append("") + seiteninhalt.append("Dies ist die Liste der bereits angemeldeten Kinder. Bitte die Eltern der noch fehlenden") + seiteninhalt.append("Kinder an die Anmeldung erinnern.") + seiteninhalt.append("") + seiteninhalt.append(f"Stand {stand_zeit}") + seiteninhalt.append("\n") # Eine zusätzliche Leerzeile vor Fotografen-Block + seiteninhalt.append(FOTOGRAF_NAME) + seiteninhalt.append(FOTOGRAF_ADRESSE) + seiteninhalt.append(FOTOGRAF_WEB) + seiteninhalt.append(FOTOGRAF_TEL) + + gesamtdokument_teile.append("\n".join(seiteninhalt)) + + # Seiten mit Trenner zusammenfügen + final_output_text = "\n\n--- SEITENWECHSEL / PAGE BREAK ---\n\n".join(gesamtdokument_teile) + + try: + with open(OUTPUT_FILENAME, mode='w', encoding='utf-8') as outfile: + outfile.write(final_output_text) + print(f"Erfolg! Die Listen wurden in '{OUTPUT_FILENAME}' gespeichert.") + except Exception as e: + print(f"FEHLER beim Schreiben der Ausgabedatei: {e}") + +if __name__ == "__main__": + # Hier können Sie das Datum ggf. noch dynamischer setzen oder abfragen + # Beispiel: aktuelles_jahr = datetime.now().year + # FOTODATUM = f"02. - 05.06.{aktuelles_jahr}" + + # Überprüfen Sie Ihre Datumseinstellung: + print(f"Info: Verwendetes Fotodatum: {FOTODATUM}") + print(f"Info: Gruppennamen werden mit Suffix '{GRUPPENNAME_SUFFIX}' versehen.") + + generate_group_lists() \ No newline at end of file