45
47
from zope.lifecycleevent import ObjectCreatedEvent
46
48
from zope.interface import implements, Interface
47
49
from zope.formlib import form
50
from zope.schema import Choice
51
from zope.schema.vocabulary import (
52
SimpleVocabulary, SimpleTerm)
49
54
from z3c.ptcompat import ViewPageTemplateFile
81
86
from lp.registry.browser.distribution import UsesLaunchpadMixin
82
87
from lp.registry.browser.menu import (
83
88
IRegistryCollectionNavigationMenu, RegistryCollectionActionMenuBase)
84
from lp.registry.browser.packaging import PackagingDeleteView
85
89
from lp.answers.browser.faqtarget import FAQTargetNavigationMixin
86
90
from canonical.launchpad.browser.feeds import FeedsMixin
87
91
from lp.registry.browser.productseries import get_series_branch_error
95
99
StructuralSubscriptionTargetTraversalMixin)
96
100
from canonical.launchpad.mail import format_address, simple_sendmail
97
101
from canonical.launchpad.webapp import (
98
ApplicationMenu, LaunchpadEditFormView, LaunchpadFormView, LaunchpadView,
99
Link, Navigation, StandardLaunchpadFacets, action, canonical_url,
100
custom_widget, enabled_with_permission, sorted_version_numbers,
102
ApplicationMenu, canonical_url, enabled_with_permission, LaunchpadView,
103
Link, Navigation, sorted_version_numbers, StandardLaunchpadFacets,
101
104
stepthrough, stepto, structured)
102
105
from canonical.launchpad.webapp.authorization import check_permission
103
106
from canonical.launchpad.webapp.batching import BatchNavigator
104
107
from canonical.launchpad.webapp.breadcrumb import Breadcrumb
108
from canonical.launchpad.webapp.launchpadform import (
109
action, custom_widget, LaunchpadEditFormView, LaunchpadFormView,
110
ReturnToReferrerMixin)
105
111
from canonical.launchpad.webapp.menu import NavigationMenu
106
112
from canonical.widgets.popup import PersonPickerWidget
107
113
from canonical.widgets.date import DateWidget
897
903
check_permission('launchpad.Commercial', self.context))
900
class ProductPackagesView(PackagingDeleteView):
906
class ProductPackagesView(LaunchpadView):
901
907
"""View for displaying product packaging"""
903
909
label = 'Linked packages'
906
def all_packaging(self):
907
"""See `PackagingDeleteView`."""
908
for series in self.context.series:
909
for packaging in series.packagings:
913
913
def series_packages(self):
921
921
field: '<input type=''hidden' ...>},
924
# This method is a superset of all_packaging. While all_packaging will
925
# be called several times as data is mutated, series_packages should
926
# only be called during render().
927
924
packaged_series = []
928
925
for series in self.context.series:
930
927
for packaging in series.packagings:
931
form_id = 'delete-%s-%s-%s' % (
932
packaging.distroseries.name,
933
packaging.sourcepackagename.name,
934
packaging.productseries.name,
936
packaging_field = dict(
939
field=self._renderHiddenPackagingField(packaging))
940
packagings.append(packaging_field)
928
packagings.append(packaging)
941
929
packaged_series.append(dict(
942
930
series=series, packagings=packagings))
943
931
return packaged_series
972
class ProductPackagesPortletView(LaunchpadFormView):
973
"""View class for product packaging portlet."""
977
'distributionsourcepackage', LaunchpadRadioWidget,
978
orientation='vertical')
981
def setUpFields(self):
982
"""See `LaunchpadFormView`."""
983
super(ProductPackagesPortletView, self).setUpFields()
984
ubuntu = getUtility(ILaunchpadCelebrities).ubuntu
985
source_packages = ubuntu.searchSourcePackages(self.context.name)
986
# Based upon the matches, create a new vocabulary with
987
# term descriptions that include a link to the source package.
988
self.suggestions = []
990
for package in source_packages:
991
if package.upstream_product is not None:
993
self.suggestions.append(package)
994
item_url = canonical_url(package)
995
description = """<a href="%s">%s</a>""" % (
996
item_url, escape(package.name))
997
vocab_terms.append(SimpleTerm(package, package.name, description))
998
vocabulary = SimpleVocabulary(vocab_terms)
999
self.form_fields = form.Fields(
1000
Choice(__name__='distributionsourcepackage',
1001
title=_('Ubuntu packages'),
1003
vocabulary=vocabulary,
1006
@action(_('Link to this Ubuntu Package'), name='link')
1007
def link(self, action, data):
1008
product = self.context
1009
dsp = data.get('distributionsourcepackage')
1010
assert dsp is not None, "distributionsourcepackage was not specified"
1011
product_series = product.development_focus
1012
ubuntu = getUtility(ILaunchpadCelebrities).ubuntu
1013
product_series.setPackaging(ubuntu.currentseries,
1014
dsp.sourcepackagename,
1016
self.request.response.addInfoNotification(
1017
'This project was linked to the source package "%s"' %
1019
self.next_url = self.request.getURL()
984
1022
class SeriesReleasePair:
985
1023
"""Class for holding a series and release.
1262
1300
return canonical_url(self.context)
1265
class ProductReviewLicenseView(ProductEditView, EditPrivateBugsMixin):
1303
class ProductReviewLicenseView(ReturnToReferrerMixin,
1304
ProductEditView, EditPrivateBugsMixin):
1266
1305
"""A view to review a project and change project privileges."""
1267
1306
label = "Review project"
1268
1307
field_names = [
1303
1342
self.validate_private_bugs(data)
1307
"""See `LaunchpadFormView`."""
1308
# The referer header we want is only available before the view's
1309
# form submits to itself. This field is a hidden input in the form.
1310
referrer = self.request.form.get('next_url')
1311
if referrer is None:
1312
referrer = self.request.getHeader('referer')
1314
if (referrer is not None
1315
and referrer.startswith(self.request.getApplicationURL())):
1318
return canonical_url(self.context)
1321
def cancel_url(self):
1322
"""See `LaunchpadFormView`."""
1323
return self.next_url
1326
1344
class ProductAddSeriesView(LaunchpadFormView):
1327
1345
"""A form to add new product series"""
1613
1631
self.request.form['summary'] = data['summary']
1616
class ProjectAddStepTwo(StepView, ProductLicenseMixin):
1634
class ProjectAddStepTwo(StepView, ProductLicenseMixin, ReturnToReferrerMixin):
1617
1635
"""Step 2 (of 2) in the +new project add wizard."""
1619
1637
_field_names = ['displayname', 'name', 'title', 'summary',