~danilo/launchpad-work-items-tracker/bug-1124087

« back to all changes in this revision

Viewing changes to collect

  • Committer: Milo Casagrande
  • Date: 2012-08-03 11:33:26 UTC
  • mfrom: (335.2.16 jira)
  • Revision ID: milo@ubuntu.com-20120803113326-l5yumgbbdcwwbhfc
MergeĀ lp:~lool/launchpad-work-items-tracker/jira-support.

Show diffs side-by-side

added added

removed removed

Lines of Context:
6
6
# Copyright (C) 2010, 2011 Canonical Ltd.
7
7
# License: GPL-3
8
8
 
9
 
import urllib
 
9
import logging
 
10
import optparse
 
11
import os
 
12
import pwd
10
13
import re
 
14
import smtplib
11
15
import sys
12
 
import optparse
13
 
import smtplib
14
 
import pwd
15
 
import os
 
16
import urllib
16
17
import urlparse
17
 
import logging
 
18
 
18
19
from email.mime.text import MIMEText
19
20
 
20
21
from launchpadlib.launchpad import Launchpad, EDGE_SERVICE_ROOT
23
24
    CollectorStore,
24
25
    PersonCache,
25
26
    WorkitemParser,
26
 
    bug_wi_states
27
 
)
 
27
    bug_wi_states,
 
28
    )
28
29
from lpworkitems.database import get_store
29
30
from lpworkitems.error_collector import (
30
31
    BlueprintURLError,
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")
76
78
 
77
79
 
78
80
import simplejson
 
81
 
79
82
_orig_loads = simplejson.loads
80
83
 
81
84
 
103
106
    '''
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)
 
109
        data_error(
 
110
            web_link(bp),
 
111
            'milestone "%s" is unknown/invalid' % model_bp.milestone_name,
 
112
            True)
107
113
    model_bp = collector.store_blueprint(model_bp)
108
114
    if 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)
 
132
        data_error(
 
133
            web_link(bp),
 
134
            'milestone "%s" is unknown/invalid' % model_group.milestone,
 
135
            True)
127
136
 
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)
155
164
 
156
165
 
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,
 
167
                          def_assignee):
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))
 
196
        data_error(bp_url,
 
197
            "\tComplexity line '%s' could not be parsed %s" %
 
198
                (line, ValueError))
187
199
 
188
200
 
189
201
def milestone_extract(text, valid_milestones):
196
208
    return None
197
209
 
198
210
 
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.
201
213
 
202
214
    This includes work items from the whiteboard as well as linked bugs.
212
224
 
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
216
229
 
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))
220
234
 
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)
226
240
 
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)
240
254
                if m:
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
246
262
                continue
247
263
 
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)