From 87a8deafedb3923d48ec0b0d3ce5008d8bce4e53 Mon Sep 17 00:00:00 2001
From: Dmitry <b4tm4n@mail.ru>
Date: Wed, 11 Apr 2018 15:41:08 +0300
Subject: [PATCH] rewrite callback for batch requests

---
 gcal_sync/gcal.py | 88 +++++++++++++++++++++++++++--------------------
 1 file changed, 51 insertions(+), 37 deletions(-)

diff --git a/gcal_sync/gcal.py b/gcal_sync/gcal.py
index 3e94f0e..fe418e9 100644
--- a/gcal_sync/gcal.py
+++ b/gcal_sync/gcal.py
@@ -29,6 +29,24 @@ class GoogleCalendarService():
         return service
 
 
+def select_event_key(event):
+    """select event key for logging
+    
+    Arguments:
+        event -- event resource
+    
+    Returns:
+        key name or None if no key found
+    """
+
+    key = None
+    if 'iCalUID' in event:
+        key = 'iCalUID'
+    elif 'id' in event:
+        key = 'id'
+    return key
+
+
 class GoogleCalendar():
     """class to interact with calendar on google
     """
@@ -39,6 +57,33 @@ class GoogleCalendar():
         self.service = service
         self.calendarId = calendarId
 
+    def _make_request_callback(self, action, events_by_req):
+        """make callback for log result of batch request
+        
+        Arguments:
+            action -- action name
+            events_by_req -- list of events ordered by request id
+        
+        Returns:
+            callback function
+        """
+
+        def callback(request_id, response, exception):
+            event = events_by_req[int(request_id)]
+            key = select_event_key(event)
+
+            if exception is not None:
+                self.logger.error('failed to %s event with %s: %s, exception: %s',
+                                  action, key, event.get(key), str(exception))
+            else:
+                resp_key = select_event_key(response)
+                if resp_key is not None:
+                    event = response
+                    key = resp_key
+                self.logger.info('event %s ok, %s: %s',
+                                 action, key, event.get(key))
+        return callback
+
     def list_events_from(self, start):
         """ list events from calendar, where start date >= start
         """
@@ -110,15 +155,7 @@ class GoogleCalendar():
         fields = 'id'
         events_by_req = []
 
-        def insert_callback(request_id, response, exception):
-            if exception is not None:
-                event = events_by_req[int(request_id)]
-                self.logger.error('failed to insert event with UID: %s, exception: %s', event.get(
-                    'UID'), str(exception))
-            else:
-                event = response
-                self.logger.info('event created, id: %s', event.get('id'))
-
+        insert_callback = self._make_request_callback('insert', events_by_req)
         batch = self.service.new_batch_http_request(callback=insert_callback)
         i = 0
         for event in events:
@@ -138,15 +175,7 @@ class GoogleCalendar():
         fields = 'id'
         events_by_req = []
 
-        def patch_callback(request_id, response, exception):
-            if exception is not None:
-                event = events_by_req[int(request_id)]
-                self.logger.error('failed to patch event with UID: %s, exception: %s', event.get(
-                    'UID'), str(exception))
-            else:
-                event = response
-                self.logger.info('event patched, id: %s', event.get('id'))
-
+        patch_callback = self._make_request_callback('patch', events_by_req)
         batch = self.service.new_batch_http_request(callback=patch_callback)
         i = 0
         for event_new, event_old in event_tuples:
@@ -168,15 +197,7 @@ class GoogleCalendar():
         fields = 'id'
         events_by_req = []
 
-        def update_callback(request_id, response, exception):
-            if exception is not None:
-                event = events_by_req[int(request_id)]
-                self.logger.error('failed to update event with UID: %s, exception: %s', event.get(
-                    'UID'), str(exception))
-            else:
-                event = response
-                self.logger.info('event updated, id: %s', event.get('id'))
-
+        update_callback = self._make_request_callback('update', events_by_req)
         batch = self.service.new_batch_http_request(callback=update_callback)
         i = 0
         for event_new, event_old in event_tuples:
@@ -197,14 +218,7 @@ class GoogleCalendar():
 
         events_by_req = []
 
-        def delete_callback(request_id, _, exception):
-            event = events_by_req[int(request_id)]
-            if exception is not None:
-                self.logger.error('failed to delete event with UID: %s, exception: %s', event.get(
-                    'UID'), str(exception))
-            else:
-                self.logger.info('event deleted, id: %s', event.get('id'))
-
+        delete_callback = self._make_request_callback('delete', events_by_req)
         batch = self.service.new_batch_http_request(callback=delete_callback)
         i = 0
         for event in events:
@@ -216,10 +230,10 @@ class GoogleCalendar():
 
     def create(self, summary, timeZone=None):
         """create calendar
-        
+
         Arguments:
             summary -- new calendar summary
-        
+
         Keyword Arguments:
             timeZone -- new calendar timezone as string (optional)