From 744c71400d9a43104facf933a624e503c4012ff3 Mon Sep 17 00:00:00 2001 From: Stefan Koelle Date: Thu, 6 Aug 2026 22:15:25 +0200 Subject: [PATCH] sync fullsync fix 2 --- src/carddav_client.py | 10 +++++----- src/sync.py | 6 ++++++ 2 files changed, 11 insertions(+), 5 deletions(-) diff --git a/src/carddav_client.py b/src/carddav_client.py index 03f1d81..6fb6fef 100644 --- a/src/carddav_client.py +++ b/src/carddav_client.py @@ -98,13 +98,11 @@ class CardDAVClient: return self._absolute(href.text) 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. Gibt (changed_vcards, etags, deleted_hrefs, new_sync_token) zurück. - changed_vcards: list[str] roher vCard-Text - etags: list[str|None] ETag pro vCard (None wenn nicht vorhanden) - deleted_hrefs: list[str] Hrefs von gelöschten Kontakten (status 404) + fetch_missing: Wenn True, werden Kontakte ohne address-data per GET nachgeholt. """ token_element = f"{sync_token}" if sync_token else "" body = f""" @@ -141,10 +139,12 @@ class CardDAVClient: logger.debug(" UPSERT href=%s etag=%s (inline data)", href, etag) vcards.append(data.text) etags.append(etag) - else: + elif fetch_missing: logger.debug(" UPSERT href=%s etag=%s (keine Daten, hole per GET)", href, etag) if href: 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: vcard_text = self._get_vcard_by_href(collection_url, href) diff --git a/src/sync.py b/src/sync.py index 21f88db..2bc7675 100644 --- a/src/sync.py +++ b/src/sync.py @@ -38,6 +38,9 @@ def sync_account(conn, account, href_to_uid_cache: dict): else: logger.warning("[%s] vCard konnte nicht geparst werden, überspringe", account.name) 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) logger.info("[%s] Initialer Sync abgeschlossen: %d Kontakte", account.name, len(contacts)) return @@ -56,6 +59,9 @@ def sync_account(conn, account, href_to_uid_cache: dict): else: logger.warning("[%s] vCard konnte nicht geparst werden, überspringe", account.name) 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) logger.info("[%s] Re-Sync abgeschlossen: %d Kontakte", account.name, len(contacts)) return