diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 6e1d1c2e..ec8953a9 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -654,11 +654,11 @@ def is_valid_wikipedia_article_url(wiki_url): def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=None): """ Identifiziert Zeilen (S nicht OK/Updated/Copied/Invalid), prüft ob U eine *valide* und *andere* Wiki-URL ist. - - Wenn ja: Kopiert U->M, markiert S='X (URL Copied)', U='URL übernommen', löscht TS/Version, SETZT ReEval-Flag A='x'. - - Wenn nein (U keine URL, U==M, oder U ungültig): LÖSCHT den Inhalt von U und markiert S als 'X (Invalid Suggestion)'. + FALLS JA: Kopiert U->M, markiert S='X (URL Copied)', U='URL übernommen', löscht TS/Version, setzt ReEval-Flag A. + FALLS NEIN: Löscht U, markiert S='X (Invalid Suggestion)'. Verarbeitet maximal row_limit Zeilen. """ - debug_print("Starte Modus: Wiki-Updates (URL-Validierung & Löschen ungültiger Vorschläge)...") + debug_print("Starte Modus: Wiki-Updates (URL-Validierung & bedingtes Update)...") # Titel angepasst if not sheet_handler.load_data(): return all_data = sheet_handler.get_all_data_with_headers() @@ -666,26 +666,16 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=N header_rows = 5 data_rows = all_data[header_rows:] - # --- Indizes holen (inkl. ReEval Flag) --- - required_keys = [ - "Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL", - "Wikipedia Timestamp", "Wiki Verif. Timestamp", "Timestamp letzte Prüfung", "Version", - "ReEval Flag" # Spalte A für ReEval-Flag - ] - col_indices = {} - all_keys_found = True - for key in required_keys: - idx = COLUMN_MAP.get(key) - col_indices[key] = idx - if idx is None: debug_print(f"FEHLER: Key '{key}' fehlt!"); all_keys_found = False + # Indizes holen + required_keys = ["Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL", "Wikipedia Timestamp", "Wiki Verif. Timestamp", "Timestamp letzte Prüfung", "Version", "ReEval Flag"] + col_indices = {}; all_keys_found = True + for key in required_keys: idx = COLUMN_MAP.get(key); col_indices[key] = idx; if idx is None: debug_print(f"FEHLER: Key '{key}' fehlt!"); all_keys_found = False if not all_keys_found: return debug_print("Breche Wiki-Updates ab.") - # --- Ende Indizes holen --- all_sheet_updates = [] - processed_rows_count = 0 # Zählt jetzt beide Arten von Updates - updated_url_count = 0 - cleared_suggestion_count = 0 - # error_rows_count = 0 # Nicht mehr benötigt bei aktueller Struktur + processed_rows_count = 0 # Zählt alle Zeilen, die geprüft werden + updated_url_count = 0 # Zählt Zeilen, wo URL kopiert wurde + cleared_suggestion_count = 0 # Zählt Zeilen, wo Vorschlag gelöscht wurde for idx, row in enumerate(data_rows): row_num_in_sheet = idx + header_rows + 1 @@ -694,79 +684,83 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=N debug_print(f"Zeilenlimit ({row_limit}) erreicht.") break - def get_value(key): - index = col_indices.get(key); return row[index] if index is not None and len(row) > index else "" - + def get_value(key): idx = col_indices.get(key); return row[idx] if idx is not None and len(row) > idx else "" konsistenz_s = get_value("Chat Wiki Konsistenzprüfung"); vorschlag_u = get_value("Chat Vorschlag Wiki Artikel"); url_m = get_value("Wiki URL") - # Bedingungen prüfen - is_update_candidate = False; new_url = "" + # Bedingungen für eine mögliche Aktion konsistenz_s_upper = konsistenz_s.strip().upper() vorschlag_u_cleaned = vorschlag_u.strip() url_m_cleaned = url_m.strip() - condition1_status_nok = konsistenz_s_upper not in ["OK", "X (UPDATED)", "X (URL COPIED)", "X (INVALID SUGGESTION)", ""] - condition2_u_is_url = vorschlag_u_cleaned.lower().startswith(("http://", "https://")) and "wikipedia.org/wiki/" in vorschlag_u_cleaned.lower() - condition3_u_differs_m = False; condition4_u_is_valid = False - if condition1_status_nok and condition2_u_is_url: + # Prüfe nur Zeilen, deren Status eine Aktion erfordert + if konsistenz_s_upper in ["OK", "X (UPDATED)", "X (URL COPIED)", "X (INVALID SUGGESTION)", ""]: + continue # Diese Zeile braucht keine Prüfung/Aktion in diesem Modus + + processed_rows_count += 1 # Diese Zeile wird jetzt geprüft + debug_print(f"\n--- Prüfe Zeile {row_num_in_sheet} (Status S='{konsistenz_s}') ---") + + is_update_candidate = False + new_url = "" + condition2_u_is_url = vorschlag_u_cleaned.lower().startswith(("http://", "https://")) and "wikipedia.org/wiki/" in vorschlag_u_cleaned.lower() + condition3_u_differs_m = False + condition4_u_is_valid = False + + if condition2_u_is_url: new_url = vorschlag_u_cleaned condition3_u_differs_m = new_url != url_m_cleaned if condition3_u_differs_m: - condition4_u_is_valid = is_valid_wikipedia_article_url(new_url) - # if not condition4_u_is_valid: debug_print(...) # Weniger Lärm + debug_print(f" Prüfe Validität von URL in U: {new_url}...") + condition4_u_is_valid = is_valid_wikipedia_article_url(new_url) + is_update_candidate = condition4_u_is_valid # Kandidat nur, wenn URL valide UND anders ist - is_update_candidate = condition1_status_nok and condition2_u_is_url and condition3_u_differs_m and condition4_u_is_valid - clear_invalid_suggestion = condition1_status_nok and not is_update_candidate + # --- Aktionen basierend auf Prüfung --- + row_updates = [] # Updates für DIESE Zeile + s_l=sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"]+1) + u_l=sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"]+1) - # (Debugging kann bleiben) - if row_num_in_sheet in [28, 40, 42] or idx < 2: - debug_print(f"\n--- DEBUG Zeile {row_num_in_sheet} ---"); # ... (Rest Debug) ... - - # --- Verarbeitung --- if is_update_candidate: - # Fall 1: Gültiges Update durchführen - debug_print(f"Zeile {row_num_in_sheet}: Update-Kandidat VALIDIERUNG ERFOLGREICH. Setze ReEval-Flag und bereite Updates vor.") - processed_rows_count += 1 + # Fall A: URL ist valide und anders -> URL kopieren, Status setzen, TS löschen, ReEval setzen + debug_print(f" => Aktion: Update durchführen. Kopiere URL nach M, lösche Timestamps, setze ReEval-Flag.") updated_url_count += 1 - # Updates sammeln (M, S="X (URL Copied)", U="URL übernommen", Timestamps/Version löschen, A="x") - m_l=sheet_handler._get_col_letter(col_indices["Wiki URL"]+1); s_l=sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"]+1); u_l=sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"]+1); an_l=sheet_handler._get_col_letter(col_indices["Wikipedia Timestamp"]+1); ax_l=sheet_handler._get_col_letter(col_indices["Wiki Verif. Timestamp"]+1); ao_l=sheet_handler._get_col_letter(col_indices["Timestamp letzte Prüfung"]+1); ap_l=sheet_handler._get_col_letter(col_indices["Version"]+1); a_l=sheet_handler._get_col_letter(col_indices["ReEval Flag"]+1) - row_updates = [ - {'range': f'{m_l}{row_num_in_sheet}', 'values': [[new_url]]}, - {'range': f'{s_l}{row_num_in_sheet}', 'values': [["X (URL Copied)"]]}, - {'range': f'{u_l}{row_num_in_sheet}', 'values': [["URL übernommen"]]}, - {'range': f'{an_l}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{ax_l}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{ao_l}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{ap_l}{row_num_in_sheet}', 'values': [[""]]}, - # --- WIEDER HINZUGEFÜGT: Setze 'x' in Spalte A --- - {'range': f'{a_l}{row_num_in_sheet}', 'values': [["x"]]}, - ] - all_sheet_updates.extend(row_updates) + m_l=sheet_handler._get_col_letter(col_indices["Wiki URL"]+1) + an_l=sheet_handler._get_col_letter(col_indices["Wikipedia Timestamp"]+1) + ax_l=sheet_handler._get_col_letter(col_indices["Wiki Verif. Timestamp"]+1) + ao_l=sheet_handler._get_col_letter(col_indices["Timestamp letzte Prüfung"]+1) + ap_l=sheet_handler._get_col_letter(col_indices["Version"]+1) + a_l=sheet_handler._get_col_letter(col_indices["ReEval Flag"]+1) - elif clear_invalid_suggestion: - # Fall 2: Ungültigen Vorschlag löschen/markieren - debug_print(f"Zeile {row_num_in_sheet}: Status S war '{konsistenz_s}', aber Vorschlag U ('{vorschlag_u_cleaned}') ist ungültig/identisch. Lösche U und setze Status S.") - processed_rows_count += 1 - cleared_suggestion_count += 1 - s_l=sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"]+1) - u_l=sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"]+1) row_updates = [ - {'range': f'{s_l}{row_num_in_sheet}', 'values': [["X (Invalid Suggestion)"]]}, - {'range': f'{u_l}{row_num_in_sheet}', 'values': [[""]]} + {'range': f'{m_l}{row_num_in_sheet}', 'values': [[new_url]]}, # Neue URL + {'range': f'{s_l}{row_num_in_sheet}', 'values': [["X (URL Copied)"]]}, # Neuer Status + {'range': f'{u_l}{row_num_in_sheet}', 'values': [["URL übernommen"]]}, # Marker + {'range': f'{an_l}{row_num_in_sheet}', 'values': [[""]]}, {'range': f'{ax_l}{row_num_in_sheet}', 'values': [[""]]}, # TS löschen + {'range': f'{ao_l}{row_num_in_sheet}', 'values': [[""]]}, {'range': f'{ap_l}{row_num_in_sheet}', 'values': [[""]]}, + {'range': f'{a_l}{row_num_in_sheet}', 'values': [["x"]]}, # ReEval setzen ] + else: + # Fall B: Status war NOK, aber U war keine valide/andere URL -> U löschen, Status anpassen + debug_print(f" => Aktion: Vorschlag in U löschen/markieren.") + cleared_suggestion_count += 1 + row_updates = [ + {'range': f'{s_l}{row_num_in_sheet}', 'values': [["X (Invalid Suggestion)"]]}, # Neuer Status + {'range': f'{u_l}{row_num_in_sheet}', 'values': [[""]]} # Leere Spalte U + ] + # Keine Timestamps löschen, kein ReEval-Flag + + # Füge die Updates für diese Zeile zur Gesamtliste hinzu + if row_updates: all_sheet_updates.extend(row_updates) - # --- KEIN ReEval-Flag setzen --- # --- Batch Update am Ende --- if all_sheet_updates: - debug_print(f"BEREIT ZUM SENDEN: Batch-Update für {processed_rows_count} verarbeitete Zeilen ({len(all_sheet_updates)} Zellen)...") + debug_print(f"BEREIT ZUM SENDEN: Batch-Update für {processed_rows_count} geprüfte Zeilen ({len(all_sheet_updates)} Zellen)...") success = sheet_handler.batch_update_cells(all_sheet_updates) if success: debug_print(f"Sheet-Update für Wiki-Updates erfolgreich.") else: debug_print(f"FEHLER beim Sheet-Update für Wiki-Updates.") else: debug_print("Keine Zeilen gefunden, die eine Wiki-URL-Korrektur oder Vorschlagsbereinigung benötigen.") - debug_print(f"Wiki-Updates abgeschlossen. {updated_url_count} URLs kopiert & für ReEval markiert, {cleared_suggestion_count} ungültige Vorschläge gelöscht.") + debug_print(f"Wiki-Updates abgeschlossen. {processed_rows_count} Zeilen geprüft. {updated_url_count} URLs kopiert & für ReEval markiert, {cleared_suggestion_count} ungültige Vorschläge gelöscht/markiert.") def extract_numeric_value(raw_value, is_umsatz=False): """Extrahiert und normalisiert Zahlenwerte (Umsatz in Mio, Mitarbeiter)."""