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).
4
4
"""ISpecificationTarget browser views."""
16
16
from operator import itemgetter
18
from lazr.restful.utils import (
22
18
from z3c.ptcompat import ViewPageTemplateFile
23
19
from zope.component 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 (
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,
38
from canonical.lazr.utils import (
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,
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 (
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,
63
63
class HasSpecificationsMenuMixin:
255
255
page_title = 'Blueprints'
258
"""Quick hack for mdz, to get csv dump of specs."""
260
from StringIO import StringIO
262
writer = csv.writer(output)
275
'direction_approved',
281
"""Format a dbschema sortably for a spreadsheet."""
282
return '%s-%s' % (item.value, item.title)
285
"""Format a person as 'name (full name)', or 'none'"""
289
return '%s (%s)' % (person.name, person.displayname)
290
writer.writerow(headings)
291
for spec in self.context.all_specifications:
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:
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()
258
315
def has_any_specifications(self):
259
316
return self.context.has_any_specifications