From b81f1827061aaeb7a09d69b1cb441e99bfe2bdd7 Mon Sep 17 00:00:00 2001 From: Floke Date: Thu, 17 Apr 2025 15:28:11 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 168 +++++++++++++++++------------------------- 1 file changed, 69 insertions(+), 99 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 3e64cf2a..1667f4fb 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -577,10 +577,10 @@ def normalize_company_name(name): # 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): """ - Identifiziert Zeilen, bei denen ChatGPT einen alternativen Wiki-Artikel vorgeschlagen hat (S='X', T=URL), - kopiert die neue URL nach M, führt ein Reparse der Wiki-Daten (N-R) durch, - berechnet die Branche neu (W-Y), löscht relevante Timestamps (AN, AX, AO, AP) - und markiert die Zeile in Spalte S als "X (Updated)". + Identifiziert Zeilen, bei denen Wiki-Konsistenz (S) NICHT 'OK' ist und ein + alternativer Artikel in T vorgeschlagen wurde (URL, != M). + Kopiert neue URL nach M, führt Reparse (N-R) & Re-Branch (W-Y) durch, + löscht Timestamps (AN, AX, AO, AP) und markiert S als 'X (Updated)'. """ debug_print("Starte Modus: Wiki-Updates basierend auf ChatGPT-Vorschlägen...") @@ -590,138 +590,108 @@ def process_wiki_updates_from_chatgpt(sheet_handler, data_processor): header_rows = 5 data_rows = all_data[header_rows:] - # --- Indizes holen --- - # Stelle sicher, dass ALLE benötigten Schlüssel in COLUMN_MAP existieren - required_keys = [ - "Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL", - "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", - "Chat Vorschlag Branche", "Chat Konsistenz Branche", "Chat Begründung Abweichung Branche", - "Wikipedia Timestamp", "Wiki Verif. Timestamp", "Timestamp letzte Prüfung", "Version", - "Website Zusammenfassung", "CRM Branche", "CRM Beschreibung" - ] - col_indices = {} - all_keys_found = True + # Indizes holen (wie zuvor) + required_keys = ["Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL", "Wiki Absatz", "Wiki Branche", "Wiki Umsatz", "Wiki Mitarbeiter", "Wiki Kategorien", "Chat Vorschlag Branche", "Chat Konsistenz Branche", "Chat Begründung Abweichung Branche", "Wikipedia Timestamp", "Wiki Verif. Timestamp", "Timestamp letzte Prüfung", "Version", "Website Zusammenfassung", "CRM Branche", "CRM Beschreibung"] + col_indices = {}; all_keys_found = True for key in required_keys: idx = COLUMN_MAP.get(key) - if idx is None: - debug_print(f"FEHLER: Schlüssel '{key}' fehlt in COLUMN_MAP!") - all_keys_found = False + if idx is None: debug_print(f"FEHLER: Schlüssel '{key}' fehlt!"); all_keys_found = False col_indices[key] = idx + if not all_keys_found: return debug_print("Breche Wiki-Updates ab.") - if not all_keys_found: - debug_print("Breche Wiki-Updates ab, da Spaltenindizes fehlen.") - return - - all_sheet_updates = [] - processed_rows = 0 + all_sheet_updates = []; processed_rows = 0 wiki_scraper = data_processor.wiki_scraper - # Gehe durch alle *Daten*-Zeilen for idx, row in enumerate(data_rows): row_num_in_sheet = idx + header_rows + 1 - # Lese Werte sicher aus + # Werte sicher lesen konsistenz_s = row[col_indices["Chat Wiki Konsistenzprüfung"]] if len(row) > col_indices["Chat Wiki Konsistenzprüfung"] else "" vorschlag_t = row[col_indices["Chat Vorschlag Wiki Artikel"]] if len(row) > col_indices["Chat Vorschlag Wiki Artikel"] else "" url_m = row[col_indices["Wiki URL"]] if len(row) > col_indices["Wiki URL"] else "" - # Bedingung prüfen: S='X' und T ist eine URL und T != M + # --- Bedingung prüfen --- is_update_candidate = False new_url = "" - if konsistenz_s.strip().upper() == "X": - vorschlag_t_cleaned = vorschlag_t.strip() - if vorschlag_t_cleaned.lower().startswith(("http://", "https://")): - new_url = vorschlag_t_cleaned - if new_url != url_m.strip(): + konsistenz_s_upper = konsistenz_s.strip().upper() + vorschlag_t_cleaned = vorschlag_t.strip() + url_m_cleaned = url_m.strip() + t_is_url = vorschlag_t_cleaned.lower().startswith(("http://", "https://")) + t_differs_from_m = new_url != url_m_cleaned # new_url wird erst gesetzt, wenn t_is_url True ist + + # --- NEUES DETAILLIERTES DEBUGGING (speziell für Zeile 28) --- + if row_num_in_sheet == 28: + debug_print(f"\n--- DEBUG Zeile 28 ---") + debug_print(f" Wert S (Roh): '{konsistenz_s}'") + debug_print(f" Wert S (Strip, Upper): '{konsistenz_s_upper}'") + debug_print(f" Bedingung (S != OK and S != ''): {konsistenz_s_upper != 'OK' and konsistenz_s_upper != ''}") + debug_print(f" Wert T (Roh): '{vorschlag_t}'") + debug_print(f" Wert T (Cleaned): '{vorschlag_t_cleaned}'") + debug_print(f" Bedingung (T ist URL): {t_is_url}") + debug_print(f" Wert M (Roh): '{url_m}'") + debug_print(f" Wert M (Cleaned): '{url_m_cleaned}'") + # Setze new_url hier nur für den Vergleichslog, wenn T eine URL ist + temp_new_url_for_log = vorschlag_t_cleaned if t_is_url else None + debug_print(f" Bedingung (T != M): {temp_new_url_for_log != url_m_cleaned if temp_new_url_for_log else 'N/A (T keine URL)'}") + debug_print(f"--- ENDE DEBUG Zeile 28 ---\n") + # --- ENDE DEBUGGING --- + + # Die eigentliche Bedingungsprüfung (Option B: Prüfe auf NICHT OK) + if konsistenz_s_upper != "OK" and konsistenz_s_upper != "": + if t_is_url: # Ist T eine URL? + new_url = vorschlag_t_cleaned # Setze new_url jetzt + if new_url != url_m_cleaned: # Ist T anders als M? is_update_candidate = True - # Optional: Prüfen ob T vielleicht "Kein passender Artikel" etc. enthält und nicht updaten? - # elif "kein" in vorschlag_t_cleaned.lower() and "artikel" in vorschlag_t_cleaned.lower(): - # pass # Explizit nicht als Kandidat werten if is_update_candidate: - debug_print(f"Zeile {row_num_in_sheet}: Update-Kandidat gefunden. Neue URL: {new_url}") - - try: # Füge Try-Block um die Verarbeitung einer Zeile hinzu + # ... (Restliche Verarbeitung der Zeile wie zuvor: Reparse, Re-Branch, Updates sammeln) ... + debug_print(f"Zeile {row_num_in_sheet}: Update-Kandidat gefunden. Status S='{konsistenz_s}', Neue URL: {new_url}") + try: processed_rows += 1 - - # --- Schritt 3a: Wiki Reparse --- debug_print(f" -> Reparsing Wiki-Daten für {new_url}...") - new_wiki_data = wiki_scraper.extract_company_data(new_url) - # Kleine Pause nach Wiki-Scrape - time.sleep(0.5) - - # --- Schritt 3b: Branch Neuberechnung --- + new_wiki_data = wiki_scraper.extract_company_data(new_url); time.sleep(0.5) crm_branche = row[col_indices["CRM Branche"]] if len(row) > col_indices["CRM Branche"] else "" crm_beschreibung = row[col_indices["CRM Beschreibung"]] if len(row) > col_indices["CRM Beschreibung"] else "" website_summary = row[col_indices["Website Zusammenfassung"]] if len(row) > col_indices["Website Zusammenfassung"] else "" debug_print(f" -> Neuberechnung der Branche...") - new_branch_result = evaluate_branche_chatgpt( - crm_branche, crm_beschreibung, - new_wiki_data.get('branche', 'k.A.'), - new_wiki_data.get('categories', 'k.A.'), - website_summary - ) + new_branch_result = evaluate_branche_chatgpt(crm_branche, crm_beschreibung, new_wiki_data.get('branche', 'k.A.'), new_wiki_data.get('categories', 'k.A.'), website_summary) - # --- Schritt 4: Updates sammeln --- - # Spaltenbuchstaben ermitteln - url_m_letter = sheet_handler._get_col_letter(col_indices["Wiki URL"] + 1) - absatz_n_letter = sheet_handler._get_col_letter(col_indices["Wiki Absatz"] + 1) - branche_o_letter = sheet_handler._get_col_letter(col_indices["Wiki Branche"] + 1) - umsatz_p_letter = sheet_handler._get_col_letter(col_indices["Wiki Umsatz"] + 1) - ma_q_letter = sheet_handler._get_col_letter(col_indices["Wiki Mitarbeiter"] + 1) - kat_r_letter = sheet_handler._get_col_letter(col_indices["Wiki Kategorien"] + 1) - branch_w_letter = sheet_handler._get_col_letter(col_indices["Chat Vorschlag Branche"] + 1) - branch_x_letter = sheet_handler._get_col_letter(col_indices["Chat Konsistenz Branche"] + 1) - branch_y_letter = sheet_handler._get_col_letter(col_indices["Chat Begründung Abweichung Branche"] + 1) - ts_an_letter = sheet_handler._get_col_letter(col_indices["Wikipedia Timestamp"] + 1) - 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) - vorschlag_t_letter = sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"] + 1) - konsistenz_s_letter = sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"] + 1) # NEU + # Spaltenbuchstaben ermitteln... + url_m_letter=sheet_handler._get_col_letter(col_indices["Wiki URL"]+1); absatz_n_letter=sheet_handler._get_col_letter(col_indices["Wiki Absatz"]+1); branche_o_letter=sheet_handler._get_col_letter(col_indices["Wiki Branche"]+1); umsatz_p_letter=sheet_handler._get_col_letter(col_indices["Wiki Umsatz"]+1); ma_q_letter=sheet_handler._get_col_letter(col_indices["Wiki Mitarbeiter"]+1); kat_r_letter=sheet_handler._get_col_letter(col_indices["Wiki Kategorien"]+1); branch_w_letter=sheet_handler._get_col_letter(col_indices["Chat Vorschlag Branche"]+1); branch_x_letter=sheet_handler._get_col_letter(col_indices["Chat Konsistenz Branche"]+1); branch_y_letter=sheet_handler._get_col_letter(col_indices["Chat Begründung Abweichung Branche"]+1); ts_an_letter=sheet_handler._get_col_letter(col_indices["Wikipedia Timestamp"]+1); 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); vorschlag_t_letter=sheet_handler._get_col_letter(col_indices["Chat Vorschlag Wiki Artikel"]+1); konsistenz_s_letter=sheet_handler._get_col_letter(col_indices["Chat Wiki Konsistenzprüfung"]+1) row_updates = [ - {'range': f'{url_m_letter}{row_num_in_sheet}', 'values': [[new_url]]}, - {'range': f'{absatz_n_letter}{row_num_in_sheet}', 'values': [[new_wiki_data.get('first_paragraph', 'k.A.')]]}, - {'range': f'{branche_o_letter}{row_num_in_sheet}', 'values': [[new_wiki_data.get('branche', 'k.A.')]]}, - {'range': f'{umsatz_p_letter}{row_num_in_sheet}', 'values': [[new_wiki_data.get('umsatz', 'k.A.')]]}, - {'range': f'{ma_q_letter}{row_num_in_sheet}', 'values': [[new_wiki_data.get('mitarbeiter', 'k.A.')]]}, - {'range': f'{kat_r_letter}{row_num_in_sheet}', 'values': [[new_wiki_data.get('categories', 'k.A.')]]}, - {'range': f'{branch_w_letter}{row_num_in_sheet}', 'values': [[new_branch_result.get("branch", "Fehler")]]}, - {'range': f'{branch_x_letter}{row_num_in_sheet}', 'values': [[new_branch_result.get("consistency", "Fehler")]]}, - {'range': f'{branch_y_letter}{row_num_in_sheet}', 'values': [[new_branch_result.get("justification", "Fehler")]]}, - {'range': f'{ts_an_letter}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{ts_ax_letter}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{ts_ao_letter}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{version_ap_letter}{row_num_in_sheet}', 'values': [[""]]}, - {'range': f'{vorschlag_t_letter}{row_num_in_sheet}', 'values': [["Korrektur übernommen"]]}, - # --- NEU: Spalte S aktualisieren --- - {'range': f'{konsistenz_s_letter}{row_num_in_sheet}', 'values': [["X (Updated)"]]}, + {'range':f'{url_m_letter}{row_num_in_sheet}','values':[[new_url]]}, + {'range':f'{absatz_n_letter}{row_num_in_sheet}','values':[[new_wiki_data.get('first_paragraph','k.A.')]]}, + {'range':f'{branche_o_letter}{row_num_in_sheet}','values':[[new_wiki_data.get('branche','k.A.')]]}, + {'range':f'{umsatz_p_letter}{row_num_in_sheet}','values':[[new_wiki_data.get('umsatz','k.A.')]]}, + {'range':f'{ma_q_letter}{row_num_in_sheet}','values':[[new_wiki_data.get('mitarbeiter','k.A.')]]}, + {'range':f'{kat_r_letter}{row_num_in_sheet}','values':[[new_wiki_data.get('categories','k.A.')]]}, + {'range':f'{branch_w_letter}{row_num_in_sheet}','values':[[new_branch_result.get("branch","Fehler")]]}, + {'range':f'{branch_x_letter}{row_num_in_sheet}','values':[[new_branch_result.get("consistency","Fehler")]]}, + {'range':f'{branch_y_letter}{row_num_in_sheet}','values':[[new_branch_result.get("justification","Fehler")]]}, + {'range':f'{ts_an_letter}{row_num_in_sheet}','values':[[""]]}, + {'range':f'{ts_ax_letter}{row_num_in_sheet}','values':[[""]]}, + {'range':f'{ts_ao_letter}{row_num_in_sheet}','values':[[""]]}, + {'range':f'{version_ap_letter}{row_num_in_sheet}','values':[[""]]}, + {'range':f'{vorschlag_t_letter}{row_num_in_sheet}','values':[["Korrektur übernommen"]]}, + {'range':f'{konsistenz_s_letter}{row_num_in_sheet}','values':[["X (Updated)"]]}, ] all_sheet_updates.extend(row_updates) debug_print(f" -> Updates für Zeile {row_num_in_sheet} vorbereitet.") - - # Kurze Pause nach jeder Zeile, um APIs nicht zu überlasten - time.sleep(Config.RETRY_DELAY) # Behalte Pause bei, da ChatGPT hier läuft + time.sleep(Config.RETRY_DELAY) # Pause beibehalten except Exception as e_row: - # Fehler bei der Verarbeitung einer einzelnen Zeile loggen, aber weitermachen - debug_print(f"FEHLER bei Verarbeitung von Update-Kandidat Zeile {row_num_in_sheet}: {e_row}") - import traceback - debug_print(traceback.format_exc()) + debug_print(f"FEHLER Verarbeitung Zeile {row_num_in_sheet}: {e_row}") + import traceback; debug_print(traceback.format_exc()) - - # --- Schritt 5: Batch Update --- + # --- Batch Update --- if all_sheet_updates: - # Sende alle Updates auf einmal am Ende debug_print(f"Sende Batch-Update für {processed_rows} korrigierte Wiki-Einträge ({len(all_sheet_updates)} Zellen)...") success = sheet_handler.batch_update_cells(all_sheet_updates) - if success: - debug_print(f"Sheet-Update für Wiki-Korrekturen erfolgreich.") - else: - debug_print(f"FEHLER beim Sheet-Update für Wiki-Korrekturen.") + if success: debug_print(f"Sheet-Update Wiki-Korrekturen erfolgreich.") + else: debug_print(f"FEHLER Sheet-Update Wiki-Korrekturen.") else: - debug_print("Keine Zeilen gefunden, die eine Wiki-URL-Korrektur benötigen.") + debug_print("Keine Zeilen für Wiki-URL-Korrektur gefunden/verarbeitet.") debug_print(f"Wiki-Updates basierend auf ChatGPT abgeschlossen. {processed_rows} Zeilen aktualisiert.")