[Python-checkins] r56530 - tracker/importer/xmlexport2handlers.py tracker/importer/xmlexport2toroundup.py

erik.forsberg python-checkins at python.org
Tue Jul 24 20:58:28 CEST 2007


Author: erik.forsberg
Date: Tue Jul 24 20:58:27 2007
New Revision: 56530

Modified:
   tracker/importer/xmlexport2handlers.py
   tracker/importer/xmlexport2toroundup.py
Log:

Reorganized code - moved several methods used by many handler classes
into base class.


Modified: tracker/importer/xmlexport2handlers.py
==============================================================================
--- tracker/importer/xmlexport2handlers.py	(original)
+++ tracker/importer/xmlexport2handlers.py	Tue Jul 24 20:58:27 2007
@@ -21,149 +21,25 @@
 from roundup.date import Date
 
 class XMLExport2Handler:
-    def __init__(self, db, source, target):
+    def __init__(self, db, source, target, pmembers):
         self.db = db
         self.source = source
         self.target = target
-
-    def handle(self, item, roundupdata):
-        raise NotImplementedError
-
-
-class TextValueHandler(XMLExport2Handler):
-    def handle(self, item, roundupdata):
-        roundupdata[self.target] = item.find(self.source).text.encode('utf-8')
-
-class StatusHandler(XMLExport2Handler):
-    def __init__(self, db, source, target, statuses):
-        XMLExport2Handler.__init__(self, db, source, target)
-        self.statuses = statuses
-    
-    def handle(self, item, roundupdata):
-        status = self.statuses[item.find(self.source).text].lower()
-        
-        if "deleted" == status:
-            status = "closed"
-
-        roundupdata[self.target] = self.db.status.lookup(status)        
-
-class ComponentHandler(XMLExport2Handler):
-    def __init__(self, db, source, target, categories):
-        XMLExport2Handler.__init__(self, db, source, target)
-        self.categories = categories
-
-    def handle(self, item, roundupdata):
-        category = self.categories[item.find(self.source).text]
-        category = mappings['category'].get(category, category)
-
-        try:
-            component_id = self.db.component.lookup(category)
-            roundupdata[self.target] =  [component_id]
-        except KeyError:
-            roundupdata[self.target] = \
-                    [self.db.component.create(name=category)]
-
-class GroupHandler(XMLExport2Handler):
-    def __init__(self, db, source, target, groups):
-        XMLExport2Handler.__init__(self, db, source, target)
-        self.groups = groups
-    
-    def handle(self, item, roundupdata):
-        roundupdata[self.target] = []
-        group = self.groups[item.find(self.source).text]
-
-        if group in ["None", "Irreproducible", "AST", "Not a Bug"]:
-            return
-        elif "Feature Request" == group:
-            roundupdata['type'] = self.db.issue_type.lookup("rfe")
-            return
-        elif "Python 3000" == group:
-            roundupdata['keywords'].append(self.db.keyword.lookup('py3k'))
-        try:
-            # Merge as specified in http://psf.upfronthosting.co.za/roundup/meta/issue101
-            if group.startswith("Python 2.1"):
-                group = "Python 2.1"
-            elif group.startswith("Python 2.2"):
-                group = "Python 2.2"
-            version = self.db.version.lookup(group)
-            roundupdata[self.target] = version
-            return
-        except KeyError:
-            pass        
-
-class ResolutionHandler(XMLExport2Handler):
-    def __init__(self, db, source, target, resolutions):
-        XMLExport2Handler.__init__(self, db, source, target)
-        self.resolutions = resolutions
-
-    def handle(self, item, roundupdata):
-        resolution = self.resolutions[item.find(self.source).text].lower()
-        if "none" == resolution:
-            roundupdata[self.target] = None
-        else:
-            roundupdata[self.target] = self.db.resolution.lookup(resolution)
-
-
-class UserlinkHandler(XMLExport2Handler):
-    def __init__(self, db, source, target, pmembers):
-        XMLExport2Handler.__init__(self, db, source, target)
         self.pmembers = pmembers
 
