Added functionality to delete old occourences

This commit is contained in:
Marius
2026-04-23 10:16:40 +02:00
parent 52580f738c
commit b2777f4b6a
+36 -1
View File
@@ -82,6 +82,10 @@ def update_page(page_id, properties, icon=None):
return _request("PATCH", f"/pages/{page_id}", body)
def archive_page(page_id):
return _request("PATCH", f"/pages/{page_id}", {"archived": True})
# ---------------------------------------------------------------------------
# Property extraction
# ---------------------------------------------------------------------------
@@ -294,6 +298,7 @@ def sync():
created = 0
updated = 0
skipped = 0
desired_keys = set()
for page in recurring_pages:
cfg = parse_recurring_event(page)
@@ -306,6 +311,7 @@ def sync():
f"{len(occurrences)} occurrence(s) computed.")
for occ in occurrences:
key = (cfg["name"], occ.isoformat())
desired_keys.add(key)
props = _build_calendar_properties(cfg, occ, today)
icon = cfg["icon"]
if key in existing:
@@ -315,7 +321,36 @@ def sync():
create_page(props, icon=icon)
created += 1
print(f"Done. Created {created}, updated {updated}, skipped {skipped}.")
# Purge stale recurring entries: any calendar page marked as recurring
# that no longer corresponds to a desired (name, date) occurrence.
archived = _purge_stale(calendar_pages, desired_keys)
print(f"Done. Created {created}, updated {updated}, archived {archived}, "
f"skipped {skipped}.")
def _purge_stale(calendar_pages, desired_keys):
archived = 0
for page in calendar_pages:
# Skip pages that are already archived / in trash.
if page.get("archived") or page.get("in_trash"):
continue
props = page["properties"]
# Only consider entries flagged as recurring — manual entries are
# always left untouched.
is_recurring = props.get("Is Recurring", {}).get("checkbox", False)
if not is_recurring:
continue
name = _title_text(props["Event Name"])
d = _date_start(props["Date"])
if not name or not d:
continue
key = (name, d.isoformat())
if key not in desired_keys:
archive_page(page["id"])
archived += 1
print(f" Archived stale occurrence: {name} @ {d.isoformat()}")
return archived
if __name__ == "__main__":