--- a/trac-import/TracExport.py
+++ b/trac-import/TracExport.py
@@ -15,7 +15,7 @@
TICKET_URL = '/ticket/%d'
QUERY_MAX_ID_URL = '/query?col=id&order=id&desc=1&max=2'
- QUERY_BY_PAGE_URL = '/query?col=id&order=id&max=100&page=%d'
+ QUERY_BY_PAGE_URL = '/query?col=id&col=time&col=changetime&order=id&max=100&page=%d'
FIELD_MAP = {
'reporter': 'submitter',
@@ -24,6 +24,10 @@
def __init__(self, base_url):
self.base_url = base_url
+ # Contains additional info for a ticket which cannot
+ # be get with single-ticket export (create/mod times is
+ # and example).
+ self.ticket_map = {}
def remap_fields(self, dict):
"Remap fields to adhere to standard taxonomy."
@@ -75,6 +79,8 @@
def get_ticket(self, id):
t = self.parse_ticket_body(id)
t['comments'] = self.parse_ticket_comments(id)
+ if id in self.ticket_map:
+ t.update(self.ticket_map[id])
return t
def get_ticket_ids_csv(self):
@@ -110,13 +116,19 @@
print fields
return int(fields['id'])
- def enumerate_ticket_ids(self, page=1):
+ @staticmethod
+ def trac2z_date(s):
+ assert len(s) == 25
+ assert s.endswith('+00:00')
+ return s[0:10] + 'T' + s[11:19] + 'Z'
+
+ def enumerate_ticket_ids(self, page=1, limit=-1):
'Go thru ticket list and collect available ticket ids.'
# We could just do CSV export, which by default dumps entire list
# Alas, for many busy servers with long ticket list, it will just
# time out. So, let's paginate it instead.
res = []
- while True:
+ while limit != 0:
url = self.full_url(self.QUERY_BY_PAGE_URL % page, 'csv')
try:
f = self.csvopen(url)
@@ -128,9 +140,14 @@
raise
reader = csv.reader(f)
cols = reader.next()
- ids = [int(r[0]) for r in reader if r and r[0][0].isdigit()]
- res += ids
+ for r in reader:
+ if r and r[0].isdigit():
+ id = int(r[0])
+ self.ticket_map[id] = {'date': self.trac2z_date(r[1]), 'date_updated': self.trac2z_date(r[2])}
+ res.append(id)
page += 1
+ if limit > 0:
+ limit -= 1
return res
@@ -151,7 +168,10 @@
# pprint(d)
# d = ex.get_max_ticket_id()
# d = ex.get_ticket_ids()
+ d = ex.enumerate_ticket_ids(limit=1)
ids = [3]
doc = [ex.get_ticket(i) for i in ids]
print json.dumps(doc, cls=DateJSONEncoder, indent=2)
+# print d
+# print ex.ticket_map