feat(document-sync): update xaiSyncStatus handling and logging for document synchronization
This commit is contained in:
@@ -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:
|
||||
|
||||
Reference in New Issue
Block a user