~launchpad-pqm/launchpad/devel

« back to all changes in this revision

Viewing changes to lib/lp/blueprints/browser/specificationtarget.py

  • Committer: Steve Kowalik
  • Date: 2011-08-07 04:05:52 UTC
  • mto: This revision was merged to the branch mainline in revision 13626.
  • Revision ID: stevenk@ubuntu.com-20110807040552-mwnxo0flmhvl35e8
Correct the notification based on review comments, and remove request{,ed}
from the function names, switching to create{,d}.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright 2009-2011 Canonical Ltd.  This software is licensed under the
 
1
# Copyright 2009 Canonical Ltd.  This software is licensed under the
2
2
# GNU Affero General Public License version 3 (see the file LICENSE).
3
3
 
4
4
"""ISpecificationTarget browser views."""
15
15
 
16
16
from operator import itemgetter
17
17
 
18
 
from lazr.restful.utils import (
19
 
    safe_hasattr,
20
 
    smartquote,
21
 
    )
22
18
from z3c.ptcompat import ViewPageTemplateFile
23
19
from zope.component import (
24
20
    getMultiAdapter,
25
21
    queryMultiAdapter,
26
22
    )
27
23
 
28
 
from lp import _
 
24
from canonical.config import config
 
25
from canonical.launchpad import _
 
26
from canonical.launchpad.helpers import shortlist
 
27
from canonical.launchpad.webapp import (
 
28
    canonical_url,
 
29
    LaunchpadView,
 
30
    )
 
31
from canonical.launchpad.webapp.authorization import check_permission
 
32
from canonical.launchpad.webapp.batching import BatchNavigator
 
33
from canonical.launchpad.webapp.breadcrumb import Breadcrumb
 
34
from canonical.launchpad.webapp.menu import (
 
35
    enabled_with_permission,
 
36
    Link,
 
37
    )
 
38
from canonical.lazr.utils import (
 
39
    safe_hasattr,
 
40
    smartquote,
 
41
    )
29
42
from lp.app.enums import service_uses_launchpad
30
43
from lp.app.interfaces.launchpad import IServiceUsage
31
44
from lp.blueprints.enums import (
44
57
    IProjectGroupSeries,
45
58
    )
46
59
from lp.registry.interfaces.role import IHasDrivers
47
 
from lp.services.config import config
48
 
from lp.services.helpers import shortlist
49
60
from lp.services.propertycache import cachedproperty
50
 
from lp.services.webapp import (
51
 
    canonical_url,
52
 
    LaunchpadView,
53
 
    )
54
 
from lp.services.webapp.authorization import check_permission
55
 
from lp.services.webapp.batching import BatchNavigator
56
 
from lp.services.webapp.breadcrumb import Breadcrumb
57
 
from lp.services.webapp.menu import (
58
 
    enabled_with_permission,
59
 
    Link,
60
 
    )
61
61
 
62
62
 
63
63
class HasSpecificationsMenuMixin:
254
254
 
255
255
    page_title = 'Blueprints'
256
256
 
 
257
    def mdzCsv(self):
 
258
        """Quick hack for mdz, to get csv dump of specs."""
 
259
        import csv
 
260
        from StringIO import StringIO
 
261
        output = StringIO()
 
262
        writer = csv.writer(output)
 
263
        headings = [
 
264
            'name',
 
265
            'title',
 
266
            'url',
 
267
            'specurl',
 
268
            'status',
 
269
            'priority',
 
270
            'assignee',
 
271
            'drafter',
 
272
            'approver',
 
273
            'owner',
 
274
            'distroseries',
 
275
            'direction_approved',
 
276
            'man_days',
 
277
            'delivery',
 
278
            ]
 
279
 
 
280
        def dbschema(item):
 
281
            """Format a dbschema sortably for a spreadsheet."""
 
282
            return '%s-%s' % (item.value, item.title)
 
283
 
 
284
        def fperson(person):
 
285
            """Format a person as 'name (full name)', or 'none'"""
 
286
            if person is None:
 
287
                return 'none'
 
288
            else:
 
289
                return '%s (%s)' % (person.name, person.displayname)
 
290
        writer.writerow(headings)
 
291
        for spec in self.context.all_specifications:
 
292
            row = []
 
293
            row.append(spec.name)
 
294
            row.append(spec.title)
 
295
            row.append(canonical_url(spec))
 
296
            row.append(spec.specurl)
 
297
            row.append(dbschema(spec.definition_status))
 
298
            row.append(dbschema(spec.priority))
 
299
            row.append(fperson(spec.assignee))
 
300
            row.append(fperson(spec.drafter))
 
301
            row.append(fperson(spec.approver))
 
302
            row.append(fperson(spec.owner))
 
303
            if spec.distroseries is None:
 
304
                row.append('none')
 
305
            else:
 
306
                row.append(spec.distroseries.name)
 
307
            row.append(spec.direction_approved)
 
308
            row.append(spec.man_days)
 
309
            row.append(dbschema(spec.implementation_status))
 
310
            writer.writerow([unicode(item).encode('utf8') for item in row])
 
311
        self.request.response.setHeader('Content-Type', 'text/plain')
 
312
        return output.getvalue()
 
313
 
257
314
    @cachedproperty
258
315
    def has_any_specifications(self):
259
316
        return self.context.has_any_specifications