From e3aa6aefb4c856e2f3218fc90207b0f3746ed841 Mon Sep 17 00:00:00 2001 From: Matthew Vernon Date: Fri, 5 Oct 2018 10:04:15 +0100 Subject: [PATCH] Move to keying by item_id item_id is constant (changekey changes if an event is updated) and searchable, so use it as primary key. --- gooswapper.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/gooswapper.py b/gooswapper.py index 2c32deb..0a8a050 100644 --- a/gooswapper.py +++ b/gooswapper.py @@ -62,6 +62,9 @@ exchangelib.CalendarItem.register('global_object_id', GlobalObjectId) def get_ex_event_by_uid(calendar,uid): return calendar.get(global_object_id=GlobalObjectId(exchangelib.UID(uid))) +def get_ex_event_by_itemid(calendar,itemid): + return calendar.get(item_id=itemid) + def get_ex_event_by_id_and_changekey(acct,itemid,changekey): l=list(acct.fetch([(itemid,changekey)])) return list(acct.fetch([(itemid,changekey)]))[0] @@ -81,17 +84,15 @@ def ex_login(emailaddr,autodiscover=True): def get_ex_events(calendar): ans={} - itemids={} - for event in calendar.all().only('uid','changekey','item_id','gcal_link'): + for event in calendar.all().only('changekey','item_id','gcal_link'): if event.gcal_link is not None: # event.delete() continue - if event.uid in ans: - logger.warning("Event uid %s was duplicated!" % event.uid) - ans[event.uid] = event.changekey - itemids[event.uid] = event.item_id + if event.item_id in ans: + logger.warning("Event item_id %s was duplicated!" % event.item_id) + ans[event.item_id] = event.changekey logger.info("%d events found" % len(ans)) - return (ans,itemids) + return ans def ex_event_changes(old,new): olds = set(old.keys()) @@ -118,11 +119,10 @@ def add_ex_to_gcal_needs_ev_id(ex_cal,events): def add_ex_to_gcal(ex_acct, gcal_acct,gcal_tz,events, - itemids,added, + added, gcal_id="primary"): for ev_id in added: - event = get_ex_event_by_id_and_changekey(ex_acct, - itemids[ev_id],events[ev_id]) + event = get_ex_event_by_itemid(ex_acct.calendar,ev_id) if event.is_all_day: gevent={} gevent["summary"]=event.subject @@ -136,7 +136,7 @@ def add_ex_to_gcal(ex_acct, gevent=gcal_acct.events().insert(calendarId=gcal_id, body=gevent).execute() event.gcal_link = gevent.get("id") event.save() - events[event.uid] = event.changekey + events[event.item_id] = event.changekey else: logger.warning("only all-day events supported") @@ -172,15 +172,14 @@ def main(): cache = None ex_account = ex_login("mv3@sanger.ac.uk") - current,itemids = get_ex_events(ex_account.calendar) + current = get_ex_events(ex_account.calendar) gcal_account = gcal_login() gcal_tz = get_gcal_timezone(gcal_account) if cache is not None: added,deleted,changed = ex_event_changes(cache,current) - add_ex_to_gcal(ex_account,gcal_account,gcal_tz,current, - itemids,added) + add_ex_to_gcal(ex_account,gcal_account,gcal_tz,current,added) with open(cachepath,"wb") as f: pickle.dump(current,f) -- 2.30.2