This commit is contained in:
2025-04-17 19:19:44 +00:00
parent deed2acf2d
commit 6b970ab0e7

View File

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