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
# NEUE Funktion für Wiki-Updates basierend auf ChatGPT Vorschlägen (mit Status-Update in S) # 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 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). 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' 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, LÖSCHT die Timestamps AN, AX, AO sowie die Version AP UND SETZT 'x' in Spalte A,
um eine Neuverarbeitung durch andere Modi zu ermöglichen. um eine Neuverarbeitung durch den 'reeval'-Modus zu triggern.
Verarbeitet maximal row_limit Kandidaten. 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 if not sheet_handler.load_data(): return
all_data = sheet_handler.get_all_data_with_headers() 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 header_rows = 5
data_rows = all_data[header_rows:] data_rows = all_data[header_rows:]
# Indizes holen (weniger benötigt jetzt, aber schadet nicht) # Indizes holen (inkl. ReEval Flag)
required_keys = ["Chat Wiki Konsistenzprüfung", "Chat Vorschlag Wiki Artikel", "Wiki URL", required_keys = [
"Wikipedia Timestamp", "Wiki Verif. Timestamp", "Timestamp letzte Prüfung", "Version"] "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 = {} col_indices = {}
all_keys_found = True all_keys_found = True
for key in required_keys: 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 = [] all_sheet_updates = []
processed_rows_count = 0 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): for idx, row in enumerate(data_rows):
row_num_in_sheet = idx + header_rows + 1 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.") debug_print(f"Zeilenlimit ({row_limit}) erreicht.")
break break
def get_value(key): # Sicherer Zugriff def get_value(key):
index = col_indices.get(key) index = col_indices.get(key)
if index is not None and len(row) > index: return row[index] if index is not None and len(row) > index: return row[index]
return "" 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") vorschlag_u = get_value("Chat Vorschlag Wiki Artikel")
url_m = get_value("Wiki URL") url_m = get_value("Wiki URL")
# Bedingung prüfen # Bedingung prüfen (wie zuletzt)
is_update_candidate = False; new_url = "" is_update_candidate = False; new_url = ""
konsistenz_s_upper = konsistenz_s.strip().upper() konsistenz_s_upper = konsistenz_s.strip().upper()
vorschlag_u_cleaned = vorschlag_u.strip() vorschlag_u_cleaned = vorschlag_u.strip()
url_m_cleaned = url_m.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://")) condition2_u_is_url = vorschlag_u_cleaned.lower().startswith(("http://", "https://"))
condition3_u_differs_m = False condition3_u_differs_m = False
if condition2_u_is_url: new_url = vorschlag_u_cleaned; condition3_u_differs_m = new_url != url_m_cleaned 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 is_update_candidate = condition1_status_nok and condition2_u_is_url and condition3_u_differs_m
if is_update_candidate: 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) 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) 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) 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_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) 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) 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 = [ row_updates = [
{'range': f'{url_m_letter}{row_num_in_sheet}', 'values': [[new_url]]}, # Neue URL nach M {'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_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'{ts_ao_letter}{row_num_in_sheet}', 'values': [[""]]}, # AO löschen
{'range': f'{version_ap_letter}{row_num_in_sheet}', 'values': [[""]]}, # AP 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) all_sheet_updates.extend(row_updates)
processed_rows_count += 1
# Kein Reparsing/Rebranching hier! # Kein Reparsing/Rebranching hier!
# Batch Update am Ende # Batch Update am Ende
if all_sheet_updates: 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) success = sheet_handler.batch_update_cells(all_sheet_updates)
if success: debug_print(f"Sheet-Update für URL-Kopien/Resets erfolgreich.") if success: debug_print(f"Sheet-Update für Wiki-Korrektur-Vorbereitung erfolgreich.")
else: debug_print(f"FEHLER beim Sheet-Update für URL-Kopien/Resets.") else: debug_print(f"FEHLER beim Sheet-Update für Wiki-Korrektur-Vorbereitung.")
else: 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): def extract_numeric_value(raw_value, is_umsatz=False):
"""Extrahiert und normalisiert Zahlenwerte (Umsatz in Mio, Mitarbeiter).""" """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) self._process_single_row(row_num_in_sheet, row_data, process_wiki, process_chatgpt, process_website)
def process_reevaluation_rows(self): def process_reevaluation_rows(self, row_limit=None, clear_flag=True):
""" Verarbeitet nur Zeilen, die in Spalte A mit 'x' markiert sind. """ """
debug_print("Starte Re-Evaluierungsmodus (Spalte A = 'x')...") Verarbeitet nur Zeilen, die in Spalte A mit 'x' markiert sind.
data_rows = self.sheet_handler.get_data() 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 header_rows = 5
rows_processed = 0 data_rows = all_data[header_rows:]
reeval_col_idx = COLUMN_MAP.get("ReEval Flag") 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: rows_to_process = []
debug_print("FEHLER: Spalte 'ReEval Flag' nicht in COLUMN_MAP gefunden. Breche Re-Evaluierung ab.") # Finde zuerst alle Kandidaten
return for idx, row in enumerate(data_rows):
for i, row in enumerate(data_rows):
row_num_in_sheet = i + header_rows + 1
# Prüfe Flag in Spalte A (Index 0)
if len(row) > reeval_col_idx and row[reeval_col_idx].strip().lower() == "x": 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 # 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) # _process_single_row prüft intern Timestamps AN, AT, AO
rows_processed += 1 self._process_single_row(row_num, row_data, process_wiki=True, process_chatgpt=True, process_website=True)
# Optional: Flag nach Verarbeitung löschen? processed_count += 1
# update_flag = [{'range': f'A{row_num_in_sheet}', 'values': [['']]}]
# self.sheet_handler.batch_update_cells(update_flag) # Optional: Flag nach Verarbeitung löschen
debug_print(f"Re-Evaluierung abgeschlossen. {rows_processed} Zeilen verarbeitet.") 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): def process_website_details_for_marked_rows(self):