-    def downloadfile(self, url, cachefilename):
-
-        delay = 0
-        backoff = 30
-        while True:
-            print url, "->", cachefilename
-            try:
-                f = urllib.urlopen(url)
-                data = f.read()
-                if data.find("send-email-to-ipblocked-at-sourceforge-dot-net") >= 0:
-                    delay+=backoff
-                    print "Blocked by Sourceforge. Sleeping %d seconds before trying again" % delay
-
-                out = open(cachefilename + ".tmp", 'w')
-                out.write(str(f.headers))
-                out.write("\n")
-                out.write(data)
-                out.close()
-                try:
-                    os.remove(cachefilename)
-                except:
-                    pass
-                os.rename(cachefilename + ".tmp", cachefilename)
-                break
-
-            except socket.error, e:
-                print "Error fetching file, retrying", e
-                continue
-            except AttributeError, e:
-                print e, "Probably SF weirdness. Trying again after delay.."
-                delay+=backoff
-            except IOError, e:
-                print e, "Probably SF weirdness. Trying again after delay.."
-                delay+=backoff                
-
-            time.sleep(delay)
-        
-
     def handle(self, item, roundupdata):
-        username = item.find(self.source).text
-
-        if "nobody" == username and \
-               "assignee" == self.target :
-            roundupdata[self.target] = None
-            return
-
-        if "nobody" == username:
-            username = "anonymous"
+        raise NotImplementedError
 
-        roundupdata[self.target] = self.getauthor(username)
+    def update_activity(self, roundupdata, timestamp, actorid):
+        if not roundupdata.has_key('activity') or \
+           int(timestamp) > time.mktime(roundupdata['activity']):
+            roundupdata['activity'] = time.gmtime(int(timestamp))
+            roundupdata['actor'] = actorid
+
+    def update_nosy(self, roundupdata, actorid):
+        if actorid not in roundupdata['nosy']:
+            roundupdata.append(actorid)
 
-        # Add user to nosy 
-        if roundupdata[self.target] not in roundupdata['nosy'] and \
-               roundupdata[self.target] != self.getauthor("anonymous"):
-            roundupdata['nosy'].append(roundupdata[self.target])
 
     def unescape(self, string):
         # work around oddities in BeautifulSoup's entity handling
@@ -233,7 +109,7 @@
                 break
 
         return (username, realname, address)
-        
+            
         
 
     def getauthor(self, username):
@@ -258,6 +134,139 @@
                                        address=address,
                                        roles=",".join(roles))
 
