[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