bugfix
This commit is contained in:
@@ -3210,54 +3210,46 @@ class DataProcessor:
|
||||
def _process_single_row(self, row_num_in_sheet, row_data, process_wiki=True, process_chatgpt=True, process_website=True):
|
||||
"""
|
||||
Verarbeitet die Daten für eine einzelne Zeile, prüft Timestamps für jeden Teilbereich
|
||||
und priorisiert die URL in Spalte M, wenn Wiki neu verarbeitet wird.
|
||||
und stellt sicher, dass aktuelle Wiki-Daten für Branch-Eval verwendet werden.
|
||||
"""
|
||||
debug_print(f"--- Starte Verarbeitung für Zeile {row_num_in_sheet} ---")
|
||||
updates = []
|
||||
now_timestamp = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
|
||||
any_processing_done = False
|
||||
|
||||
# Hilfsfunktion für sicheren Zugriff
|
||||
# Hilfsfunktion
|
||||
def get_cell_value(key):
|
||||
idx = COLUMN_MAP.get(key)
|
||||
if idx is not None and len(row_data) > idx: return row_data[idx]
|
||||
return ""
|
||||
|
||||
# Lese initiale Werte
|
||||
company_name = get_cell_value("CRM Name")
|
||||
website_url = get_cell_value("CRM Website")
|
||||
original_website = website_url
|
||||
crm_branche = get_cell_value("CRM Branche")
|
||||
crm_beschreibung = get_cell_value("CRM Beschreibung")
|
||||
crm_wiki_url = get_cell_value("CRM Vorschlag Wiki URL") # Wird nur noch als Fallback genutzt
|
||||
konsistenz_s = get_cell_value("Chat Wiki Konsistenzprüfung") # Für Re-Parse Trigger
|
||||
|
||||
# Lese aktuelle Werte, die potenziell überschrieben werden
|
||||
website_url = get_cell_value("CRM Website"); original_website = website_url
|
||||
crm_branche = get_cell_value("CRM Branche"); crm_beschreibung = get_cell_value("CRM Beschreibung")
|
||||
crm_wiki_url = get_cell_value("CRM Vorschlag Wiki URL")
|
||||
konsistenz_s = get_cell_value("Chat Wiki Konsistenzprüfung")
|
||||
website_raw = get_cell_value("Website Rohtext") or "k.A."
|
||||
website_summary = get_cell_value("Website Zusammenfassung") or "k.A."
|
||||
wiki_data = { # Lade aktuelle Wiki-Daten für den Fall, dass Wiki nicht neu geparst wird
|
||||
'url': get_cell_value("Wiki URL") or 'k.A.',
|
||||
'first_paragraph': get_cell_value("Wiki Absatz") or 'k.A.',
|
||||
'branche': get_cell_value("Wiki Branche") or 'k.A.',
|
||||
'umsatz': get_cell_value("Wiki Umsatz") or 'k.A.',
|
||||
'mitarbeiter': get_cell_value("Wiki Mitarbeiter") or 'k.A.',
|
||||
'categories': get_cell_value("Wiki Kategorien") or 'k.A.'
|
||||
# Initialisiere wiki_data mit Werten aus dem Sheet (Fallback)
|
||||
wiki_data = {
|
||||
'url': get_cell_value("Wiki URL") or 'k.A.', 'first_paragraph': get_cell_value("Wiki Absatz") or 'k.A.',
|
||||
'branche': get_cell_value("Wiki Branche") or 'k.A.', 'umsatz': get_cell_value("Wiki Umsatz") or 'k.A.',
|
||||
'mitarbeiter': get_cell_value("Wiki Mitarbeiter") or 'k.A.', 'categories': get_cell_value("Wiki Kategorien") or 'k.A.'
|
||||
}
|
||||
wiki_data_updated_in_this_run = False # Flag, ob Wiki neu geparst wurde
|
||||
|
||||
# --- 1. Website Handling (wie zuletzt -> prüft AT) ---
|
||||
# --- 1. Website Handling (prüft AT) ---
|
||||
website_ts_needed = process_website and not get_cell_value("Website Scrape Timestamp").strip()
|
||||
if website_ts_needed:
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Starte Website Verarbeitung (Timestamp AT fehlt)...")
|
||||
any_processing_done = True
|
||||
# --- Lookup ---
|
||||
any_processing_done = True; debug_print(f"Zeile {row_num_in_sheet}: Starte Website Verarbeitung...")
|
||||
# --- Lookup & Scraping ---
|
||||
if not website_url or website_url.strip().lower() == "k.a.":
|
||||
new_website = serp_website_lookup(company_name)
|
||||
if new_website != "k.A.": website_url = new_website; debug_print(f"Zeile {row_num_in_sheet}: SERP Lookup: {website_url}");
|
||||
if new_website != "k.A.": website_url = new_website;
|
||||
if website_url != original_website: updates.append({'range': f'D{row_num_in_sheet}', 'values': [[website_url]]})
|
||||
else: debug_print(f"Zeile {row_num_in_sheet}: SERP Lookup erfolglos.")
|
||||
# --- Scraping ---
|
||||
if website_url and website_url.strip().lower() != "k.a.":
|
||||
new_website_raw = get_website_raw(website_url)
|
||||
new_website_summary = summarize_website_content(new_website_raw)
|
||||
new_website_raw = get_website_raw(website_url); new_website_summary = summarize_website_content(new_website_raw)
|
||||
if new_website_raw != website_raw: updates.append({'range': f'AR{row_num_in_sheet}', 'values': [[new_website_raw]]}); website_raw = new_website_raw
|
||||
if new_website_summary != website_summary: updates.append({'range': f'AS{row_num_in_sheet}', 'values': [[new_website_summary]]}); website_summary = new_website_summary
|
||||
else:
|
||||
@@ -3265,103 +3257,94 @@ class DataProcessor:
|
||||
if website_summary != "k.A.": updates.append({'range': f'AS{row_num_in_sheet}', 'values': [['k.A.']]})
|
||||
website_raw, website_summary = "k.A.", "k.A."
|
||||
updates.append({'range': f'AT{row_num_in_sheet}', 'values': [[now_timestamp]]})
|
||||
elif process_website:
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Überspringe Website Verarbeitung (Timestamp AT vorhanden).")
|
||||
elif process_website: debug_print(f"Zeile {row_num_in_sheet}: Überspringe Website (AT vorhanden).")
|
||||
|
||||
# --- 2. Wikipedia Handling (ANGEPASSTE LOGIK) ---
|
||||
# Trigger für Reparsing: AN fehlt ODER Status S ist "X (URL Copied)"
|
||||
# --- 2. Wikipedia Handling (prüft AN oder S='X (URL Copied)') ---
|
||||
wiki_ts_an_missing = not get_cell_value("Wikipedia Timestamp").strip()
|
||||
status_s_indicates_reparse = konsistenz_s.strip().upper() == "X (URL COPIED)"
|
||||
reparse_wiki_needed = process_wiki and (wiki_ts_an_missing or status_s_indicates_reparse)
|
||||
|
||||
if reparse_wiki_needed:
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Starte Wikipedia Verarbeitung (Grund: AN fehlt? {wiki_ts_an_missing}, S='X (URL Copied)'? {status_s_indicates_reparse})...")
|
||||
any_processing_done = True
|
||||
new_wiki_data_extracted = None # Wird mit den neuen Daten gefüllt
|
||||
any_processing_done = True; debug_print(f"Zeile {row_num_in_sheet}: Starte Wikipedia Verarbeitung (AN fehlt? {wiki_ts_an_missing}, S='X(Copied)'? {status_s_indicates_reparse})...")
|
||||
new_wiki_data_extracted = None
|
||||
|
||||
# --- Priorisiere URL aus Spalte M ---
|
||||
url_to_parse = get_cell_value("Wiki URL").strip()
|
||||
url_to_parse = get_cell_value("Wiki URL").strip() # Holt die URL, die ggf. von update_wiki kopiert wurde
|
||||
if url_to_parse and url_to_parse.lower() not in ["k.a.", "kein artikel gefunden"] and url_to_parse.lower().startswith("http"):
|
||||
debug_print(f" -> Nutze vorhandene URL aus Spalte M: {url_to_parse}")
|
||||
new_wiki_data_extracted = self.wiki_scraper.extract_company_data(url_to_parse)
|
||||
else:
|
||||
# --- Nur wenn M leer/ungültig ist, starte die Suche ---
|
||||
debug_print(f" -> Spalte M ('{url_to_parse}') ungültig/leer. Starte Wiki-Suche...")
|
||||
# ... (Suchlogik wie zuvor, nutzt crm_wiki_url als Fallback) ...
|
||||
valid_crm_wiki_url = crm_wiki_url if crm_wiki_url and crm_wiki_url.strip() not in ["", "k.A."] else None
|
||||
article_page = None
|
||||
current_website_for_validation = website_url if website_url and website_url != 'k.A.' else original_website # Nutze aktuelle URL
|
||||
if valid_crm_wiki_url:
|
||||
debug_print(f" -> Prüfe CRM Vorschlag L: {valid_crm_wiki_url}")
|
||||
page = self.wiki_scraper._fetch_page_content(valid_crm_wiki_url.split('/')[-1])
|
||||
if page and self.wiki_scraper._validate_article(page, company_name, current_website_for_validation): article_page = page
|
||||
else: debug_print(f" -> CRM Vorschlag L nicht validiert. Starte Suche..."); article_page = self.wiki_scraper.search_company_article(company_name, current_website_for_validation)
|
||||
else:
|
||||
debug_print(f" -> Kein CRM Vorschlag L. Starte Suche...")
|
||||
article_page = self.wiki_scraper.search_company_article(company_name, current_website_for_validation)
|
||||
article_page = None; current_website = website_url if website_url and website_url != 'k.A.' else original_website
|
||||
if valid_crm_wiki_url: # ... (Prüfe CRM Vorschlag) ...
|
||||
else: article_page = self.wiki_scraper.search_company_article(company_name, current_website)
|
||||
if article_page: new_wiki_data_extracted = self.wiki_scraper.extract_company_data(article_page.url)
|
||||
else: new_wiki_data_extracted = {'url': 'Kein Artikel gefunden', 'first_paragraph': 'k.A.', 'branche': 'k.A.', 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.'}
|
||||
|
||||
if article_page:
|
||||
debug_print(f" -> Artikel gefunden durch Suche: {article_page.url}")
|
||||
new_wiki_data_extracted = self.wiki_scraper.extract_company_data(article_page.url)
|
||||
else:
|
||||
debug_print(f" -> Kein passender Wikipedia Artikel durch Suche gefunden.")
|
||||
new_wiki_data_extracted = {'url': 'Kein Artikel gefunden', 'first_paragraph': 'k.A.', 'branche': 'k.A.', 'umsatz': 'k.A.', 'mitarbeiter': 'k.A.', 'categories': 'k.A.'}
|
||||
|
||||
# --- Updates für Wiki-Spalten vorbereiten ---
|
||||
# --- WICHTIG: Überschreibe wiki_data mit den NEUEN Ergebnissen ---
|
||||
if new_wiki_data_extracted:
|
||||
wiki_data = new_wiki_data_extracted # Überschreibe alte Daten für nachfolgende Schritte
|
||||
wiki_data = new_wiki_data_extracted # <-- Hier werden die Daten für den Branch-Teil aktualisiert!
|
||||
wiki_data_updated_in_this_run = True # Setze Flag
|
||||
# Füge Updates für M-R und AN hinzu
|
||||
updates.append({'range': f'M{row_num_in_sheet}', 'values': [[wiki_data.get('url', 'k.A.')]]})
|
||||
updates.append({'range': f'N{row_num_in_sheet}', 'values': [[wiki_data.get('first_paragraph', 'k.A.')]]})
|
||||
# ... (Updates für O, P, Q, R) ...
|
||||
updates.append({'range': f'O{row_num_in_sheet}', 'values': [[wiki_data.get('branche', 'k.A.')]]})
|
||||
updates.append({'range': f'P{row_num_in_sheet}', 'values': [[wiki_data.get('umsatz', 'k.A.')]]})
|
||||
updates.append({'range': f'Q{row_num_in_sheet}', 'values': [[wiki_data.get('mitarbeiter', 'k.A.')]]})
|
||||
updates.append({'range': f'R{row_num_in_sheet}', 'values': [[wiki_data.get('categories', 'k.A.')]]})
|
||||
updates.append({'range': f'AN{row_num_in_sheet}', 'values': [[now_timestamp]]}) # Setze AN Timestamp neu
|
||||
updates.append({'range': f'AN{row_num_in_sheet}', 'values': [[now_timestamp]]}) # Setze AN neu
|
||||
|
||||
# Wenn der Trigger "X (URL Copied)" war, setze S zurück
|
||||
if status_s_indicates_reparse:
|
||||
konsistenz_s_idx = COLUMN_MAP.get("Chat Wiki Konsistenzprüfung")
|
||||
if konsistenz_s_idx is not None:
|
||||
s_col_letter = self.sheet_handler._get_col_letter(konsistenz_s_idx + 1)
|
||||
updates.append({'range': f'{s_col_letter}{row_num_in_sheet}', 'values': [["?"]]}) # Setze auf "?" für erneute Prüfung
|
||||
s_idx = COLUMN_MAP.get("Chat Wiki Konsistenzprüfung")
|
||||
if s_idx is not None:
|
||||
s_let = self.sheet_handler._get_col_letter(s_idx + 1)
|
||||
updates.append({'range': f'{s_let}{row_num_in_sheet}', 'values': [["?"]]})
|
||||
debug_print(f" -> Status S zurückgesetzt auf '?' für erneute Verifikation.")
|
||||
else:
|
||||
debug_print(f" -> FEHLER: Keine neuen Wiki-Daten extrahiert.")
|
||||
# wiki_data behält die alten/default Werte
|
||||
|
||||
elif process_wiki:
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Überspringe Wikipedia Verarbeitung (Timestamp AN vorhanden UND S != 'X (URL Copied)').")
|
||||
# else: Wiki-Verarbeitung nicht aktiv
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Überspringe Wikipedia Verarbeitung (AN vorhanden UND S != 'X (URL Copied)').")
|
||||
|
||||
# --- 3. ChatGPT Evaluationen (Branch etc.) ---
|
||||
# Trigger: AO fehlt ODER Wiki wurde gerade neu geparsed (um Branch neu zu bewerten)
|
||||
# Trigger: AO fehlt ODER Wiki wurde in DIESEM Lauf neu geparsed
|
||||
chat_ts_ao_missing = not get_cell_value("Timestamp letzte Prüfung").strip()
|
||||
run_chat_eval = process_chatgpt and (chat_ts_ao_missing or reparse_wiki_needed) # reparse_wiki_needed ist True wenn Wiki neu gemacht wurde
|
||||
run_chat_eval = process_chatgpt and (chat_ts_ao_missing or wiki_data_updated_in_this_run) # <-- Nutze das neue Flag
|
||||
|
||||
if run_chat_eval:
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Starte ChatGPT Evaluationen (Grund: AO fehlt? {chat_ts_ao_missing}, Wiki neu geparsed? {reparse_wiki_needed})...")
|
||||
any_processing_done = True # Markiere, dass etwas getan wurde
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Starte ChatGPT Evaluationen (Grund: AO fehlt? {chat_ts_ao_missing}, Wiki gerade aktualisiert? {wiki_data_updated_in_this_run})...")
|
||||
any_processing_done = True
|
||||
|
||||
# 3.1 Branchenevaluierung (Nutzt die ggf. gerade aktualisierten wiki_data)
|
||||
# 3.1 Branchenevaluierung (Nutzt IMMER die aktuelle 'wiki_data' Variable)
|
||||
branch_result = evaluate_branche_chatgpt(
|
||||
crm_branche, crm_beschreibung,
|
||||
wiki_data.get('branche', 'k.A.'), # Nimmt aktuelle wiki_data
|
||||
wiki_data.get('categories', 'k.A.'),# Nimmt aktuelle wiki_data
|
||||
website_summary # Nimmt aktuellen website_summary
|
||||
wiki_data.get('branche', 'k.A.'), # Nimmt die potenziell neuen Daten
|
||||
wiki_data.get('categories', 'k.A.'),# Nimmt die potenziell neuen Daten
|
||||
website_summary
|
||||
)
|
||||
updates.append({'range': f'W{row_num_in_sheet}', 'values': [[branch_result.get('branch', 'Fehler')]]})
|
||||
updates.append({'range': f'X{row_num_in_sheet}', 'values': [[branch_result.get('consistency', 'Fehler')]]})
|
||||
updates.append({'range': f'Y{row_num_in_sheet}', 'values': [[branch_result.get('justification', 'Fehler')]]})
|
||||
|
||||
# --- Hier weitere ChatGPT Evaluationen einfügen ---
|
||||
# ... (FSM, Mitarbeiter etc.) ...
|
||||
# ... (Hier weitere ChatGPT Evaluationen) ...
|
||||
|
||||
# Setze Timestamp letzte Prüfung (AO)
|
||||
updates.append({'range': f'AO{row_num_in_sheet}', 'values': [[now_timestamp]]})
|
||||
|
||||
elif process_chatgpt:
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Überspringe ChatGPT Evaluationen (Timestamp AO vorhanden UND Wiki nicht neu geparsed).")
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Überspringe ChatGPT Evaluationen (AO vorhanden UND Wiki nicht gerade aktualisiert).")
|
||||
|
||||
# --- 4. Abschließende Updates ---
|
||||
if any_processing_done:
|
||||
updates.append({'range': f'AP{row_num_in_sheet}', 'values': [[Config.VERSION]]}) # Setze Version nur wenn etwas getan wurde
|
||||
updates.append({'range': f'AP{row_num_in_sheet}', 'values': [[Config.VERSION]]})
|
||||
|
||||
# --- 5. Batch Update für diese Zeile durchführen ---
|
||||
# --- 5. Batch Update ---
|
||||
if updates:
|
||||
success = self.sheet_handler.batch_update_cells(updates)
|
||||
if success: debug_print(f"Zeile {row_num_in_sheet}: Batch-Update erfolgreich ({len(updates)} Zellen/Bereiche).")
|
||||
@@ -3370,7 +3353,7 @@ class DataProcessor:
|
||||
debug_print(f"Zeile {row_num_in_sheet}: Keine Updates zum Schreiben.")
|
||||
|
||||
debug_print(f"--- Verarbeitung für Zeile {row_num_in_sheet} abgeschlossen ---")
|
||||
time.sleep(max(0.1, Config.RETRY_DELAY / 20)) # Kürzere Pause, da Haupt-API Calls schon Pausen haben
|
||||
time.sleep(max(0.1, Config.RETRY_DELAY / 25)) # Noch kürzere Pause hier
|
||||
|
||||
|
||||
def process_rows_sequentially(self, start_row_index, num_rows_to_process, process_wiki=True, process_chatgpt=True, process_website=True):
|
||||
|
||||
Reference in New Issue
Block a user