From 82683cf1f81040465e108f3b7239aed97031dd55 Mon Sep 17 00:00:00 2001 From: eclipse Date: Fri, 14 Feb 2025 12:04:22 +0100 Subject: [PATCH] added fetch script for calendar events that should appear under "Termine" --- .gitignore | 1 + utils/refresh-events.py | 45 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100755 utils/refresh-events.py diff --git a/.gitignore b/.gitignore index bb63a74..240e4a5 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,4 @@ output/ __pycache__/ *.code-workspace +utils/.caldav_pass diff --git a/utils/refresh-events.py b/utils/refresh-events.py new file mode 100755 index 0000000..9bf6912 --- /dev/null +++ b/utils/refresh-events.py @@ -0,0 +1,45 @@ +import caldav +from datetime import datetime +import vobject +import yaml + +server_url = "https://***REMOVED*** +cal_user = "tobias" +cal_url = "https://***REMOVED*** +cal_category = "Lesung/Veranstaltung" +metadata_keys = ["summary", "dtstart", "dtend", "description", "location"] +result_file = "../content/pages/termine.md" + +# get passwort +with open(".caldav_pass", "r") as f: + cal_pass = f.read().strip() + +# create vobject calendar +vcal = vobject.newFromBehavior("vcalendar") + +# establish connection to caldav server +with caldav.DAVClient(url=server_url, username=cal_user, password=cal_pass) as dav_client: + # establish connection to calendar + dav_cal = dav_client.calendar(url=cal_url) + + # put all events from caldav calendar into vobject calendar + for e in dav_cal.events(): + for ev in e.instance.contents["vevent"]: + vcal.add(ev) + +# we only want events belonging to a specific category +events = [e for e in vcal.getChildren() if "categories" in e.contents.keys() and cal_category in map(lambda x: x.value[0], e.contents["categories"])] + +# convert events into a structure that Pelican can use +events = [{k: v[0].value for k, v in e.contents.items() if k in metadata_keys} for e in events] + +# keep only future events +today = datetime.today().date() +events = [e for e in events if e["dtstart"].date() >= today] + +# write data as YAML +with open(result_file, 'w') as f: + f.write("---\n") + yaml.dump({"termine": events}, f) + f.write("---\n") +