changeset 27:f717ecd3ede1

refactored so that we keep track of what bugs need a full update in the DB rather than temporarily in memory; this way bugs we haven't retrieved are partially saved and queued for later retrieval if something goes wrong.
author Atul Varma <varmaa@toolness.com>
date Thu, 24 Dec 2009 11:45:06 -0800
parents 057f6f0eac22
children ce19838a318d
files bzapi.py
diffstat 1 files changed, 12 insertions(+), 9 deletions(-) [+]
line wrap: on
line diff
--- a/bzapi.py	Thu Dec 24 06:45:30 2009 -0800
+++ b/bzapi.py	Thu Dec 24 11:45:06 2009 -0800
@@ -68,8 +68,8 @@
         else:
             self.last_update = bugs[0]['retrieved_time']
 
-    def _get_full_bugs(self, bugs):
-        params = {'id': ','.join(bugs),
+    def _retrieve_full_bugs(self, bug_ids):
+        params = {'id': ','.join(bug_ids),
                   'id_mode': 'include',
                   'comments': '1',
                   'history': '1'}
@@ -79,6 +79,7 @@
             logging.debug('updating bug %s' % bug['id'])
             normalize_bug(bug)
             bug['retrieved_time'] = response['date']
+            bug['needs_full_update'] = False
             self.bugs.save(bug)
             for observer in self.observers:
                 observer.notify({'bug': bug['id']})
@@ -90,18 +91,20 @@
             params['changed_after'] = self.last_update
         response = self.api.get('/bug', **params)
         bugs = response['data']['bugs']
-        valid_bugs = []
         for bug in bugs:
             normalize_bug(bug)
             old_bug = self.bugs.find_one({'id': bug['id']})
             if ((old_bug is None) or
                 (bug['last_change_time'] > old_bug['last_change_time'])):
-                valid_bugs.append(bug['id'])
-            else:
-                old_bug['retrieved_time'] = response['date']
-                self.bugs.save(old_bug)
-        if valid_bugs:
-            self._get_full_bugs(valid_bugs)
+                if not old_bug:
+                    old_bug = bug
+                old_bug['needs_full_update'] = True
+            old_bug['retrieved_time'] = response['date']
+            self.bugs.save(old_bug)
+        bugs_to_update = self.bugs.find({'needs_full_update': True})
+        bug_ids = [bug['id'] for bug in bugs_to_update]
+        if bug_ids:
+            self._retrieve_full_bugs(bug_ids)
             self._update_last_update()
 
 class BugzillaApi(object):