annotate examples/trac/contrib/sourceforge2trac.py @ 92:01d36818bb3d trunk

More performance improvements... this time for whitespace normalization and template loops.
author cmlenz
date Thu, 20 Jul 2006 23:06:36 +0000
parents 93b4dcbafd7b
children
rev   line source
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
1 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
2 Import a Sourceforge project's tracker items into a Trac database.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
3
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
4 Requires: Development version of Trac 0.7-pre from http://trac.edgewall.com/
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
5 ElementTree from effbot.org/zone/element.htm
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
6 Python 2.3 from http://www.python.org/
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
7
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
8 The Sourceforge tracker items can be exported from the 'Backup' page of the
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
9 project admin section.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
10
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
11 Copyright 2004, Mark Rowe <mrowe@bluewire.net.nz>
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
12 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
13
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
14 from elementtree.ElementTree import ElementTree
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
15 from datetime import datetime
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
16 import trac.env
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
17
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
18 class FieldParser(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
19 def __init__(self, e):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
20 for field in e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
21 if field.get('name').endswith('date'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
22 setattr(self, field.get('name'), datetime.fromtimestamp(int(field.text)))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
23 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
24 setattr(self, field.get('name'), field.text)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
25
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
26 class ArtifactHistoryItem(FieldParser):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
27 def __repr__(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
28 return '<ArtifactHistoryItem field_name=%r old_value=%r entrydate=%r mod_by=%r>' % (
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
29 self.field_name, self.old_value, self.entrydate, self.mod_by)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
30
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
31 class ArtifactMessage(FieldParser):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
32 def __repr__(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
33 return '<ArtifactMessage adddate=%r user_name=%r body=%r>' % (self.adddate, self.user_name, self.body)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
34
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
35 class Artifact(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
36 def __init__(self, e):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
37 self._history = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
38 self._messages = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
39
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
40 for field in e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
41 if field.get('name') == 'artifact_history':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
42 for h in field:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
43 self._history.append(ArtifactHistoryItem(h))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
44 elif field.get('name') == 'artifact_messages':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
45 for m in field:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
46 self._messages.append(ArtifactMessage(m))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
47 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
48 setattr(self, field.get('name'), field.text)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
49
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
50 def history(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
51 """Returns the history items in reverse chronological order so that the "new value"
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
52 can easily be calculated based on the final value of the field, and the old value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
53 of the items occuring before it.
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
54 """
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
55 history = [(h.entrydate, h) for h in self._history]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
56 history.sort()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
57 return [h[1] for h in history][::-1]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
58
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
59 def messages(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
60 return self._messages[:]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
61
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
62 def __repr__(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
63 return '<Artifact summary=%r artifact_type=%r category=%r status=%r>' % (self.summary, self.artifact_type, self.category, self.status)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
64
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
65 class ExportedProjectData(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
66 def __init__(self, f):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
67 self._artifacts = []
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
68
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
69 root = ElementTree().parse(f)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
70
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
71 for artifact in root.find('artifacts'):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
72 self._artifacts.append(Artifact(artifact))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
73
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
74 def artifacts(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
75 """Returns the artifacts in chronological order, so that they will be assigned numbers in sequence."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
76 artifacts = [(a.open_date, a) for a in self._artifacts]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
77 artifacts.sort()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
78 return [a[1] for a in artifacts]
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
79
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
80 def featureRequests(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
81 return [a for a in self._artifacts if a.artifact_type == 'Feature Requests']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
82
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
83 def bugs(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
84 return [a for a in self._artifacts if a.artifact_type == 'Bugs']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
85
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
86 def categories(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
87 """Returns all the category names that are used, in alphabetical order."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
88 c = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
89 for a in self._artifacts:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
90 c[a.category] = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
91
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
92 categories = c.keys()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
93 categories.sort()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
94 return categories
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
95
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
96 def groups(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
97 """Returns all the group names that are used, in alphabetical order."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
98 g = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
99 for a in self._artifacts:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
100 g[a.artifact_group_id] = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
101 del g['None']
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
102
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
103 groups = g.keys()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
104 groups.sort()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
105 return groups
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
106
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
107 def artifactTypes(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
108 """Returns all the artifact types that are used, in alphabetical order."""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
109 t = {}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
110 for a in self._artifacts:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
111 t[a.artifact_type] = 1
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
112 types = t.keys()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
113 types.sort()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
114 return types
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
115
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
116 class TracDatabase(object):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
117 def __init__(self, path):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
118 self.env = trac.env.Environment(path)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
119 self._db = self.env.get_db_cnx()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
120 self._db.autocommit = False
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
121
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
122 def db(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
123 return self._db
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
124
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
125 def hasTickets(self):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
126 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
127 c.execute('''SELECT count(*) FROM Ticket''')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
128 return int(c.fetchall()[0][0]) > 0
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
129
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
130 def setTypeList(self, s):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
131 """Remove all types, set them to `s`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
132 if self.hasTickets():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
133 raise Exception("Will not modify database with existing tickets!")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
134
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
135 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
136 c.execute("""DELETE FROM enum WHERE kind='ticket_type'""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
137 for i, value in enumerate(s):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
138 c.execute("""INSERT INTO enum (kind, name, value) VALUES (%s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
139 "ticket_type",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
140 value,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
141 i)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
142 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
143
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
144 def setPriorityList(self, s):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
145 """Remove all priorities, set them to `s`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
146 if self.hasTickets():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
147 raise Exception("Will not modify database with existing tickets!")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
148
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
149 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
150 c.execute("""DELETE FROM enum WHERE kind='priority'""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
151 for i, value in enumerate(s):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
152 c.execute("""INSERT INTO enum (kind, name, value) VALUES (%s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
153 "priority",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
154 value,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
155 i)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
156 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
157
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
158
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
159 def setComponentList(self, l):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
160 """Remove all components, set them to `l`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
161 if self.hasTickets():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
162 raise Exception("Will not modify database with existing tickets!")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
163
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
164 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
165 c.execute("""DELETE FROM component""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
166 for value in l:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
167 c.execute("""INSERT INTO component (name) VALUES (%s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
168 value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
169 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
170
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
171 def setVersionList(self, v):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
172 """Remove all versions, set them to `v`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
173 if self.hasTickets():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
174 raise Exception("Will not modify database with existing tickets!")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
175
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
176 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
177 c.execute("""DELETE FROM version""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
178 for value in v:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
179 c.execute("""INSERT INTO version (name) VALUES (%s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
180 value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
181 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
182
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
183 def setMilestoneList(self, m):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
184 """Remove all milestones, set them to `m`"""
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
185 if self.hasTickets():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
186 raise Exception("Will not modify database with existing tickets!")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
187
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
188 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
189 c.execute("""DELETE FROM milestone""")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
190 for value in m:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
191 c.execute("""INSERT INTO milestone (name) VALUES (%s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
192 value)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
193 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
194
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
195 def addTicket(self, type, time, changetime, component,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
196 priority, owner, reporter, cc,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
197 version, milestone, status, resolution,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
198 summary, description, keywords):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
199 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
200 if status.lower() == 'open':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
201 if owner != '':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
202 status = 'assigned'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
203 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
204 status = 'new'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
205
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
206 c.execute("""INSERT INTO ticket (type, time, changetime, component,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
207 priority, owner, reporter, cc,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
208 version, milestone, status, resolution,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
209 summary, description, keywords)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
210 VALUES (%s, %s, %s,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
211 %s, %s, %s, %s, %s,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
212 %s, %s, %s, %s,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
213 %s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
214 type, time, changetime, component,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
215 priority, owner, reporter, cc,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
216 version, milestone, status.lower(), resolution,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
217 summary, '{{{\n%s\n}}}' % (description, ), keywords)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
218 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
219 return self.db().db.sqlite_last_insert_rowid()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
220
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
221 def addTicketComment(self, ticket, time, author, value):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
222 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
223 c.execute("""INSERT INTO ticket_change (ticket, time, author, field, oldvalue, newvalue)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
224 VALUES (%s, %s, %s, %s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
225 ticket, time.strftime('%s'), author, 'comment', '', '{{{\n%s\n}}}' % (value, ))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
226 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
227
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
228 def addTicketChange(self, ticket, time, author, field, oldvalue, newvalue):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
229 c = self.db().cursor()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
230 c.execute("""INSERT INTO ticket_change (ticket, time, author, field, oldvalue, newvalue)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
231 VALUES (%s, %s, %s, %s, %s, %s)""",
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
232 ticket, time.strftime('%s'), author, field, oldvalue, newvalue)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
233 self.db().commit()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
234
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
235
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
236 def main():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
237 import optparse
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
238 p = optparse.OptionParser('usage: %prog xml_export.xml /path/to/trac/environment')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
239 opt, args = p.parse_args()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
240 if len(args) != 2:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
241 p.error("Incorrect number of arguments")
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
242
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
243 try:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
244 importData(open(args[0]), args[1])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
245 except Exception, e:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
246 print 'Error:', e
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
247
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
248 def importData(f, env):
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
249 project = ExportedProjectData(f)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
250
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
251 db = TracDatabase(env)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
252 db.setTypeList(project.artifactTypes())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
253 db.setComponentList(project.categories())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
254 db.setPriorityList(range(1, 11))
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
255 db.setVersionList(project.groups())
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
256 db.setMilestoneList([])
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
257
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
258 for a in project.artifacts():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
259 i = db.addTicket(type=a.artifact_type,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
260 time=a.open_date,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
261 changetime='',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
262 component=a.category,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
263 priority=a.priority,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
264 owner=a.assigned_to,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
265 reporter=a.submitted_by,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
266 cc='',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
267 version=a.artifact_group_id,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
268 milestone='',
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
269 status=a.status,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
270 resolution=a.resolution,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
271 summary=a.summary,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
272 description=a.details,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
273 keywords='')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
274 print 'Imported %s as #%d' % (a.artifact_id, i)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
275 for msg in a.messages():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
276 db.addTicketComment(ticket=i,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
277 time=msg.adddate,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
278 author=msg.user_name,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
279 value=msg.body)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
280 if a.messages():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
281 print ' imported %d messages for #%d' % (len(a.messages()), i)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
282
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
283 values = a.__dict__.copy()
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
284 field_map = {'summary': 'summary'}
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
285 for h in a.history():
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
286 if h.field_name == 'close_date' and values.get(h.field_name, '') == '':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
287 f = 'status'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
288 oldvalue = 'assigned'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
289 newvalue = 'closed'
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
290 else:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
291 f = field_map.get(h.field_name, None)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
292 oldvalue = h.old_value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
293 newvalue = values.get(h.field_name, '')
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
294
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
295 if f:
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
296 db.addTicketChange(ticket=i,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
297 time=h.entrydate,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
298 author=h.mod_by,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
299 field=f,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
300 oldvalue=oldvalue,
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
301 newvalue=newvalue)
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
302 values[h.field_name] = h.old_value
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
303
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
304 if __name__ == '__main__':
93b4dcbafd7b Copy Trac to main branch.
cmlenz
parents:
diff changeset
305 main()
Copyright (C) 2012-2017 Edgewall Software