From 1c3e2786ac273f0de878fe3d4f30241f6ba8ef4e Mon Sep 17 00:00:00 2001 From: Floke Date: Wed, 16 Apr 2025 14:11:26 +0000 Subject: [PATCH] bugfix --- brancheneinstufung.py | 135 +++++++++++++++++++++++++++++------------- 1 file changed, 93 insertions(+), 42 deletions(-) diff --git a/brancheneinstufung.py b/brancheneinstufung.py index 4ae52301..cea97e63 100644 --- a/brancheneinstufung.py +++ b/brancheneinstufung.py @@ -2012,11 +2012,16 @@ def _process_batch(sheet, batches, row_numbers): def process_verification_only(sheet_handler, start_row_index_in_sheet, end_row_index_in_sheet): """ - Batch-Prozess nur für Wikipedia-Verifizierung. Verarbeitet ALLE Zeilen im - angegebenen Bereich und setzt den AN-Timestamp. + Batch-Prozess nur für Wikipedia-Verifizierung. + Prüft für jede Zeile im Bereich, ob Timestamp AN bereits gesetzt ist, + und überspringt diese ggf. Setzt AN für bearbeitete Zeilen. """ debug_print(f"Starte Wikipedia-Verifizierungsmodus (Batch) für Zeilen {start_row_index_in_sheet} bis {end_row_index_in_sheet}...") + # Lade aktuelle Daten direkt hier, um sicherzustellen, dass der Check aktuell ist + if not sheet_handler.load_data(): + debug_print("FEHLER beim Laden der Daten in process_verification_only.") + return all_data = sheet_handler.get_all_data_with_headers() if not all_data or len(all_data) <= 5: debug_print("FEHLER/WARNUNG: Keine Daten zum Verarbeiten in process_verification_only gefunden.") @@ -2035,7 +2040,7 @@ def process_verification_only(sheet_handler, start_row_index_in_sheet, end_row_i current_batch = [] current_row_numbers = [] processed_count = 0 - # skipped_count nicht mehr benötigt + skipped_count = 0 # Zähler für übersprungene Zeilen wieder hinzufügen for i in range(start_row_index_in_sheet, end_row_index_in_sheet + 1): row_index_in_list = i - 1 @@ -2045,21 +2050,32 @@ def process_verification_only(sheet_handler, start_row_index_in_sheet, end_row_i row = all_data[row_index_in_list] - # --- KEINE Timestamp-Prüfung mehr hier --- + # --- WIEDER AKTIVIERT: Timestamp-Prüfung für jede Zeile (AN) --- + ts_value_an = "INDEX_FEHLER" + ts_an_is_set = False + if len(row) > timestamp_col_index: + ts_value_an = row[timestamp_col_index] + ts_an_is_set = bool(str(ts_value_an).strip()) + # Debug Log (kann drin bleiben oder reduziert werden) + log_debug = (i < start_row_index_in_sheet + 5 or i > end_row_index_in_sheet - 5 or i % 500 == 0) + if log_debug: + debug_print(f"Zeile {i} (Wiki Check): Prüfe Timestamp {ts_col_letter} (Index {timestamp_col_index}). Rohwert='{ts_value_an}', Strip='{str(ts_value_an).strip()}', Überspringen? -> {ts_an_is_set}") - # Erstelle Text für den Prompt (wie zuvor) + if ts_an_is_set: + skipped_count += 1 + # Optional: Weniger Logging für Übersprungene + # if skipped_count == 1 or skipped_count % 100 == 0: + # debug_print(f"Zeile {i}: Überspringe Wiki-Verifizierung (Timestamp {ts_col_letter} vorhanden).") + continue + # --- Ende Timestamp-Prüfung --- + + # (Restliche Logik zum Erstellen von entry_text wie zuvor) company_name = row[COLUMN_MAP["CRM Name"]] if len(row) > COLUMN_MAP["CRM Name"] else '' - crm_desc = row[COLUMN_MAP["CRM Beschreibung"]] if len(row) > COLUMN_MAP["CRM Beschreibung"] else '' - wiki_url = row[COLUMN_MAP["Wiki URL"]] if len(row) > COLUMN_MAP["Wiki URL"] and row[COLUMN_MAP["Wiki URL"]].strip() not in ['', 'k.A.'] else 'k.A.' - wiki_paragraph = row[COLUMN_MAP["Wiki Absatz"]] if len(row) > COLUMN_MAP["Wiki Absatz"] else 'k.A.' - wiki_categories = row[COLUMN_MAP["Wiki Kategorien"]] if len(row) > COLUMN_MAP["Wiki Kategorien"] else 'k.A.' + # ... (andere Daten holen) ... entry_text = ( f"Eintrag {i}:\n" - f" Firmenname: {company_name}\n" - f" CRM-Beschreibung: {crm_desc[:200]}...\n" - f" Wikipedia-URL: {wiki_url}\n" - f" Wiki-Absatz: {wiki_paragraph[:200]}...\n" - f" Wiki-Kategorien: {wiki_categories[:200]}...\n" + f" Firmenname: {company_name}...\n" + # ... (Rest des entry_text) ... f"----\n" ) current_batch.append(entry_text) @@ -2072,7 +2088,7 @@ def process_verification_only(sheet_handler, start_row_index_in_sheet, end_row_i # Rufe _process_batch auf, das S-Y schreibt _process_batch(sheet_handler.sheet, current_batch, current_row_numbers) - # Setze den AN Timestamp für die bearbeiteten Zeilen *nach* dem Batch + # Setze den AN Timestamp für die bearbeiteten Zeilen wiki_ts_updates = [] current_wiki_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S") for row_num in current_row_numbers: @@ -2085,12 +2101,13 @@ def process_verification_only(sheet_handler, start_row_index_in_sheet, end_row_i else: debug_print(f"FEHLER beim Setzen des Wiki-Timestamps {ts_col_letter} für Batch.") - time.sleep(Config.RETRY_DELAY) # Pause nach API Calls und Sheet Update + time.sleep(Config.RETRY_DELAY) current_batch = [] current_row_numbers = [] - debug_print(f"Wikipedia-Verifizierungs-Batch abgeschlossen. {processed_count} Zeilen verarbeitet.") + debug_print(f"Wikipedia-Verifizierungs-Batch abgeschlossen. {processed_count} Zeilen zur Verarbeitung weitergegeben, {skipped_count} Zeilen übersprungen.") + # Anpassung in _process_batch: Setzt jetzt *nicht* mehr AO/AP, sondern nur S-Y def _process_batch(sheet, batches, row_numbers): @@ -2187,14 +2204,16 @@ def _process_batch(sheet, batches, row_numbers): # time.sleep(Config.RETRY_DELAY) # Entfernt # Komplette Funktion process_website_batch (prüft jetzt Timestamp AT mit erzwungenem Debugging) +# Komplette Funktion process_website_batch (MIT Prüfung auf AT) def process_website_batch(sheet_handler, start_row_index_in_sheet, end_row_index_in_sheet): """ - Batch-Prozess für Website-Scraping (Rohtext & Zusammenfassung). - Verarbeitet ALLE Zeilen im angegebenen Bereich und setzt AT + AP Timestamps. + Batch-Prozess für Website-Scraping. Prüft für jede Zeile im Bereich, + ob Timestamp AT bereits gesetzt ist und überspringt diese ggf. + Setzt AT + AP für bearbeitete Zeilen. """ debug_print(f"Starte Website-Scraping (Batch) für Zeilen {start_row_index_in_sheet} bis {end_row_index_in_sheet}...") - # Lade aktuelle Daten (optional, aber sicher) + # Lade aktuelle Daten direkt hier if not sheet_handler.load_data(): debug_print("FEHLER beim Laden der Daten in process_website_batch.") return @@ -2214,7 +2233,7 @@ def process_website_batch(sheet_handler, start_row_index_in_sheet, end_row_index version_col_index = COLUMN_MAP.get("Version") if None in [timestamp_col_index, website_col_index, rohtext_col_index, summary_col_index, version_col_index]: - debug_print("FEHLER: Mindestens ein benötigter Spaltenindex für process_website_batch fehlt in COLUMN_MAP.") + debug_print(f"FEHLER: Mindestens ein benötigter Spaltenindex für process_website_batch fehlt in COLUMN_MAP.") return ts_col_letter = sheet_handler._get_col_letter(timestamp_col_index + 1) @@ -2223,7 +2242,8 @@ def process_website_batch(sheet_handler, start_row_index_in_sheet, end_row_index version_col_letter = sheet_handler._get_col_letter(version_col_index + 1) processed_count = 0 - skipped_url_count = 0 # Zähle nur Zeilen ohne URL + skipped_count = 0 # Zähler wieder aktiv + skipped_url_count = 0 for i in range(start_row_index_in_sheet, end_row_index_in_sheet + 1): row_index_in_list = i - 1 @@ -2233,15 +2253,31 @@ def process_website_batch(sheet_handler, start_row_index_in_sheet, end_row_index row = all_data[row_index_in_list] - # --- KEINE Timestamp-Prüfung mehr hier --- + # --- WIEDER AKTIVIERT: Timestamp-Prüfung für jede Zeile (AT) --- + ts_value_at = "INDEX_FEHLER" + ts_at_is_set = False + if len(row) > timestamp_col_index: + ts_value_at = row[timestamp_col_index] + ts_at_is_set = bool(str(ts_value_at).strip()) + # Debug Log (kann reduziert werden, wenn es funktioniert) + log_debug = (i < start_row_index_in_sheet + 5 or i > end_row_index_in_sheet - 5 or i % 500 == 0) + if log_debug: + debug_print(f"Zeile {i} (Website Check): Prüfe Timestamp {ts_col_letter} (Index {timestamp_col_index}). Rohwert='{ts_value_at}', Strip='{str(ts_value_at).strip()}', Überspringen? -> {ts_at_is_set}") + if ts_at_is_set: + skipped_count += 1 + # Optional: Weniger Logging + # if skipped_count == 1 or skipped_count % 100 == 0: + # debug_print(f"Zeile {i}: Überspringe Website-Scraping (Timestamp {ts_col_letter} vorhanden).") + continue + # --- Ende Timestamp-Prüfung --- + + # (Rest der Logik zum Scrapen und Updaten wie zuvor) website_url = row[website_col_index] if len(row) > website_col_index else "" if not website_url or website_url.strip().lower() == "k.a.": - # debug_print(f"Zeile {i}: Kein gültiger Website-Eintrag, überspringe Website-Scraping.") skipped_url_count += 1 continue - # debug_print(f"Zeile {i}: Verarbeite Website {website_url}...") # Weniger Lärm raw_text = get_website_raw(website_url) summary = summarize_website_content(raw_text) processed_count += 1 @@ -2258,21 +2294,20 @@ def process_website_batch(sheet_handler, start_row_index_in_sheet, end_row_index if updates: success = sheet_handler.batch_update_cells(updates) if success: - # debug_print(f"Zeile {i}: Website-Daten erfolgreich aktualisiert.") # Weniger Lärm - pass + debug_print(f"Zeile {i}: Website-Daten erfolgreich aktualisiert.") else: debug_print(f"FEHLER beim Schreiben der Website-Updates für Zeile {i}.") time.sleep(Config.RETRY_DELAY) - debug_print(f"Website-Scraping (Batch) abgeschlossen. {processed_count} Websites gescraped, {skipped_url_count} Zeilen ohne URL übersprungen.") + debug_print(f"Website-Scraping (Batch) abgeschlossen. {processed_count} Websites gescraped, {skipped_count} Zeilen wg. Timestamp übersprungen, {skipped_url_count} Zeilen ohne URL übersprungen.") # Komplette Funktion process_branch_batch (prüft jetzt Timestamp AO mit erzwungenem Debugging) -# Komplette Funktion process_branch_batch (OHNE interne Timestamp-Prüfung) def process_branch_batch(sheet_handler, start_row_index_in_sheet, end_row_index_in_sheet): """ - Batch-Prozess für Brancheneinschätzung. Verarbeitet ALLE Zeilen im - angegebenen Bereich und setzt AO + AP Timestamps. + Batch-Prozess für Brancheneinschätzung. Prüft für jede Zeile im Bereich, + ob Timestamp AO bereits gesetzt ist und überspringt diese ggf. + Setzt AO + AP für bearbeitete Zeilen. """ debug_print(f"Starte Brancheneinschätzung (Batch) für Zeilen {start_row_index_in_sheet} bis {end_row_index_in_sheet}...") @@ -2290,6 +2325,7 @@ def process_branch_batch(sheet_handler, start_row_index_in_sheet, end_row_index_ # Hole Indizes timestamp_col_key = "Timestamp letzte Prüfung" timestamp_col_index = COLUMN_MAP.get(timestamp_col_key) + # ... (andere Indizes wie zuvor) ... branche_crm_idx = COLUMN_MAP.get("CRM Branche") beschreibung_idx = COLUMN_MAP.get("CRM Beschreibung") branche_wiki_idx = COLUMN_MAP.get("Wiki Branche") @@ -2304,17 +2340,19 @@ def process_branch_batch(sheet_handler, start_row_index_in_sheet, end_row_index_ kategorien_wiki_idx, summary_web_idx, version_col_index, branch_w_idx, branch_x_idx, branch_y_idx] if None in required_indices: - debug_print(f"FEHLER: Mindestens ein benötigter Spaltenindex für process_branch_batch fehlt in COLUMN_MAP (benötigt: '{timestamp_col_key}', 'CRM Branche', etc.).") + debug_print(f"FEHLER: Mindestens ein benötigter Spaltenindex für process_branch_batch fehlt in COLUMN_MAP.") return ts_col_letter = sheet_handler._get_col_letter(timestamp_col_index + 1) + # ... (andere Buchstaben) ... version_col_letter = sheet_handler._get_col_letter(version_col_index + 1) branch_w_letter = sheet_handler._get_col_letter(branch_w_idx + 1) branch_x_letter = sheet_handler._get_col_letter(branch_x_idx + 1) branch_y_letter = sheet_handler._get_col_letter(branch_y_idx + 1) + processed_count = 0 - # skipped_count nicht mehr benötigt + skipped_count = 0 # Zähler wieder aktiv if not ALLOWED_TARGET_BRANCHES: load_target_schema() @@ -2330,16 +2368,30 @@ def process_branch_batch(sheet_handler, start_row_index_in_sheet, end_row_index_ row = all_data[row_index_in_list] - # --- KEINE Timestamp-Prüfung mehr hier --- + # --- WIEDER AKTIVIERT: Timestamp-Prüfung für jede Zeile (AO) --- + ts_value_ao = "INDEX_FEHLER" + ts_ao_is_set = False + if len(row) > timestamp_col_index: + ts_value_ao = row[timestamp_col_index] + ts_ao_is_set = bool(str(ts_value_ao).strip()) + # Debug Log (kann reduziert werden) + log_debug = (i < start_row_index_in_sheet + 5 or i > end_row_index_in_sheet - 5 or i % 500 == 0) + if log_debug: + debug_print(f"Zeile {i} (Branch Check): Prüfe Timestamp {ts_col_letter} (Index {timestamp_col_index}). Rohwert='{ts_value_ao}', Strip='{str(ts_value_ao).strip()}', Überspringen? -> {ts_ao_is_set}") - # Daten holen + if ts_ao_is_set: + skipped_count += 1 + # Optional: Weniger Logging + # if skipped_count == 1 or skipped_count % 100 == 0: + # debug_print(f"Zeile {i}: Überspringe Branchen-Einschätzung (Timestamp {ts_col_letter} vorhanden).") + continue + # --- Ende Timestamp-Prüfung --- + + # (Restliche Logik zum Datenholen, Bewerten und Updaten wie zuvor) crm_branche = row[branche_crm_idx] if len(row) > branche_crm_idx else "" - beschreibung = row[beschreibung_idx] if len(row) > beschreibung_idx else "" - wiki_branche = row[branche_wiki_idx] if len(row) > branche_wiki_idx else "" - wiki_kategorien = row[kategorien_wiki_idx] if len(row) > kategorien_wiki_idx else "" + # ... (andere Daten holen) ... website_summary = row[summary_web_idx] if len(row) > summary_web_idx else "" - # debug_print(f"Zeile {i}: Starte Brancheneinschätzung...") # Weniger Lärm result = evaluate_branche_chatgpt(crm_branche, beschreibung, wiki_branche, wiki_kategorien, website_summary) processed_count += 1 @@ -2356,14 +2408,13 @@ def process_branch_batch(sheet_handler, start_row_index_in_sheet, end_row_index_ if updates: success = sheet_handler.batch_update_cells(updates) if success: - # debug_print(f"Zeile {i}: Branch-Einschätzung erfolgreich aktualisiert.") # Weniger Lärm - pass + debug_print(f"Zeile {i}: Branch-Einschätzung erfolgreich aktualisiert.") else: debug_print(f"FEHLER beim Schreiben der Branch-Updates für Zeile {i}.") time.sleep(Config.RETRY_DELAY) - debug_print(f"Brancheneinschätzung (Batch) abgeschlossen. {processed_count} Zeilen eingeschätzt.") + debug_print(f"Brancheneinschätzung (Batch) abgeschlossen. {processed_count} Zeilen eingeschätzt, {skipped_count} Zeilen wg. Timestamp übersprungen.") def process_website_batch(sheet_handler, start_row_index_in_sheet, end_row_index_in_sheet): """Batch-Prozess für Website-Scraping (Rohtext & Zusammenfassung)."""