From 93d4d895318dfcfb98b3ae6b7f67dbb2087d6bc7 Mon Sep 17 00:00:00 2001 From: bsiggel Date: Sun, 8 Mar 2026 19:21:17 +0000 Subject: [PATCH] feat(document-sync): update xaiSyncStatus handling and logging for document synchronization --- services/document_sync_utils.py | 81 +++++++++++++++++++-------------- 1 file changed, 47 insertions(+), 34 deletions(-) diff --git a/services/document_sync_utils.py b/services/document_sync_utils.py index 951d2c7..45a4a95 100644 --- a/services/document_sync_utils.py +++ b/services/document_sync_utils.py @@ -48,15 +48,13 @@ class DocumentSync(BaseSyncUtils): self._log(f"Redis lock bereits aktiv fΓΌr {entity_type} {entity_id}", level='warn') return False - # STEP 2: Update syncStatus (fΓΌr UI visibility) - nur bei Document Entity - # CDokumente hat dieses Feld nicht - ΓΌberspringen - if entity_type == 'Document': - try: - await self.espocrm.update_entity(entity_type, entity_id, { - 'xaiSyncStatus': 'syncing' - }) - except Exception as e: - self._log(f"Konnte xaiSyncStatus nicht setzen: {e}", level='debug') + # STEP 2: Update xaiSyncStatus auf pending_sync + try: + await self.espocrm.update_entity(entity_type, entity_id, { + 'xaiSyncStatus': 'pending_sync' + }) + except Exception as e: + self._log(f"Konnte xaiSyncStatus nicht setzen: {e}", level='debug') self._log(f"Sync-Lock fΓΌr {entity_type} {entity_id} erworben") return True @@ -89,17 +87,16 @@ class DocumentSync(BaseSyncUtils): try: update_data = {} - # Status-Felder nur bei Document Entity (CDokumente hat diese Felder nicht) - if entity_type == 'Document': - try: - update_data['xaiSyncStatus'] = 'synced' if success else 'failed' - - if error_message: - update_data['xaiSyncError'] = error_message[:2000] - else: - update_data['xaiSyncError'] = None - except: - pass # Felder existieren evtl. nicht + # xaiSyncStatus setzen: clean bei Erfolg, failed bei Fehler + try: + update_data['xaiSyncStatus'] = 'clean' if success else 'failed' + + if error_message: + update_data['xaiSyncError'] = error_message[:2000] + else: + update_data['xaiSyncError'] = None + except: + pass # Felder existieren evtl. nicht # Merge extra fields (z.B. xaiFileId, xaiCollections) if extra_fields: @@ -148,6 +145,7 @@ class DocumentSync(BaseSyncUtils): # xAI-relevante Felder xai_file_id = document.get('xaiFileId') xai_collections = document.get('xaiCollections') or [] + xai_sync_status = document.get('xaiSyncStatus') # Datei-Status und Hash-Felder datei_status = document.get('dateiStatus') or document.get('fileStatus') @@ -158,7 +156,8 @@ class DocumentSync(BaseSyncUtils): self._log(f"πŸ“‹ Document Analysis: {doc_name} (ID: {doc_id})") self._log(f" xaiFileId: {xai_file_id or 'N/A'}") self._log(f" xaiCollections: {xai_collections}") - self._log(f" Datei-Status: {datei_status or 'N/A'}") + self._log(f" xaiSyncStatus: {xai_sync_status or 'N/A'}") + self._log(f" fileStatus: {datei_status or 'N/A'}") self._log(f" MD5: {file_md5[:16] if file_md5 else 'N/A'}...") self._log(f" SHA: {file_sha[:16] if file_sha else 'N/A'}...") self._log(f" xaiSyncedHash: {xai_synced_hash[:16] if xai_synced_hash else 'N/A'}...") @@ -169,22 +168,34 @@ class DocumentSync(BaseSyncUtils): entity_type=entity_type ) + # PrΓΌfe xaiSyncStatus="no_sync" β†’ kein Sync fΓΌr dieses Dokument + if xai_sync_status == 'no_sync': + self._log("⏭️ Kein xAI-Sync nΓΆtig: xaiSyncStatus='no_sync'") + return (False, [], "xaiSyncStatus ist 'no_sync'") + if not target_collections: self._log("⏭️ Kein xAI-Sync nΓΆtig: Keine Related Entities mit xAI Collections") return (False, [], "Keine verknΓΌpften Entities mit xAI Collections") # ═══════════════════════════════════════════════════════════════ - # PRIORITY CHECK: Datei-Status "Neu" oder "GeΓ€ndert" + # PRIORITY CHECK 1: xaiSyncStatus="unclean" β†’ Dokument wurde geΓ€ndert # ═══════════════════════════════════════════════════════════════ - if datei_status in ['Neu', 'GeΓ€ndert', 'neu', 'geΓ€ndert', 'New', 'Changed']: - self._log(f"πŸ†• Datei-Status: '{datei_status}' β†’ xAI-Sync ERFORDERLICH") + if xai_sync_status == 'unclean': + self._log(f"πŸ†• xaiSyncStatus='unclean' β†’ xAI-Sync ERFORDERLICH") + return (True, target_collections, "xaiSyncStatus='unclean'") + + # ═══════════════════════════════════════════════════════════════ + # PRIORITY CHECK 2: fileStatus "new" oder "changed" + # ═══════════════════════════════════════════════════════════════ + if datei_status in ['new', 'changed', 'neu', 'geΓ€ndert', 'New', 'Changed', 'Neu', 'GeΓ€ndert']: + self._log(f"πŸ†• fileStatus: '{datei_status}' β†’ xAI-Sync ERFORDERLICH") if target_collections: - return (True, target_collections, f"Datei-Status: {datei_status}") + return (True, target_collections, f"fileStatus: {datei_status}") else: # Datei ist neu/geΓ€ndert aber keine Collections gefunden - self._log(f"⚠️ Datei-Status '{datei_status}' aber keine Collections gefunden - ΓΌberspringe Sync") - return (False, [], f"Datei-Status: {datei_status}, aber keine Collections") + self._log(f"⚠️ fileStatus '{datei_status}' aber keine Collections gefunden - ΓΌberspringe Sync") + return (False, [], f"fileStatus: {datei_status}, aber keine Collections") # ═══════════════════════════════════════════════════════════════ # FALL 1: Document ist bereits in xAI UND Collections sind gesetzt @@ -513,15 +524,17 @@ class DocumentSync(BaseSyncUtils): if collection_ids is not None: update_data['xaiCollections'] = collection_ids - # Status zurΓΌcksetzen wenn xAI-Sync erfolgt ist ODER explizit angefordert - if xai_file_id or reset_file_status: - # CDokumente verwendet fileStatus, Document verwendet dateiStatus + # fileStatus auf "unchanged" setzen wenn Dokument verarbeitet/clean ist + if reset_file_status: if entity_type == 'CDokumente': - # Bei xAI-Sync: "synced", bei nur Preview: "processed" - update_data['fileStatus'] = 'synced' if xai_file_id else 'processed' + update_data['fileStatus'] = 'unchanged' else: - # Bei xAI-Sync: "Gesynct", bei nur Preview: "Verarbeitet" - update_data['dateiStatus'] = 'Gesynct' if xai_file_id else 'Verarbeitet' + # Document Entity hat kein fileStatus, nur dateiStatus + update_data['dateiStatus'] = 'unchanged' + + # xaiSyncStatus auf "clean" setzen wenn xAI-Sync erfolgreich war + if xai_file_id: + update_data['xaiSyncStatus'] = 'clean' # Hash speichern fΓΌr zukΓΌnftige Change Detection if file_hash: