#!/usr/bin/env python import logging import urllib2 from cmdline import CommandLineApp from hashlib import sha1 from datetime import datetime from xml.dom.minidom import parseString def getText(nodelist): rc = "" for node in nodelist: if node.nodeType == node.TEXT_NODE: rc = rc + node.data return rc class Tickets2Org(CommandLineApp): def __init__(self): CommandLineApp.__init__(self) self.project = None self.number = None self.username = None self.password = None self.versions = {} self.milestones = {} self.people = {} self.tickets = {} #op = self.option_parser #op.add_option('-P', '--port', metavar='PORT', # type='string', action='store', dest='port', # default=80, help='HTTP port to connect to (default: 80)') self.log.setLevel(logging.INFO) def download(self, which): url = 'http://%s.unfuddle.com/api/v1/projects/%s/%s' % \ (self.project, self.number, which) auth_handler = urllib2.HTTPBasicAuthHandler() auth_handler.add_password(realm='Unfuddle API', uri=url, user=self.username, passwd=self.password) opener = urllib2.build_opener(auth_handler) # ...and install it globally so it can be used with urlopen. urllib2.install_opener(opener) req = urllib2.Request(url) req.add_header('Accept', 'application/xml') f = urllib2.urlopen(req) items = {} topNode = parseString(f.read()).childNodes[0] for childNode in topNode.childNodes: if childNode.nodeType == childNode.TEXT_NODE: continue item = {} for propertyNode in childNode.childNodes: if propertyNode.nodeType == propertyNode.TEXT_NODE: continue item[propertyNode.nodeName] = getText(propertyNode.childNodes) items[item['id']] = item return items def main(self, project, number, username, password): self.project = project self.number = number self.username = username self.password = password self.versions = self.download('versions') self.milestones = self.download('milestones') self.people = self.download('people') self.tickets = self.download('tickets') for ticket in self.tickets.values(): self.ticket_to_org(ticket) def ticket_to_org(self, ticket): # jww (2009-03-01): Download attachments as :DATA:/:END: print "** TODO", if ticket['priority'] == '1' or ticket['priority'] == '2': print "[#A]", if ticket['priority'] == '3': print "[#B]", if ticket['priority'] == '4' or ticket['priority'] == '5': print "[#C]", print ticket['summary'] if ticket['due-on']: deadline = datetime.strptime(ticket['created-at'], '%Y-%m-%dT%H:%M:%S-04:00') print " DEADLINE: <%s -2w>" % \ deadline.strftime('[%Y-%m-%d %a %H:%M]') print ticket['description'] print " :PROPERTIES:" reporter = "%s %s <%s>" % \ (self.people[ticket['reporter-id']]['first-name'], self.people[ticket['reporter-id']]['last-name'], self.people[ticket['reporter-id']]['email']) print " :Submitter:", reporter if ticket['version-id']: print " :Version:", \ self.versions[ticket['version-id']]['name'] if ticket['milestone-id']: print " :Milestone:", \ self.milestones[ticket['milestone-id']]['title'] print " :Ticket:", ticket['id'] #if ticket['hours-estimate-current']: # print " :Effort:", ticket['hours-estimate-initial'] created = datetime.strptime(ticket['created-at'], '%Y-%m-%dT%H:%M:%S-04:00') timestamp = created.strftime('[%Y-%m-%d %a %H:%M]') m = sha1() m.update(reporter) m.update(ticket['id']) m.update(timestamp) h = m.hexdigest().upper() print " :ID: %s-%s-%s-%s-%s" % \ (h[0:8], h[8:12], h[12:16], h[16:20], h[20:32]) print " :END:" created = datetime.strptime(ticket['created-at'], '%Y-%m-%dT%H:%M:%S-04:00') print " ", timestamp if __name__ == "__main__": Tickets2Org().run()