From 2f2df7d7d01bbd083fa77b2a5594efe776fc6a0b Mon Sep 17 00:00:00 2001 From: Floke Date: Wed, 28 May 2025 11:35:23 +0000 Subject: [PATCH] bugfix --- list_generator.py | 114 ++++++++++++++++++++++++++++++++++++++++------ 1 file changed, 100 insertions(+), 14 deletions(-) diff --git a/list_generator.py b/list_generator.py index e05a18da..f32aca8c 100644 --- a/list_generator.py +++ b/list_generator.py @@ -158,26 +158,112 @@ def generate_familien_content(docs_service, document_id_to_fill): sorted_tage = sorted(termine_nach_tagen.keys(), key=lambda d: datetime.strptime(d, "%d.%m.%Y")) requests = [] - col_w_vn = 20; col_w_nn = 20; col_w_zeit = 7; col_w_kinder = 10; col_w_pub = 5; col_w_erl = 8 + # Definieren Sie die Startpositionen (Anzahl Zeichen vom Zeilenanfang) + # und die maximale Breite für jede Spalte. + # Diese Werte müssen Sie ggf. experimentell anpassen! + # Format: (Startposition, Maximale Inhaltsbreite vor Padding/Abschneiden) + # Die tatsächliche Breite der "Zelle" ist dann Start_nächste_Spalte - Start_aktuelle_Spalte + + # Ziel-Spalten-Layout (Beispielwerte, müssen angepasst werden!) + # Spalte | Start | Max Inhalt | Sichtbare Breite der Spalte + # ------------------------------------------------------------- + # Vorname | 0 | 18 | 20 (bis Start Nachname) + # Nachname | 20 | 18 | 20 (bis Start Uhrzeit) + # Uhrzeit | 40 | 6 | 8 (bis Start # Kinder) + # # Kinder | 48 | 8 | 10 (bis Start Pub) + # Pub | 58 | 3 | 5 (bis Start Erledigt) + # Erledigt | 63 | 8 | - (Rest der Zeile) + + col_configs = [ + {"name": "Vorname", "start": 0, "max_content": 18, "header": "Vorname"}, + {"name": "Nachname", "start": 20, "max_content": 18, "header": "Nachname"}, + {"name": "Uhrzeit", "start": 40, "max_content": 6, "header": "Uhrzeit"}, + {"name": "Kinder", "start": 48, "max_content": 8, "header": "# Kinder"}, + {"name": "Pub", "start": 58, "max_content": 3, "header": "Pub"}, + {"name": "Erledigt", "start": 63, "max_content": 8, "header": "Erledigt"}, + ] for tag_idx, tag_datum_str in enumerate(sorted_tage): tages_termine = sorted(termine_nach_tagen[tag_datum_str], key=lambda t: t['StartzeitObj']) - if tag_idx > 0: requests.append({'insertPageBreak': {'endOfSegmentLocation': {}}}) - tages_block_lines = [f"Termine am {tag_datum_str}", ""] - kopf_vn="Vorname".ljust(col_w_vn); kopf_nn="Nachname".ljust(col_w_nn); kopf_zeit="Uhrzeit".ljust(col_w_zeit) - kopf_kinder="# Kinder".ljust(col_w_kinder); kopf_pub="Pub".ljust(col_w_pub); kopf_erl="Erledigt".ljust(col_w_erl) - tages_block_lines.append(f"{kopf_vn}\t{kopf_nn}\t{kopf_zeit}\t{kopf_kinder}\t{kopf_pub}\t{kopf_erl}") - letzte_endzeit_obj = None + + if tag_idx > 0: + requests.append({'insertPageBreak': {'endOfSegmentLocation': {}}}) + + tages_block_lines = [] + tages_block_lines.append(f"Termine am {tag_datum_str}") + tages_block_lines.append("") + + # Tabellenkopfzeile generieren + header_parts = [] + current_pos = 0 + for col_cfg in col_configs: + padding_needed = col_cfg["start"] - current_pos + if padding_needed > 0: + header_parts.append(" " * padding_needed) + + # Text ggf. abschneiden, wenn er zu lang für max_content ist + header_text = col_cfg["header"] + if len(header_text) > col_cfg["max_content"]: + header_text = header_text[:col_cfg["max_content"]] + else: + header_text = header_text.ljust(col_cfg["max_content"]) # Mit Leerzeichen auffüllen + header_parts.append(header_text) + current_pos = col_cfg["start"] + col_cfg["max_content"] + tages_block_lines.append("".join(header_parts)) + + + letzte_endzeit_obj = None + for termin_idx, termin in enumerate(tages_termine): if letzte_endzeit_obj and termin['StartzeitObj'] > letzte_endzeit_obj: - leere_zeile = "\t".join([" ".ljust(w) for w in [col_w_vn,col_w_nn,col_w_zeit,col_w_kinder,col_w_pub,col_w_erl]]) - tages_block_lines.append(leere_zeile) - vn_pad=termin['Vorname'].ljust(col_w_vn); nn_pad=termin['Nachname'].ljust(col_w_nn); zeit_pad=termin['Startzeit'].ljust(col_w_zeit) - kind_pad=termin['Kinder'].ljust(col_w_kinder); pub_pad=termin['Pub'].ljust(col_w_pub); erl_pad=termin['Erledigt'].ljust(col_w_erl) - tages_block_lines.append(f"{vn_pad}\t{nn_pad}\t{zeit_pad}\t{kind_pad}\t{pub_pad}\t{erl_pad}") + # Leerzeile: Besteht nur aus Leerzeichen bis zur Gesamtbreite oder einer festen Anzahl + # Um die Spaltenstruktur beizubehalten, könnten wir hier eine Zeile mit + # gepaddeten leeren Strings oder Trennzeichen einfügen. + # Für Einfachheit lassen wir die Leerzeile jetzt wirklich "leer" im Sinne von nur Zeilenumbruch, + # oder wir generieren eine Zeile mit gepaddeten Leerstrings für jede Spalte. + empty_row_parts = [] + current_pos_empty = 0 + for col_cfg in col_configs: + padding_needed_empty = col_cfg["start"] - current_pos_empty + if padding_needed_empty > 0: + empty_row_parts.append(" " * padding_needed_empty) + # Fülle die "Zelle" mit Leerzeichen bis zur max_content Breite + empty_row_parts.append(" " * col_cfg["max_content"]) + current_pos_empty = col_cfg["start"] + col_cfg["max_content"] + tages_block_lines.append("".join(empty_row_parts)) + + + row_parts = [] + current_pos = 0 + termin_daten_fuer_spalten = { + "Vorname": termin['Vorname'], + "Nachname": termin['Nachname'], + "Uhrzeit": termin['Startzeit'], + "Kinder": termin['Kinder'], + "Pub": termin['Pub'], + "Erledigt": termin['Erledigt'] + } + + for col_cfg in col_configs: + padding_needed = col_cfg["start"] - current_pos + if padding_needed > 0: + row_parts.append(" " * padding_needed) + + cell_text = str(termin_daten_fuer_spalten.get(col_cfg["name"], "")) # str() für alle Fälle + if len(cell_text) > col_cfg["max_content"]: + cell_text = cell_text[:col_cfg["max_content"]] # Abschneiden + else: + cell_text = cell_text.ljust(col_cfg["max_content"]) # Auffüllen + + row_parts.append(cell_text) + current_pos = col_cfg["start"] + col_cfg["max_content"] + tages_block_lines.append("".join(row_parts)) + _, _, termin_endzeit_str_val = parse_datetime_string(f"{tag_datum_str} {termin['Endzeit']}") - if termin_endzeit_str_val: letzte_endzeit_obj = datetime.strptime(f"{tag_datum_str} {termin['Endzeit']}", "%d.%m.%Y %H:%M") - full_tages_block_text = "\n".join(tages_block_lines) + "\n\n" + if termin_endzeit_str_val: + letzte_endzeit_obj = datetime.strptime(f"{tag_datum_str} {termin['Endzeit']}", "%d.%m.%Y %H:%M") + + full_tages_block_text = "\n".join(tages_block_lines) + "\n\n" requests.append({'insertText': {'endOfSegmentLocation': {}, 'text': full_tages_block_text}}) if requests: try: