annotate scripts/import_sf.py @ 3537:d819ff1b3116

*** empty log message ***
author Richard Jones <richard@users.sourceforge.net>
date Fri, 03 Feb 2006 05:09:33 +0000
parents 00a7983b4666
children 7f7902af7864
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
3536
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
1 ''' Import tracker data from Sourceforge.NET
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
2
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
3 This script needs four steps to work:
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
4
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
5 1. Export the project XML data using the admin web interface at sf.net
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
6 2. Run the file fetching (these are not included in the XML):
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
7
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
8 import_sf.py files <path to XML> <path to files dir>
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
9
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
10 this will place all the downloaded files in the files dir by file id.
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
11 3. Convert the sf.net XML to Roundup "export" format:
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
12
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
13 import_sf.py import <tracker home> <path to XML> <path to files dir>
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
14
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
15 this will generate a directory "/tmp/imported" which contains the
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
16 data to be imported into a Roundup tracker.
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
17 4. Import the data:
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
18
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
19 roundup-admin -i <tracker home> import /tmp/imported
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
20
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
21 And you're done!
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
22 '''
00a7983b4666 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3534
diff changeset
23
3537
d819ff1b3116 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3536
diff changeset
24 import sys, sets, os, csv, time, urllib2, httplib, mimetypes, urlparse
3534
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
25 from elementtree import ElementTree
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
26
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
27 from roundup import instance, hyperdb, date, support, password
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
28
3537
d819ff1b3116 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3536
diff changeset
29 DL_URL = 'http://sourceforge.net/tracker/download.php?group_id=%(group_id)s&atid=%(atid)s&aid=%(aid)s'
d819ff1b3116 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3536
diff changeset
30
3534
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
31 def get_url(aid):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
32 """ so basically we have to jump through hoops, given an artifact id, to
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
33 figure what the URL should be to access that artifact, and hence any
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
34 attached files."""
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
35 conn = httplib.HTTPConnection("sourceforge.net")
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
36 conn.request("GET", "/support/tracker.php?aid=%s"%aid)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
37 response = conn.getresponse()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
38 assert response.status == 302, 'response code was %s'%response.status
3537
d819ff1b3116 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3536
diff changeset
39 location = response.getheader('location')
d819ff1b3116 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3536
diff changeset
40 query = urlparse.urlparse(response.getheader('location'))[-2]
d819ff1b3116 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3536
diff changeset
41 info = dict([param.split('=') for param in query.split('&')])
d819ff1b3116 *** empty log message ***
Richard Jones <richard@users.sourceforge.net>
parents: 3536
diff changeset
42 return DOWNLOAD_TEMPLATE%info
3534
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
43
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
44 def fetch_files(xml_file, file_dir):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
45 """ Fetch files referenced in the xml_file into the dir file_dir. """
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
46 root = ElementTree.parse(xml_file).getroot()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
47 to_fetch = sets.Set()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
48 deleted = sets.Set()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
49 for artifact in root.find('artifacts'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
50 for field in artifact.findall('field'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
51 if field.get('name') == 'artifact_id':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
52 aid = field.text
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
53 for field in artifact.findall('field'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
54 if field.get('name') != 'artifact_history': continue
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
55 for event in field.findall('history'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
56 d = {}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
57 for field in event.findall('field'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
58 d[field.get('name')] = field.text
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
59 if d['field_name'] == 'File Added':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
60 fid = d['old_value'].split(':')[0]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
61 to_fetch.add((aid, fid))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
62 if d['field_name'] == 'File Deleted':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
63 fid = d['old_value'].split(':')[0]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
64 deleted.add((aid, fid))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
65 to_fetch = to_fetch - deleted
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
66
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
67 got = sets.Set(os.listdir(file_dir))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
68 to_fetch = to_fetch - got
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
69
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
70 # load cached urls (sigh)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
71 urls = {}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
72 if os.path.exists(os.path.join(file_dir, 'urls.txt')):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
73 for line in open(os.path.join(file_dir, 'urls.txt')):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
74 aid, url = line.strip().split()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
75 urls[aid] = url
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
76
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
77 for aid, fid in Progress('Fetching files', list(to_fetch)):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
78 if fid in got: continue
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
79 if not urls.has_key(aid):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
80 urls[aid] = get_url(aid)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
81 f = open(os.path.join(file_dir, 'urls.txt'), 'a')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
82 f.write('%s %s\n'%(aid, urls[aid]))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
83 f.close()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
84 url = urls[aid] + '&file_id=' + fid
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
85 f = urllib2.urlopen(url)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
86 data = f.read()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
87 n = open(os.path.join(file_dir, fid), 'w')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
88 n.write(data)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
89 f.close()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
90 n.close()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
91
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
92 def import_xml(tracker_home, xml_file, file_dir):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
93 """ Generate Roundup tracker import files based on the tracker schema,
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
94 sf.net xml export and downloaded files from sf.net. """
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
95 tracker = instance.open(tracker_home)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
96 db = tracker.open('admin')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
97
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
98 resolved = db.status.lookup('resolved')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
99 unread = db.status.lookup('unread')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
100 chatting = db.status.lookup('unread')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
101 critical = db.priority.lookup('critical')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
102 urgent = db.priority.lookup('urgent')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
103 bug = db.priority.lookup('bug')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
104 feature = db.priority.lookup('feature')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
105 wish = db.priority.lookup('wish')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
106 adminuid = db.user.lookup('admin')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
107 anonuid = db.user.lookup('anonymous')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
108
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
109 root = ElementTree.parse(xml_file).getroot()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
110
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
111 def to_date(ts):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
112 return date.Date(time.gmtime(float(ts)))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
113
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
114 # parse out the XML
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
115 artifacts = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
116 categories = sets.Set()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
117 users = sets.Set()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
118 add_files = sets.Set()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
119 remove_files = sets.Set()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
120 for artifact in root.find('artifacts'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
121 d = {}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
122 op = {}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
123 artifacts.append(d)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
124 for field in artifact.findall('field'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
125 name = field.get('name')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
126 if name == 'artifact_messages':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
127 for message in field.findall('message'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
128 l = d.setdefault('messages', [])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
129 m = {}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
130 l.append(m)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
131 for field in message.findall('field'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
132 name = field.get('name')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
133 if name == 'adddate':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
134 m[name] = to_date(field.text)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
135 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
136 m[name] = field.text
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
137 if name == 'user_name': users.add(field.text)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
138 elif name == 'artifact_history':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
139 for event in field.findall('history'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
140 l = d.setdefault('history', [])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
141 e = {}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
142 l.append(e)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
143 for field in event.findall('field'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
144 name = field.get('name')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
145 if name == 'entrydate':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
146 e[name] = to_date(field.text)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
147 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
148 e[name] = field.text
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
149 if name == 'mod_by': users.add(field.text)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
150 if e['field_name'] == 'File Added':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
151 add_files.add(e['old_value'].split(':')[0])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
152 elif e['field_name'] == 'File Deleted':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
153 remove_files.add(e['old_value'].split(':')[0])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
154 elif name == 'details':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
155 op['body'] = field.text
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
156 elif name == 'submitted_by':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
157 op['user_name'] = field.text
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
158 d[name] = field.text
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
159 users.add(field.text)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
160 elif name == 'open_date':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
161 thedate = to_date(field.text)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
162 op['adddate'] = thedate
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
163 d[name] = thedate
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
164 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
165 d[name] = field.text
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
166
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
167 categories.add(d['category'])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
168
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
169 if op.has_key('body'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
170 l = d.setdefault('messages', [])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
171 l.insert(0, op)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
172
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
173 add_files -= remove_files
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
174
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
175 # create users
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
176 userd = {'nobody': '2'}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
177 users.remove('nobody')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
178 data = [
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
179 {'id': '1', 'username': 'admin', 'password': password.Password('admin'),
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
180 'roles': 'Admin', 'address': 'richard@python.org'},
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
181 {'id': '2', 'username': 'anonymous', 'roles': 'Anonymous'},
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
182 ]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
183 for n, user in enumerate(list(users)):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
184 userd[user] = n+3
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
185 data.append({'id': str(n+3), 'username': user, 'roles': 'User',
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
186 'address': '%s@users.sourceforge.net'%user})
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
187 write_csv(db.user, data)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
188 users=userd
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
189
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
190 # create categories
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
191 categoryd = {'None': None}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
192 categories.remove('None')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
193 data = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
194 for n, category in enumerate(list(categories)):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
195 categoryd[category] = n
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
196 data.append({'id': str(n), 'name': category})
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
197 write_csv(db.keyword, data)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
198 categories = categoryd
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
199
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
200 # create issues
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
201 issue_data = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
202 file_data = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
203 message_data = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
204 issue_journal = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
205 message_id = 0
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
206 for artifact in artifacts:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
207 d = {}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
208 d['id'] = artifact['artifact_id']
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
209 d['title'] = artifact['summary']
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
210 d['assignedto'] = users[artifact['assigned_to']]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
211 if d['assignedto'] == '2':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
212 d['assignedto'] = None
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
213 d['creation'] = artifact['open_date']
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
214 activity = artifact['open_date']
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
215 d['creator'] = users[artifact['submitted_by']]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
216 actor = d['creator']
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
217 if categories[artifact['category']]:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
218 d['topic'] = [categories[artifact['category']]]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
219 issue_journal.append((
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
220 d['id'], d['creation'].get_tuple(), d['creator'], "'create'", {}
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
221 ))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
222
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
223 p = int(artifact['priority'])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
224 if artifact['artifact_type'] == 'Feature Requests':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
225 if p > 3:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
226 d['priority'] = feature
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
227 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
228 d['priority'] = wish
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
229 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
230 if p > 7:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
231 d['priority'] = critical
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
232 elif p > 5:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
233 d['priority'] = urgent
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
234 elif p > 3:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
235 d['priority'] = bug
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
236 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
237 d['priority'] = feature
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
238
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
239 s = artifact['status']
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
240 if s == 'Closed':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
241 d['status'] = resolved
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
242 elif s == 'Deleted':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
243 d['status'] = resolved
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
244 d['is retired'] = True
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
245 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
246 d['status'] = unread
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
247
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
248 messages = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
249 nosy = sets.Set()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
250 for message in artifact.get('messages', []):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
251 message_id += 1
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
252 authid = users[message['user_name']]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
253 body = convert_message(message['body'], message_id)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
254 if not body: continue
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
255 m = {'content': body, 'author': authid,
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
256 'date': message['adddate'], 'id': str(message_id),
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
257 'creation': message['adddate'], }
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
258 message_data.append(m)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
259 messages.append(message_id)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
260 if authid not in (None, '2'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
261 nosy.add(authid)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
262 activity = message['adddate']
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
263 actor = authid
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
264 if d['status'] == unread:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
265 d['status'] = chatting
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
266 d['messages'] = messages
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
267 d['nosy'] = list(nosy)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
268
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
269 files = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
270 for event in artifact.get('history', []):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
271 if event['field_name'] == 'File Added':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
272 fid, name = event['old_value'].split(':')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
273 if fid in add_files:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
274 files.append(fid)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
275 name = name.strip()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
276 try:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
277 f = open(os.path.join(file_dir, fid))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
278 content = f.read()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
279 f.close()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
280 except:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
281 content = 'content missing'
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
282 file_data.append({
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
283 'id': fid,
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
284 'creation': event['entrydate'],
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
285 'creator': users[event['mod_by']],
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
286 'name': name,
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
287 'type': mimetypes.guess_type(name)[0],
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
288 'content': content,
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
289 })
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
290 continue
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
291 elif event['field_name'] == 'close_date':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
292 action = "'set'"
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
293 info = { 'status': 'unread' }
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
294 elif event['field_name'] == 'summary':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
295 action = "'set'"
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
296 info = { 'title': event['old_value'] }
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
297 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
298 continue
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
299 row = [ d['id'], event['entrydate'].get_tuple(),
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
300 users[event['mod_by']], action, info ]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
301 if event['entrydate'] > activity:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
302 activity = event['entrydate']
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
303 issue_journal.append(row)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
304 d['files'] = files
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
305
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
306 d['activity'] = activity
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
307 d['actor'] = actor
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
308 issue_data.append(d)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
309
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
310 write_csv(db.issue, issue_data)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
311 write_csv(db.msg, message_data)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
312 write_csv(db.file, file_data)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
313
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
314 f = open('/tmp/imported/issue-journals.csv', 'w')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
315 writer = csv.writer(f, colon_separated)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
316 writer.writerows(issue_journal)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
317 f.close()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
318
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
319 def convert_message(content, id):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
320 ''' Strip off the useless sf message header crap '''
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
321 if content[:14] == 'Logged In: YES':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
322 return '\n'.join(content.splitlines()[3:]).strip()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
323 return content
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
324
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
325 class colon_separated(csv.excel):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
326 delimiter = ':'
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
327
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
328 today = date.Date('.')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
329 def write_csv(klass, data):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
330 props = klass.getprops()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
331 if not os.path.exists('/tmp/imported'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
332 os.mkdir('/tmp/imported')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
333 f = open('/tmp/imported/%s.csv'%klass.classname, 'w')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
334 writer = csv.writer(f, colon_separated)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
335 propnames = klass.export_propnames()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
336 propnames.append('is retired')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
337 writer.writerow(propnames)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
338 for entry in data:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
339 row = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
340 for name in propnames:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
341 if name == 'is retired':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
342 continue
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
343 prop = props[name]
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
344 if entry.has_key(name):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
345 if isinstance(prop, hyperdb.Date) or \
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
346 isinstance(prop, hyperdb.Interval):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
347 row.append(repr(entry[name].get_tuple()))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
348 elif isinstance(prop, hyperdb.Password):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
349 row.append(repr(str(entry[name])))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
350 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
351 row.append(repr(entry[name]))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
352 elif isinstance(prop, hyperdb.Multilink):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
353 row.append('[]')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
354 elif name in ('creator', 'actor'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
355 row.append("'1'")
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
356 elif name in ('created', 'activity'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
357 row.append(repr(today.get_tuple()))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
358 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
359 row.append('None')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
360 row.append(entry.get('is retired', False))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
361 writer.writerow(row)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
362
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
363 if isinstance(klass, hyperdb.FileClass) and entry.get('content'):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
364 fname = klass.exportFilename('/tmp/imported/', entry['id'])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
365 support.ensureParentsExist(fname)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
366 c = open(fname, 'w')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
367 if isinstance(entry['content'], unicode):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
368 c.write(entry['content'].encode('utf8'))
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
369 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
370 c.write(entry['content'])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
371 c.close()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
372
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
373 f.close()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
374 f = open('/tmp/imported/%s-journals.csv'%klass.classname, 'w')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
375 f.close()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
376
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
377 class Progress:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
378 '''Progress display for console applications.
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
379
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
380 See __main__ block at end of file for sample usage.
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
381 '''
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
382 def __init__(self, info, sequence):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
383 self.info = info
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
384 self.sequence = iter(sequence)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
385 self.total = len(sequence)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
386 self.start = self.now = time.time()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
387 self.num = 0
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
388 self.stepsize = self.total / 100 or 1
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
389 self.steptimes = []
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
390 self.display()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
391
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
392 def __iter__(self): return self
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
393
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
394 def next(self):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
395 self.num += 1
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
396
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
397 if self.num > self.total:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
398 print self.info, 'done', ' '*(75-len(self.info)-6)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
399 sys.stdout.flush()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
400 return self.sequence.next()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
401
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
402 if self.num % self.stepsize:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
403 return self.sequence.next()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
404
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
405 self.display()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
406 return self.sequence.next()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
407
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
408 def display(self):
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
409 # figure how long we've spent - guess how long to go
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
410 now = time.time()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
411 steptime = now - self.now
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
412 self.steptimes.insert(0, steptime)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
413 if len(self.steptimes) > 5:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
414 self.steptimes.pop()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
415 steptime = sum(self.steptimes) / len(self.steptimes)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
416 self.now = now
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
417 eta = steptime * ((self.total - self.num)/self.stepsize)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
418
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
419 # tell it like it is (or might be)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
420 if now - self.start > 3:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
421 M = eta / 60
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
422 H = M / 60
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
423 M = M % 60
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
424 S = eta % 60
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
425 s = '%s %2d%% (ETA %02d:%02d:%02d)'%(self.info,
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
426 self.num * 100. / self.total, H, M, S)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
427 else:
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
428 s = '%s %2d%%'%(self.info, self.num * 100. / self.total)
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
429 sys.stdout.write(s + ' '*(75-len(s)) + '\r')
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
430 sys.stdout.flush()
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
431
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
432 if __name__ == '__main__':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
433 if sys.argv[1] == 'import':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
434 import_xml(*sys.argv[2:])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
435 elif sys.argv[1] == 'files':
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
436 fetch_files(*sys.argv[2:])
ad9f06e32f7c scripts/import_sf.py will import a tracker from Sourceforge.NET
Richard Jones <richard@users.sourceforge.net>
parents:
diff changeset
437

Roundup Issue Tracker: http://roundup-tracker.org/