This commit is contained in:
2025-05-28 11:35:23 +00:00
parent 5d53222187
commit 31a2e6c18a

View File

@@ -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: