library/calendar_sync.py aktualisiert
This commit is contained in:
@ -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({
|
||||||
|
|||||||
Reference in New Issue
Block a user