From 6b970ab0e7e70d9a54104f68dd7aade12d70e80c Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 17 Apr 2025 19:19:44 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 122 ++++++++++++++++++++++++++++-------------- 1 file changed, 83 insertions(+), 39 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index d97e496b..93a7c4b6 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -575,16 +575,16 @@ def normalize_company_name(name): # NEUE Funktion für Wiki-Updates basierend auf ChatGPT Vorschlägen # NEUE Funktion für Wiki-Updates basierend auf ChatGPT Vorschlägen (mit Status-Update in S) -def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=None): # data_processor wird nicht mehr gebraucht +def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=None): """ Identifiziert Zeilen, bei denen Wiki-Konsistenz (S) NICHT 'OK'/'X (Updated)'/'X (URL Copied)' ist und ein alternativer Artikel in U vorgeschlagen wurde (URL, != M). - Kopiert die neue URL nach M, markiert S als 'X (URL Copied)', U als 'URL übernommen' - und LÖSCHT die Timestamps AN, AX, AO sowie die Version AP, - um eine Neuverarbeitung durch andere Modi zu ermöglichen. + Kopiert die neue URL nach M, markiert S als 'X (URL Copied)', U als 'URL übernommen', + LÖSCHT die Timestamps AN, AX, AO sowie die Version AP UND SETZT 'x' in Spalte A, + um eine Neuverarbeitung durch den 'reeval'-Modus zu triggern. Verarbeitet maximal row_limit Kandidaten. """ - debug_print("Starte Modus: Wiki-Updates Schritt 1 (URL U -> M kopieren & Timestamps löschen)...") # Angepasste Beschreibung + debug_print("Starte Modus: Wiki-Updates Schritt 1 (URL U -> M kopieren, TS löschen, ReEval Flag setzen)...") # Angepasste Beschreibung if not sheet_handler.load_data(): return all_data = sheet_handler.get_all_data_with_headers() @@ -592,9 +592,12 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=N header_rows = 5 data_rows = all_data[header_rows:] - # Indizes holen (weniger benötigt jetzt, aber schadet nicht) - required_keys = ["Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL", - "Wikipedia Timestamp", "Wiki Verif. Timestamp", "Timestamp letzte Prüfung", "Version"] + # 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" # NEU + ] col_indices = {} all_keys_found = True for key in required_keys: @@ -605,7 +608,7 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=N all_sheet_updates = [] processed_rows_count = 0 - # error_rows_count nicht mehr relevant hier + # error_rows_count nicht mehr relevant, da try/except pro Zeile fehlt (kann wieder rein) for idx, row in enumerate(data_rows): row_num_in_sheet = idx + header_rows + 1 @@ -614,7 +617,7 @@ 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): # Sicherer Zugriff + def get_value(key): index = col_indices.get(key) if index is not None and len(row) > index: return row[index] return "" @@ -623,21 +626,22 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=N vorschlag_u = get_value("Chat Vorschlag Wiki Artikel") url_m = get_value("Wiki URL") - # Bedingung prüfen + # Bedingung prüfen (wie zuletzt) is_update_candidate = False; new_url = "" 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)", ""] # Prüft auch gegen neuen Status + condition1_status_nok = konsistenz_s_upper not in ["OK", "X (UPDATED)", "X (URL COPIED)", ""] condition2_u_is_url = vorschlag_u_cleaned.lower().startswith(("http://", "https://")) condition3_u_differs_m = False if condition2_u_is_url: new_url = vorschlag_u_cleaned; condition3_u_differs_m = new_url != url_m_cleaned is_update_candidate = condition1_status_nok and condition2_u_is_url and condition3_u_differs_m if is_update_candidate: - debug_print(f"Zeile {row_num_in_sheet}: Update-Kandidat gefunden. Kopiere URL '{new_url}' nach Spalte M und lösche Timestamps.") + debug_print(f"Zeile {row_num_in_sheet}: Update-Kandidat gefunden. Setze ReEval-Flag und bereite Updates vor.") + processed_rows_count += 1 - # Updates sammeln (M, S, U und Timestamps/Version löschen) + # --- Updates sammeln (M, S, U, Timestamps/Version löschen, A setzen) --- url_m_letter = sheet_handler._get_col_letter(col_indices["Wiki URL"] + 1) konsistenz_s_letter = sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"] + 1) vorschlag_u_letter = sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"] + 1) @@ -645,6 +649,7 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=N ts_ax_letter = sheet_handler._get_col_letter(col_indices["Wiki Verif. Timestamp"] + 1) ts_ao_letter = sheet_handler._get_col_letter(col_indices["Timestamp letzte Prüfung"] + 1) version_ap_letter = sheet_handler._get_col_letter(col_indices["Version"] + 1) + reeval_a_letter = sheet_handler._get_col_letter(col_indices["ReEval Flag"] + 1) # Buchstabe für Spalte A row_updates = [ {'range': f'{url_m_letter}{row_num_in_sheet}', 'values': [[new_url]]}, # Neue URL nach M @@ -654,21 +659,22 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor, row_limit=N {'range': f'{ts_ax_letter}{row_num_in_sheet}', 'values': [[""]]}, # AX löschen {'range': f'{ts_ao_letter}{row_num_in_sheet}', 'values': [[""]]}, # AO löschen {'range': f'{version_ap_letter}{row_num_in_sheet}', 'values': [[""]]}, # AP löschen + # --- NEU: Setze 'x' in Spalte A --- + {'range': f'{reeval_a_letter}{row_num_in_sheet}', 'values': [["x"]]}, ] all_sheet_updates.extend(row_updates) - processed_rows_count += 1 # Kein Reparsing/Rebranching hier! # Batch Update am Ende if all_sheet_updates: - debug_print(f"BEREIT ZUM SENDEN: Batch-Update für {processed_rows_count} URL-Kopien/Timestamp-Resets ({len(all_sheet_updates)} Zellen)...") + debug_print(f"BEREIT ZUM SENDEN: Batch-Update für {processed_rows_count} Zeilen (URL-Kopie/TS-Reset/ReEval-Flag)...") success = sheet_handler.batch_update_cells(all_sheet_updates) - if success: debug_print(f"Sheet-Update für URL-Kopien/Resets erfolgreich.") - else: debug_print(f"FEHLER beim Sheet-Update für URL-Kopien/Resets.") + if success: debug_print(f"Sheet-Update für Wiki-Korrektur-Vorbereitung erfolgreich.") + else: debug_print(f"FEHLER beim Sheet-Update für Wiki-Korrektur-Vorbereitung.") else: - debug_print("Keine Zeilen gefunden, für die eine URL kopiert und Timestamps zurückgesetzt werden müssen.") + debug_print("Keine Zeilen für Wiki-URL-Korrektur gefunden/benötigt.") - debug_print(f"Wiki-Updates Schritt 1 abgeschlossen. {processed_rows_count} Zeilen für Neuverarbeitung vorbereitet.") + debug_print(f"Wiki-Updates Vorbereitung abgeschlossen. {processed_rows_count} Zeilen für Re-Evaluation markiert.") def extract_numeric_value(raw_value, is_umsatz=False): """Extrahiert und normalisiert Zahlenwerte (Umsatz in Mio, Mitarbeiter).""" @@ -3432,30 +3438,68 @@ class DataProcessor: self._process_single_row(row_num_in_sheet, row_data, process_wiki, process_chatgpt, process_website) - def process_reevaluation_rows(self): - """ Verarbeitet nur Zeilen, die in Spalte A mit 'x' markiert sind. """ - debug_print("Starte Re-Evaluierungsmodus (Spalte A = 'x')...") - data_rows = self.sheet_handler.get_data() + def process_reevaluation_rows(self, row_limit=None, clear_flag=True): + """ + Verarbeitet nur Zeilen, die in Spalte A mit 'x' markiert sind. + Ruft _process_single_row für jede dieser Zeilen auf. + Verarbeitet maximal row_limit Zeilen. + Löscht optional das 'x'-Flag nach erfolgreicher Verarbeitung. + """ + debug_print(f"Starte Re-Evaluierungsmodus (Spalte A = 'x'). Max. Zeilen: {row_limit if row_limit is not None else 'Unbegrenzt'}") + + # Lade Daten frisch, um aktuelle Flags zu sehen + if not self.sheet_handler.load_data(): return + all_data = self.sheet_handler.get_all_data_with_headers() + if not all_data or len(all_data) <= 5: return header_rows = 5 - rows_processed = 0 + data_rows = all_data[header_rows:] + reeval_col_idx = COLUMN_MAP.get("ReEval Flag") + if reeval_col_idx is None: return debug_print("FEHLER: 'ReEval Flag' nicht in COLUMN_MAP.") - if reeval_col_idx is None: - debug_print("FEHLER: Spalte 'ReEval Flag' nicht in COLUMN_MAP gefunden. Breche Re-Evaluierung ab.") - return - - for i, row in enumerate(data_rows): - row_num_in_sheet = i + header_rows + 1 - # Prüfe Flag in Spalte A (Index 0) + rows_to_process = [] + # Finde zuerst alle Kandidaten + for idx, row in enumerate(data_rows): if len(row) > reeval_col_idx and row[reeval_col_idx].strip().lower() == "x": - debug_print(f"Re-Evaluiere Zeile {row_num_in_sheet}...") + row_num_in_sheet = idx + header_rows + 1 + rows_to_process.append({'row_num': row_num_in_sheet, 'data': row}) + + debug_print(f"{len(rows_to_process)} Zeilen mit ReEval-Flag 'x' gefunden.") + + processed_count = 0 + updates_clear_flag = [] + + # Verarbeite die gefundenen Kandidaten bis zum Limit + for task in rows_to_process: + if row_limit is not None and processed_count >= row_limit: + debug_print(f"Zeilenlimit ({row_limit}) erreicht. Breche Re-Evaluation ab.") + break + + row_num = task['row_num'] + row_data = task['data'] + debug_print(f"--- Re-Evaluiere Zeile {row_num} ---") + try: # Führe volle Verarbeitung für diese Zeile durch - self._process_single_row(row_num_in_sheet, row, process_wiki=True, process_chatgpt=True, process_website=True) - rows_processed += 1 - # Optional: Flag nach Verarbeitung löschen? - # update_flag = [{'range': f'A{row_num_in_sheet}', 'values': [['']]}] - # self.sheet_handler.batch_update_cells(update_flag) - debug_print(f"Re-Evaluierung abgeschlossen. {rows_processed} Zeilen verarbeitet.") + # _process_single_row prüft intern Timestamps AN, AT, AO + self._process_single_row(row_num, row_data, process_wiki=True, process_chatgpt=True, process_website=True) + processed_count += 1 + + # Optional: Flag nach Verarbeitung löschen + if clear_flag: + flag_col_letter = self.sheet_handler._get_col_letter(reeval_col_idx + 1) + updates_clear_flag.append({'range': f'{flag_col_letter}{row_num}', 'values': [['']]}) + + except Exception as e_proc: + debug_print(f"FEHLER bei Re-Evaluation von Zeile {row_num}: {e_proc}") + # Flag hier nicht löschen, damit es beim nächsten Mal versucht wird + + # Lösche Flags am Ende gebündelt + if clear_flag and updates_clear_flag: + debug_print(f"Lösche ReEval-Flags für {len(updates_clear_flag)} verarbeitete Zeilen...") + success = self.sheet_handler.batch_update_cells(updates_clear_flag) + if not success: debug_print("FEHLER beim Löschen der ReEval-Flags.") + + debug_print(f"Re-Evaluierung abgeschlossen. {processed_count} Zeilen verarbeitet (Limit: {row_limit}).") def process_website_details_for_marked_rows(self):