chiark / gitweb /
Move to keying by item_id
authorMatthew Vernon <mv3@sanger.ac.uk>
Fri, 5 Oct 2018 09:04:15 +0000 (10:04 +0100)
committerMatthew Vernon <mv3@sanger.ac.uk>
Fri, 5 Oct 2018 09:04:15 +0000 (10:04 +0100)
item_id is constant (changekey changes if an event is updated) and
searchable, so use it as primary key.

gooswapper.py

index 2c32deb1e1b0d32d54fc884f348d0d52a9e88b5d..0a8a050e9c0ca57741f188789d4ae7c7feb024ae 100644 (file)
@@ -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)