sync fullsync fix 2

This commit is contained in:
2026-08-06 22:15:25 +02:00
parent c457e5a78a
commit 744c71400d
2 changed files with 11 additions and 5 deletions
+5 -5
View File
@@ -98,13 +98,11 @@ class CardDAVClient:
return self._absolute(href.text) return self._absolute(href.text)
raise RuntimeError("Keine addressbook-Collection gefunden") raise RuntimeError("Keine addressbook-Collection gefunden")
def sync_collection(self, collection_url: str, sync_token: str | None): def sync_collection(self, collection_url: str, sync_token: str | None, fetch_missing: bool = True):
""" """
Führt REPORT sync-collection aus. Führt REPORT sync-collection aus.
Gibt (changed_vcards, etags, deleted_hrefs, new_sync_token) zurück. Gibt (changed_vcards, etags, deleted_hrefs, new_sync_token) zurück.
changed_vcards: list[str] roher vCard-Text fetch_missing: Wenn True, werden Kontakte ohne address-data per GET nachgeholt.
etags: list[str|None] ETag pro vCard (None wenn nicht vorhanden)
deleted_hrefs: list[str] Hrefs von gelöschten Kontakten (status 404)
""" """
token_element = f"<d:sync-token>{sync_token}</d:sync-token>" if sync_token else "<d:sync-token/>" token_element = f"<d:sync-token>{sync_token}</d:sync-token>" if sync_token else "<d:sync-token/>"
body = f"""<?xml version="1.0" encoding="utf-8" ?> body = f"""<?xml version="1.0" encoding="utf-8" ?>
@@ -141,10 +139,12 @@ class CardDAVClient:
logger.debug(" UPSERT href=%s etag=%s (inline data)", href, etag) logger.debug(" UPSERT href=%s etag=%s (inline data)", href, etag)
vcards.append(data.text) vcards.append(data.text)
etags.append(etag) etags.append(etag)
else: elif fetch_missing:
logger.debug(" UPSERT href=%s etag=%s (keine Daten, hole per GET)", href, etag) logger.debug(" UPSERT href=%s etag=%s (keine Daten, hole per GET)", href, etag)
if href: if href:
missing_hrefs.append((href, etag)) missing_hrefs.append((href, etag))
else:
logger.debug(" SKIP href=%s etag=%s (keine Daten, fetch_missing=False)", href, etag)
for href, etag in missing_hrefs: for href, etag in missing_hrefs:
vcard_text = self._get_vcard_by_href(collection_url, href) vcard_text = self._get_vcard_by_href(collection_url, href)
+6
View File
@@ -38,6 +38,9 @@ def sync_account(conn, account, href_to_uid_cache: dict):
else: else:
logger.warning("[%s] vCard konnte nicht geparst werden, überspringe", account.name) logger.warning("[%s] vCard konnte nicht geparst werden, überspringe", account.name)
db.replace_all_contacts_for_account(conn, account.name, contacts, run_id) db.replace_all_contacts_for_account(conn, account.name, contacts, run_id)
_, _, _, new_token = client.sync_collection(collection_url, None, fetch_missing=False)
if new_token:
db.save_sync_token(conn, account.name, new_token)
db.finish_sync_run(conn, run_id, "success", upserted=len(contacts), deleted=0) db.finish_sync_run(conn, run_id, "success", upserted=len(contacts), deleted=0)
logger.info("[%s] Initialer Sync abgeschlossen: %d Kontakte", account.name, len(contacts)) logger.info("[%s] Initialer Sync abgeschlossen: %d Kontakte", account.name, len(contacts))
return return
@@ -56,6 +59,9 @@ def sync_account(conn, account, href_to_uid_cache: dict):
else: else:
logger.warning("[%s] vCard konnte nicht geparst werden, überspringe", account.name) logger.warning("[%s] vCard konnte nicht geparst werden, überspringe", account.name)
db.replace_all_contacts_for_account(conn, account.name, contacts, run_id) db.replace_all_contacts_for_account(conn, account.name, contacts, run_id)
_, _, _, new_token = client.sync_collection(collection_url, None, fetch_missing=False)
if new_token:
db.save_sync_token(conn, account.name, new_token)
db.finish_sync_run(conn, run_id, "success", upserted=len(contacts), deleted=0) db.finish_sync_run(conn, run_id, "success", upserted=len(contacts), deleted=0)
logger.info("[%s] Re-Sync abgeschlossen: %d Kontakte", account.name, len(contacts)) logger.info("[%s] Re-Sync abgeschlossen: %d Kontakte", account.name, len(contacts))
return return