+    def downloadfile(self, url, cachefilename):
+
+        delay = 0
+        backoff = 30
+        while True:
+            print url, "->", cachefilename
+            try:
+                f = urllib.urlopen(url)
+                data = f.read()
+                if data.find("send-email-to-ipblocked-at-sourceforge-dot-net") >= 0:
+                    delay+=backoff
+                    print "Blocked by Sourceforge. Sleeping %d seconds before trying again" % delay
+
+                out = open(cachefilename + ".tmp", 'w')
+                out.write(str(f.headers))
+                out.write("\n")
+                out.write(data)
+                out.close()
+                try:
+                    os.remove(cachefilename)
+                except:
+                    pass
+                os.rename(cachefilename + ".tmp", cachefilename)
+                break
+
+            except socket.error, e:
+                print "Error fetching file, retrying", e
+                continue
+            except AttributeError, e:
+                print e, "Probably SF weirdness. Trying again after delay.."
+                delay+=backoff
+            except IOError, e:
+                print e, "Probably SF weirdness. Trying again after delay.."
+                delay+=backoff                
+
+            time.sleep(delay)
+
+
+class TextValueHandler(XMLExport2Handler):
+    def handle(self, item, roundupdata):
+        roundupdata[self.target] = item.find(self.source).text.encode('utf-8')
+
+class StatusHandler(XMLExport2Handler):
+    def __init__(self, db, source, target, pmembers, statuses):
+        XMLExport2Handler.__init__(self, db, source, target, pmembers)
+        self.statuses = statuses
+    
+    def handle(self, item, roundupdata):
+        status = self.statuses[item.find(self.source).text].lower()
+        
+        if "deleted" == status:
+            status = "closed"
+
+        roundupdata[self.target] = self.db.status.lookup(status)        
+
+class ComponentHandler(XMLExport2Handler):
+    def __init__(self, db, source, target, pmembers, categories):
+        XMLExport2Handler.__init__(self, db, source, target, pmembers)
+        self.categories = categories
+
+    def handle(self, item, roundupdata):
+        category = self.categories[item.find(self.source).text]
+        category = mappings['category'].get(category, category)
+
+        try:
+            component_id = self.db.component.lookup(category)
+            roundupdata[self.target] =  [component_id]
+        except KeyError:
+            roundupdata[self.target] = \
+                    [self.db.component.create(name=category)]
+
+class GroupHandler(XMLExport2Handler):
+    def __init__(self, db, source, target, pmembers, groups):
+        XMLExport2Handler.__init__(self, db, source, target, pmembers)
+        self.groups = groups
+    
+    def handle(self, item, roundupdata):
+        roundupdata[self.target] = []
+        group = self.groups[item.find(self.source).text]
+
+        if group in ["None", "Irreproducible", "AST", "Not a Bug"]:
+            return
+        elif "Feature Request" == group:
+            roundupdata['type'] = self.db.issue_type.lookup("rfe")
+            return
+        elif "Python 3000" == group:
+            roundupdata['keywords'].append(self.db.keyword.lookup('py3k'))
+        try:
+            # Merge as specified in http://psf.upfronthosting.co.za/roundup/meta/issue101
+            if group.startswith("Python 2.1"):
+                group = "Python 2.1"
+            elif group.startswith("Python 2.2"):
+                group = "Python 2.2"
+            version = self.db.version.lookup(group)
+            roundupdata[self.target] = version
+            return
+        except KeyError:
+            pass        
+
+class ResolutionHandler(XMLExport2Handler):
+    def __init__(self, db, source, target, pmembers, resolutions):
+        XMLExport2Handler.__init__(self, db, source, target, pmembers)
+        self.resolutions = resolutions
+
+    def handle(self, item, roundupdata):
+        resolution = self.resolutions[item.find(self.source).text].lower()
+        if "none" == resolution:
+            roundupdata[self.target] = None
+        else:
+            roundupdata[self.target] = self.db.resolution.lookup(resolution)
+
+
+class UserlinkHandler(XMLExport2Handler):
+        
+
+    def handle(self, item, roundupdata):
+        username = item.find(self.source).text
+
+        if "nobody" == username and \
+               "assignee" == self.target :
+            roundupdata[self.target] = None
+            return
+
+        if "nobody" == username:
+            username = "anonymous"
+
+        roundupdata[self.target] = self.getauthor(username)
+
+        # Add user to nosy 
+        if roundupdata[self.target] not in roundupdata['nosy'] and \
+               roundupdata[self.target] != self.getauthor("anonymous"):
+            roundupdata['nosy'].append(roundupdata[self.target])
+        
 class AssigneeHandler(UserlinkHandler):
     def handle(self, item, roundupdata):
         UserlinkHandler.handle(self, item, roundupdata)
@@ -270,9 +279,12 @@
             user['roles'] = ",".join(roles)
 
     
-class DateHandler(XMLExport2Handler):
+class CreationHandler(XMLExport2Handler):
     def handle(self, item, roundupdata):
         roundupdata[self.target] = time.gmtime(int(item.find(self.source).text))
+        self.update_activity(roundupdata, int(item.find(self.source).text),
+                             self.getauthor(item.find("submitter").text))
+        
 class PriorityHandler(XMLExport2Handler):
     def handle(self, item, roundupdata):
         priority = item.find(self.source).text
@@ -292,10 +304,7 @@
                        repr(content.encode('utf-8')),
                        repr([])]
 
-        if not roundupdata.has_key('activity') or \
-           int(date) > time.mktime(roundupdata['activity']):
-            roundupdata['activity'] = time.gmtime(int(date))
-            roundupdata['actor'] = self.getauthor(author)        
+        self.update_activity(roundupdata, date, self.getauthor(author))
 
         msg_nodeid = int(self.db.msg.import_list(messageprops, messagevals))
 
@@ -392,11 +401,8 @@
 
             issuefiles.append(file_nodeid)
 
-            if not roundupdata.has_key('activity') or \
-                   int(timestamp) > time.mktime(roundupdata['activity']):
-                roundupdata['activity'] = time.gmtime(int(timestamp))
-                roundupdata['actor'] = self.getauthor(author)        
-
+            
+            self.update_activity(roundupdata, timestamp, self.getauthor(author))
         roundupdata[self.target] = issuefiles
 
 
@@ -405,8 +411,8 @@
         roundupdata[self.target] = self.db.severity.lookup('normal')                
 
 class TypeHandler(XMLExport2Handler):
-    def __init__(self, db, source, target, tracker):    
-        XMLExport2Handler.__init__(self, db, source, target)
+    def __init__(self, db, source, target, pmembers, tracker):    
+        XMLExport2Handler.__init__(self, db, source, target, pmembers)
         self.tracker = tracker
         
     def handle(self, item, roundupdata):

Modified: tracker/importer/xmlexport2toroundup.py
==============================================================================
--- tracker/importer/xmlexport2toroundup.py	(original)
+++ tracker/importer/xmlexport2toroundup.py	Tue Jul 24 20:58:27 2007
@@ -60,26 +60,26 @@
     resolutions = handle_namemapping(tracker, 'resolutions', 'resolution')
     statuses = handle_namemapping(tracker, 'statuses', 'status')
 
-    handlers = [x2h.TextValueHandler(db, "id", "id"),
-                x2h.StatusHandler(db, "status_id", "status", statuses),
+    handlers = [x2h.TextValueHandler(db, "id", "id", pmembers),
+                x2h.StatusHandler(db, "status_id", "status", pmembers, statuses),
                 x2h.ComponentHandler(db, "category_id", "components",
-                                     categories),
+                                     pmembers, categories),
                 x2h.GroupHandler(db, "group_id", "versions",
-                                     groups),                
+                                     pmembers, groups),                
                 x2h.ResolutionHandler(db, "resolution_id", "resolution",
-                                      resolutions),
-                x2h.UserlinkHandler(db, 'submitter', 'creator',
+                                      pmembers, resolutions),
+                x2h.UserlinkHandler(db, 'submitter', 'creator', 
                                     pmembers),
                 x2h.AssigneeHandler(db, 'assignee', 'assignee', pmembers),
                 # FIXME: Activity
-                x2h.DateHandler(db, 'submit_date', 'creation'),
-                x2h.PriorityHandler(db, 'priority', 'priority'),
-                x2h.TextstringHandler(db, 'summary', 'title'),
+                x2h.CreationHandler(db, 'submit_date', 'creation', pmembers),
+                x2h.PriorityHandler(db, 'priority', 'priority', pmembers),
+                x2h.TextstringHandler(db, 'summary', 'title', pmembers),
                 x2h.MessagesHandler(db, 'details', 'messages', pmembers),
                 x2h.AttachmentHandler(db, 'attachments', 'files',
                                       pmembers, project_group_id, tracker),
-                x2h.SeverityHandler(db, None, "severity"),
-                x2h.TypeHandler(db, None, "type", tracker),
+                x2h.SeverityHandler(db, None, "severity", pmembers),
+                x2h.TypeHandler(db, None, "type", pmembers, tracker),
                 ]    
 
     numitems = len(tracker.find('tracker_items').findall('tracker_item'))


More information about the Python-checkins mailing list