library/calendar_sync.py aktualisiert

This commit is contained in:
2025-04-30 09:10:53 +00:00
parent 33c0f59d04
commit 80ebb92a01

View File

@ -5,31 +5,37 @@ from caldav import DAVClient
import vobject import vobject
def connect_calendar(url, user=None, password=None): def connect_calendar(url, user=None, password=None):
# Verbindung zum Kalender herstellen
client = DAVClient(url, username=user, password=password) if user else DAVClient(url) client = DAVClient(url, username=user, password=password) if user else DAVClient(url)
principal = client.principal() principal = client.principal()
calendars = principal.calendars() calendars = principal.calendars()
if not calendars: if not calendars:
raise Exception(f"Kein Kalender unter {url} gefunden") raise Exception(f"Kein Kalender unter {url} gefunden")
return calendars[0] return calendars[0]
def get_event_uid_map(calendar): def get_event_uid_map(calendar):
# Mapping der Ereignis-UIDs zu den Events erstellen
uid_map = {} uid_map = {}
for event in calendar.events(): for event in calendar.events():
try: try:
cal = vobject.readOne(event.data) cal = vobject.readOne(event.data)
uid = cal.vevent.uid.value uid = cal.vevent.uid.value
uid_map[uid] = event uid_map[uid] = event
except Exception: except Exception as e:
continue continue # Fehler bei einem Event überspringen
return uid_map return uid_map
def sync_calendars(source_cal, target_cal): def sync_calendars(source_cal, target_cal):
# Kalender synchronisieren
src_events = get_event_uid_map(source_cal) src_events = get_event_uid_map(source_cal)
tgt_events = get_event_uid_map(target_cal) tgt_events = get_event_uid_map(target_cal)
changed = False changed = False
added, updated, removed = [], [], [] added, updated, removed = [], [], []
# Neue und aktualisierte Ereignisse hinzufügen
for uid, src_event in src_events.items(): for uid, src_event in src_events.items():
src_data = src_event.data src_data = src_event.data
if uid not in tgt_events: if uid not in tgt_events:
@ -42,6 +48,7 @@ def sync_calendars(source_cal, target_cal):
updated.append(uid) updated.append(uid)
changed = True changed = True
# Entfernte Ereignisse löschen
for uid in set(tgt_events.keys()) - set(src_events.keys()): for uid in set(tgt_events.keys()) - set(src_events.keys()):
tgt_events[uid].delete() tgt_events[uid].delete()
removed.append(uid) removed.append(uid)
@ -50,6 +57,7 @@ def sync_calendars(source_cal, target_cal):
return changed, added, updated, removed return changed, added, updated, removed
def run_module(): def run_module():
# Definieren der Moduleingaben
module_args = dict( module_args = dict(
source_url=dict(type='str', required=True), source_url=dict(type='str', required=True),
source_user=dict(type='str', required=False, default=None), source_user=dict(type='str', required=False, default=None),
@ -64,8 +72,11 @@ def run_module():
module = AnsibleModule(argument_spec=module_args, supports_check_mode=False) module = AnsibleModule(argument_spec=module_args, supports_check_mode=False)
try: try:
# Verbindung zu den Kalendern herstellen
source_cal = connect_calendar(module.params['source_url'], module.params['source_user'], module.params['source_password']) source_cal = connect_calendar(module.params['source_url'], module.params['source_user'], module.params['source_password'])
target_cal = connect_calendar(module.params['target_url'], module.params['target_user'], module.params['target_password']) target_cal = connect_calendar(module.params['target_url'], module.params['target_user'], module.params['target_password'])
# Kalender synchronisieren
changed, added, updated, removed = sync_calendars(source_cal, target_cal) changed, added, updated, removed = sync_calendars(source_cal, target_cal)
result.update({ result.update({