chiark / gitweb /
Start on recurring event support
authorMatthew Vernon <mv3@sanger.ac.uk>
Wed, 17 Oct 2018 16:04:30 +0000 (17:04 +0100)
committerMatthew Vernon <mv3@sanger.ac.uk>
Wed, 17 Oct 2018 16:04:30 +0000 (17:04 +0100)
...currently only daily events, but this is tested and works across a
DST change.

gooswapper.py

index 1b9b4aa91fbeffb564de1bf6b5705bf1c866bbaf..a4029f0971779d625a847e7338f31d363cea1c8e 100644 (file)
@@ -125,6 +125,30 @@ def ex_event_changes(old,new):
                                                               len(deleted)))
     return added, deleted, changed
 
+def rrule_from_ex(event,gcal_tz):
+    if event.type != "RecurringMaster":
+        logger.error("Cannot make recurrence from not-recurring event")
+        return None
+    if event.recurrence is None:
+        logger.error("Empty recurrence structure")
+        return None
+    if isinstance(event.recurrence.pattern,
+                  exchangelib.recurrence.DailyPattern):
+        rr = "RRULE:FREQ=DAILY;INTERVAL=%d" % event.recurrence.pattern.interval
+    else:
+        logger.error("Recurrence %s not supported" % event.recurrence)
+        return None
+    if isinstance(event.recurrence.boundary,
+                  exchangelib.recurrence.EndDatePattern):
+        rr += ";UNTIL={0:%Y}{0:%m}{0:%d}".format(event.recurrence.boundary.end)
+    else:
+        logger.error("Recurrence %s not supported" % event.recurrence)
+        return None
+    if event.modified_occurrences is not None or \
+       event.deleted_occurrences is not None:
+        logger.warning("Modified/Deleted recurrences not supported")
+    return [rr]
+
 def build_gcal_event_from_ex(event,gcal_tz):
     gevent={}
     gevent["summary"]=event.subject
@@ -149,15 +173,19 @@ def add_ex_to_gcal(ex_acct,
                    gcal_id="primary"):
     for ev_id in added:
         event = get_ex_event_by_itemid(ex_acct.calendar,ev_id)
-        if not event.is_recurring:
-            gevent = build_gcal_event_from_ex(event,gcal_tz)
-            gevent = gcal_acct.events().insert(calendarId=gcal_id,
-                                               body=gevent).execute()
-            event.gcal_link = gevent.get("id")
-            event.save(update_fields=["gcal_link"])
-            events[event.item_id] = events[event.item_id]._replace(changekey=event.changekey,gcal_link=event.gcal_link)
-        else:
-            logger.warning("recurring events not yet supported")
+        gevent = build_gcal_event_from_ex(event,gcal_tz)
+        if event.type=="RecurringMaster":
+            rr = rrule_from_ex(event,gcal_tz)
+            if rr is not None:
+                gevent["recurrence"] = rr
+                print(gevent)
+            else:
+                logger.warning("Unable to set recurrence")
+        gevent = gcal_acct.events().insert(calendarId=gcal_id,
+                                           body=gevent).execute()
+        event.gcal_link = gevent.get("id")
+        event.save(update_fields=["gcal_link"])
+        events[event.item_id] = events[event.item_id]._replace(changekey=event.changekey,gcal_link=event.gcal_link)
 
 def del_ex_to_gcal(ex_acct, gcal_acct, events, deleted, gcal_id="primary"):
     for ev_id in deleted: