71
72
"""Get a link to the Launchpad API object on the website."""
72
73
api_link = item.self_link
73
74
parts = urlparse.urlparse(api_link)
74
link = parts.scheme + "://" + parts.netloc.replace("api.", "") + "/" + parts.path.split("/", 2)[2]
75
link = parts.scheme + "://" + parts.netloc.replace("api.", "") + \
76
"/" + parts.path.split("/", 2)[2]
75
77
return link.decode("utf-8")
79
82
_orig_loads = simplejson.loads
104
107
model_bp = Blueprint.from_launchpad(bp)
105
108
if model_bp.milestone_name not in collector.valid_milestone_names():
106
data_error(web_link(bp), 'milestone "%s" is unknown/invalid' % model_bp.milestone_name, True)
111
'milestone "%s" is unknown/invalid' % model_bp.milestone_name,
107
113
model_bp = collector.store_blueprint(model_bp)
109
115
dbg('lp_import_blueprint: added blueprint: %s' % bp.name)
123
129
model_group = BlueprintGroup.from_launchpad(bp)
124
130
model_group.area = area
125
131
if model_group.milestone_name not in collector.valid_milestone_names():
126
data_error(web_link(bp), 'milestone "%s" is unknown/invalid' % model_group.milestone, True)
134
'milestone "%s" is unknown/invalid' % model_group.milestone,
128
137
model_group = collector.store_blueprint_group(model_group)
129
138
if model_group is None:
154
163
collector.store_meta(key, value, bp_name)
157
def parse_complexity_item(collector, line, bp_name, bp_url, def_milestone, def_assignee):
166
def parse_complexity_item(collector, line, bp_name, bp_url, def_milestone,
158
168
line = line.strip()
159
169
# remove special characters people tend to type
160
170
line = re.sub('[^\w -.]', '', line)
183
193
dbg('\tComplexity: %s MS: %s Who: %s' % (num, milestone, assignee))
184
194
collector.store_complexity(assignee, num, milestone, bp_name)
185
195
except ValueError:
186
data_error(bp_url, "\tComplexity line '%s' could not be parsed %s" % (line, ValueError))
197
"\tComplexity line '%s' could not be parsed %s" %
189
201
def milestone_extract(text, valid_milestones):
199
def lp_import_blueprint_workitems(collector, bp, distro_release, people_cache=None, projects=None):
211
def lp_import_blueprint_workitems(collector, bp, distro_release,
200
212
'''Collect work items from a Launchpad blueprint.
202
214
This includes work items from the whiteboard as well as linked bugs.
213
225
model_bp = collector.store.find(
214
226
Blueprint, Blueprint.name == bp.name).one()
215
assert model_bp is not None, "Asked to process workitems of %s when it is not in the db" % bp.name
227
assert model_bp is not None, \
228
"Asked to process workitems of %s when it is not in the db" % bp.name
217
dbg('lp_import_blueprint_workitems(): processing %s (spec milestone: %s, spec assignee: %s, spec implementation: %s)' % (
230
dbg('lp_import_blueprint_workitems(): processing %s (spec milestone: %s,' \
231
' spec assignee: %s, spec implementation: %s)' % (
218
232
bp.name, model_bp.milestone_name, model_bp.assignee_name,
219
233
model_bp.implementation))
221
235
valid_milestones = collector.valid_milestone_names()
222
236
global error_collector
223
237
parser = WorkitemParser(
224
model_bp, model_bp.milestone_name, collector.lp, people_cache=people_cache,
225
error_collector=error_collector)
238
model_bp, model_bp.milestone_name, collector.lp,
239
people_cache=people_cache, error_collector=error_collector)
227
241
# Get work items from both the whiteboard and the new workitems_text
228
242
# property. Once the migration is completed and nobody's using the
239
253
m = work_items_re.search(l)
241
255
in_workitems_block = True
242
dbg('lp_import_blueprint_workitems(): starting work items block at ' + l)
256
dbg('lp_import_blueprint_workitems():'
257
' starting work items block at ' + l)
243
258
milestone = milestone_extract(m.group(1), valid_milestones)
244
259
dbg(' ... setting milestone to ' + str(milestone))
245
parser.milestone_name = milestone or parser.blueprint.milestone_name
260
parser.milestone_name = \
261
milestone or parser.blueprint.milestone_name
248
264
if in_workitems_block:
249
265
dbg("\tworkitem (raw): '%s'" % (l.strip()))
250
266
if not l.strip():
251
dbg('lp_import_blueprint_workitems(): closing work items block with line: ' + l)
267
dbg('lp_import_blueprint_workitems():'
268
' closing work items block with line: ' + l)
252
269
in_workitems_block = False
253
270
parser.milestone_name = parser.blueprint.milestone_name
254
271
workitem = parser.parse_blueprint_workitem(l)