launchpad-reviewers team mailing list archive
-
launchpad-reviewers team
-
Mailing list archive
-
Message #02436
[Merge] lp:~wgrant/launchpad/trivial-soyuz-ui into lp:launchpad
William Grant has proposed merging lp:~wgrant/launchpad/trivial-soyuz-ui into lp:launchpad.
Requested reviews:
Launchpad code reviewers (launchpad-reviewers)
Related bugs:
#347275 Include cancel-link into PPA forms
https://bugs.launchpad.net/bugs/347275
#664484 when creating a PPA, "displayname" explanation is obsolete
https://bugs.launchpad.net/bugs/664484
#670445 PPA creation page says "displayname"
https://bugs.launchpad.net/bugs/670445
#670449 Preview PPA urls when choosing a name
https://bugs.launchpad.net/bugs/670449
#670450 Bad descriptions on PPA edit details page
https://bugs.launchpad.net/bugs/670450
For more details, see:
https://code.launchpad.net/~wgrant/launchpad/trivial-soyuz-ui/+merge/47767
This branch fixes up a few UI issues around the main PPA forms: Person:+activate-ppa, Archive:+edit and Archive:+admin:
- Most of the field names have been reworded to hopefully not suck.
- Most duplication of field definitions between browser and interface is gone, including the elimination of IPPAActivateForm.
- All Archive forms have a cancel link instead of button.
- Person:+activate-ppa's Name widget has been replaced with a URL widget like the one on ProjectSet:+new,
- Parts of Person:+activate-ppa have been reworded, and its text now respects the usual maximum width. It is now clearer that Person.name can't be changed once a PPA is created.
- pagetitles.py is no longer used, and breadcrumbs no longer include another copy of the PPA name.
Screenshots at http://people.canonical.com/~wgrant/launchpad/ppa-form-fixes.
--
https://code.launchpad.net/~wgrant/launchpad/trivial-soyuz-ui/+merge/47767
Your team Launchpad code reviewers is requested to review the proposed merge of lp:~wgrant/launchpad/trivial-soyuz-ui into lp:launchpad.
=== modified file 'lib/canonical/launchpad/pagetitles.py'
--- lib/canonical/launchpad/pagetitles.py 2011-01-04 16:08:57 +0000
+++ lib/canonical/launchpad/pagetitles.py 2011-01-28 05:35:56 +0000
@@ -101,16 +101,6 @@
return view.label
-archive_admin = ContextDisplayName('Administer %s')
-
-archive_activate = 'Activate Personal Package Archive'
-
-archive_copy_packages = ContextDisplayName('Copy packages from %s')
-
-archive_delete_packages = ContextDisplayName('Delete packages from %s')
-
-archive_edit = ContextDisplayName('Edit %s')
-
bazaar_index = 'Launchpad Branches'
branch_bug_links = ContextDisplayName(smartquote('Bug links for %s'))
=== modified file 'lib/canonical/widgets/product.py'
--- lib/canonical/widgets/product.py 2010-11-08 12:52:43 +0000
+++ lib/canonical/widgets/product.py 2011-01-28 05:35:56 +0000
@@ -24,6 +24,7 @@
from zope.component import getUtility
from zope.schema import Choice, Text
+
from z3c.ptcompat import ViewPageTemplateFile
from lazr.restful.interface import copy_field
@@ -40,7 +41,7 @@
CheckBoxMatrixWidget, LaunchpadRadioWidget)
from canonical.widgets.popup import BugTrackerPickerWidget
from canonical.widgets.textwidgets import (
- LowerCaseTextWidget, StrippedTextWidget)
+ StrippedTextWidget, URIComponentWidget)
from lp.registry.interfaces.product import IProduct
@@ -409,31 +410,13 @@
return '\n'.join(html)
-class ProductNameWidget(LowerCaseTextWidget):
+class ProductNameWidget(URIComponentWidget):
"""A text input widget that looks like a url path component entry.
URL: http://launchpad.net/[____________]
"""
- template = ViewPageTemplateFile('templates/project-url.pt')
-
- def __init__(self, *args):
- # pylint: disable-msg=E1002
- self.read_only = False
- super(ProductNameWidget, self).__init__(*args)
-
- def __call__(self):
- return self.template()
-
- @property
- def product_name(self):
- return self.request.form.get('field.name', '').lower()
-
- @property
- def widget_type(self):
- if self.read_only:
- return 'hidden'
- else:
- return 'text'
+
+ base_url = 'https://launchpad.net/'
class GhostMixin:
=== removed file 'lib/canonical/widgets/templates/project-url.pt'
--- lib/canonical/widgets/templates/project-url.pt 2009-07-17 17:59:07 +0000
+++ lib/canonical/widgets/templates/project-url.pt 1970-01-01 00:00:00 +0000
@@ -1,14 +0,0 @@
-<tal:root
- xmlns:tal="http://xml.zope.org/namespaces/tal"
- xmlns:metal="http://xml.zope.org/namespaces/metal"
- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
- omit-tag="">
-http://launchpad.net/<strong><div
- tal:condition="view/read_only"
- tal:replace="view/product_name">foo</div></strong>
-<input id="field.name" name="field.name" size="30"
- tal:attributes="value view/product_name;
- type view/widget_type;
- class view/cssClass"
- />
-</tal:root>
=== added file 'lib/canonical/widgets/templates/uri-component.pt'
--- lib/canonical/widgets/templates/uri-component.pt 1970-01-01 00:00:00 +0000
+++ lib/canonical/widgets/templates/uri-component.pt 2011-01-28 05:35:56 +0000
@@ -0,0 +1,16 @@
+<tal:root
+ xmlns:tal="http://xml.zope.org/namespaces/tal"
+ xmlns:metal="http://xml.zope.org/namespaces/metal"
+ xmlns:i18n="http://xml.zope.org/namespaces/i18n"
+ omit-tag="">
+ <tal:base_url replace="view/base_url" /><strong><div
+ tal:condition="view/read_only"
+ tal:replace="view/current_name">foo</div></strong>
+ <input size="30"
+ tal:attributes="id view/name;
+ name view/name;
+ value view/current_name;
+ class view/cssClass;
+ type view/widget_type"
+ />
+</tal:root>
=== modified file 'lib/canonical/widgets/textwidgets.py'
--- lib/canonical/widgets/textwidgets.py 2010-10-03 15:30:06 +0000
+++ lib/canonical/widgets/textwidgets.py 2011-01-28 05:35:56 +0000
@@ -5,6 +5,7 @@
import pytz
import re
+from z3c.ptcompat import ViewPageTemplateFile
from zope.datetime import parse, DateTimeError
from zope.app.form.browser.textwidgets import TextAreaWidget, TextWidget
from zope.app.form.interfaces import ConversionError
@@ -156,6 +157,31 @@
return TextWidget._toFieldValue(self, input)
+class URIComponentWidget(LowerCaseTextWidget):
+ """A text input widget that looks like a URL path component entry."""
+
+ template = ViewPageTemplateFile('templates/uri-component.pt')
+ read_only = False
+
+ def __call__(self):
+ return self.template()
+
+ @property
+ def base_url(self):
+ raise NotImplementedError()
+
+ @property
+ def current_name(self):
+ return self._getFormValue().lower()
+
+ @property
+ def widget_type(self):
+ if self.read_only:
+ return 'hidden'
+ else:
+ return 'text'
+
+
class DelimitedListWidget(TextAreaWidget):
"""A widget that represents a list as whitespace-delimited text.
=== modified file 'lib/lp/soyuz/browser/archive.py'
--- lib/lp/soyuz/browser/archive.py 2011-01-21 18:28:20 +0000
+++ lib/lp/soyuz/browser/archive.py 2011-01-28 05:35:56 +0000
@@ -44,6 +44,7 @@
Interface,
)
from zope.schema import (
+ Bool,
Choice,
List,
TextLine,
@@ -125,6 +126,7 @@
SourcesListEntries,
SourcesListEntriesView,
)
+from lp.soyuz.browser.widgets.archive import PPANameWidget
from lp.soyuz.enums import (
ArchivePermissionType,
ArchivePurpose,
@@ -136,7 +138,6 @@
IArchive,
IArchiveEditDependenciesForm,
IArchiveSet,
- IPPAActivateForm,
)
from lp.soyuz.interfaces.archivepermission import IArchivePermissionSet
from lp.soyuz.interfaces.archivesubscriber import IArchiveSubscriberSet
@@ -1130,8 +1131,12 @@
"""
schema = IArchivePackageDeletionForm
-
custom_widget('deletion_comment', StrippedTextWidget, displayWidth=50)
+ label = 'Delete packages'
+
+ @property
+ def label(self):
+ return 'Delete packages from %s' % self.context.displayname
@property
def default_status_filter(self):
@@ -1233,10 +1238,14 @@
a copying action that can be performed upon a set of selected packages.
"""
schema = IPPAPackageFilter
-
custom_widget('destination_archive', DestinationArchiveDropdownWidget)
custom_widget('destination_series', DestinationSeriesDropdownWidget)
custom_widget('include_binaries', LaunchpadRadioWidget)
+ label = 'Copy packages'
+
+ @property
+ def label(self):
+ return 'Copy packages from %s' % self.context.displayname
default_pocket = PackagePublishingPocket.RELEASE
@@ -1761,9 +1770,12 @@
class ArchiveActivateView(LaunchpadFormView):
"""PPA activation view class."""
- schema = IPPAActivateForm
+ schema = IArchive
+ field_names = ('name', 'displayname', 'description')
custom_widget('description', TextAreaWidget, height=3)
- label = "Personal Package Archive Activation"
+ custom_widget('name', PPANameWidget, label="URL")
+ label = 'Activate a Personal Package Archive'
+ page_title = 'Activate PPA'
@property
def ubuntu(self):
@@ -1787,12 +1799,12 @@
"""
LaunchpadFormView.setUpFields(self)
- if self.context.archive is not None:
- self.form_fields = self.form_fields.select(
- 'name', 'displayname', 'description')
- else:
- self.form_fields = self.form_fields.select(
- 'name', 'displayname', 'accepted', 'description')
+ if self.context.archive is None:
+ accepted = Bool(
+ __name__='accepted',
+ title=_("I have read and accepted the PPA Terms of Use."),
+ required=True, default=False)
+ self.form_fields += form.Fields(accepted)
def validate(self, data):
"""Ensure user has checked the 'accepted' checkbox."""
@@ -1880,9 +1892,9 @@
self.updateContextFromData(data)
self.next_url = canonical_url(self.context)
- @action(_("Cancel"), name="cancel", validator='validate_cancel')
- def cancel_action(self, action, data):
- self.next_url = canonical_url(self.context)
+ @property
+ def cancel_url(self):
+ return canonical_url(self.context)
def validate_save(self, action, data):
"""Default save validation does nothing."""
@@ -1894,6 +1906,11 @@
field_names = ['displayname', 'description', 'enabled', 'publish']
custom_widget(
'description', TextAreaWidget, height=10, width=30)
+ page_title = 'Change details'
+
+ @property
+ def label(self):
+ return 'Edit %s' % self.context.displayname
class ArchiveAdminView(BaseArchiveEditView):
@@ -1901,10 +1918,13 @@
field_names = ['enabled', 'private', 'commercial', 'require_virtualized',
'build_debug_symbols', 'buildd_secret', 'authorized_size',
'relative_build_score', 'external_dependencies']
-
custom_widget('external_dependencies', TextAreaWidget, height=3)
-
custom_widget('enabled_restricted_families', LabeledMultiCheckBoxWidget)
+ page_title = 'Administer'
+
+ @property
+ def label(self):
+ return 'Administer %s' % self.context.displayname
def updateContextFromData(self, data):
"""Update context from form data.
@@ -2007,13 +2027,13 @@
for family in getUtility(IProcessorFamilySet).getRestricted():
terms.append(SimpleTerm(
family, token=family.name, title=family.title))
+ old_field = IArchive['enabled_restricted_families']
return form.Fields(
- List(__name__='enabled_restricted_families',
- title=_('Enabled restricted families'),
+ List(__name__=old_field.__name__,
+ title=old_field.title,
value_type=Choice(vocabulary=SimpleVocabulary(terms)),
required=False,
- description=_('Select the restricted architecture families '
- 'on which this archive is allowed to build.')),
+ description=old_field.description),
render_context=self.render_context)
=== modified file 'lib/lp/soyuz/browser/configure.zcml'
--- lib/lp/soyuz/browser/configure.zcml 2010-10-06 18:53:53 +0000
+++ lib/lp/soyuz/browser/configure.zcml 2011-01-28 05:35:56 +0000
@@ -277,7 +277,7 @@
for="lp.soyuz.interfaces.archive.IArchive"
class="lp.soyuz.browser.archive.ArchiveEditView"
permission="launchpad.Edit"
- template="../templates/archive-edit.pt"/>
+ template="../../app/templates/generic-edit.pt"/>
<browser:page
name="+delete"
facet="overview"
@@ -291,7 +291,7 @@
for="lp.soyuz.interfaces.archive.IArchive"
class="lp.soyuz.browser.archive.ArchiveAdminView"
permission="launchpad.Commercial"
- template="../templates/archive-admin.pt"/>
+ template="../../app/templates/generic-edit.pt"/>
<browser:pages
for="lp.soyuz.interfaces.archive.IArchive"
permission="launchpad.Edit"
=== added directory 'lib/lp/soyuz/browser/widgets'
=== added file 'lib/lp/soyuz/browser/widgets/__init__.py'
=== added file 'lib/lp/soyuz/browser/widgets/archive.py'
--- lib/lp/soyuz/browser/widgets/archive.py 1970-01-01 00:00:00 +0000
+++ lib/lp/soyuz/browser/widgets/archive.py 2011-01-28 05:35:56 +0000
@@ -0,0 +1,28 @@
+# Copyright 2010 Canonical Ltd. This software is licensed under the
+# GNU Affero General Public License version 3 (see the file LICENSE).
+
+"""Widgets related to `IArchive`."""
+
+__metaclass__ = type
+__all__ = [
+ 'PPANameWidget',
+ ]
+
+import urlparse
+
+from canonical.config import config
+from canonical.widgets.textwidgets import URIComponentWidget
+
+
+class PPANameWidget(URIComponentWidget):
+ """A text input widget that looks like a URL path component entry."""
+
+ @property
+ def base_url(self):
+ field = self.context
+ owner = field.context
+ if owner.private:
+ root = config.personalpackagearchive.private_base_url
+ else:
+ root = config.personalpackagearchive.base_url
+ return urlparse.urljoin(root, owner.name) + '/'
=== modified file 'lib/lp/soyuz/interfaces/archive.py'
--- lib/lp/soyuz/interfaces/archive.py 2011-01-14 11:57:48 +0000
+++ lib/lp/soyuz/interfaces/archive.py 2011-01-28 05:35:56 +0000
@@ -35,7 +35,6 @@
'InvalidPocketForPartnerArchive',
'InvalidPocketForPPA',
'IPPA',
- 'IPPAActivateForm',
'MAIN_ARCHIVE_PURPOSES',
'NoRightsForArchive',
'NoRightsForComponent',
@@ -264,18 +263,26 @@
TextLine(
title=_("Name"), required=True,
constraint=name_validator,
- description=_("The name of this archive.")))
+ description=_(
+ "At least one lowercase letter or number, followed by "
+ "letters, numbers, dots, hyphens or pluses. "
+ "Keep this name short; it is used in URLs.")))
displayname = exported(
StrippedTextLine(
- title=_("Displayname"), required=True,
- description=_("Displayname for this archive.")))
+ title=_("Display name"), required=True,
+ description=_("A short title for the archive.")))
title = TextLine(title=_("Name"), required=False, readonly=True)
enabled = Bool(
title=_("Enabled"), required=False,
- description=_("Whether the archive is enabled or not."))
+ description=_(
+ "Accept and build packages uploaded to the archive."))
+
+ publish = Bool(
+ title=_("Publish"), required=False,
+ description=_("Update the APT archive."))
# This is redefined from IPrivacy.private because the attribute is
# read-only. The value is guarded by a validator.
@@ -283,26 +290,25 @@
Bool(
title=_("Private"), required=False,
description=_(
- "Whether the archive is private to the owner or not. "
- "This can only be changed by launchpad admins or launchpad "
- "commercial admins and only if the archive has not had "
- "any sources published.")))
+ "Restrict access to the archive to its owner and "
+ "subscribers. This can only be changed if the archive has "
+ "never had any sources published.")))
require_virtualized = exported(
Bool(
- title=_("Require Virtualized Builder"), required=False,
- description=_("Whether this archive requires its packages to be "
- "built on a virtual builder."), readonly=False))
+ title=_("Require virtualized builders"), required=False,
+ readonly=False, description=_(
+ "Only build the archive's packages on virtual builders.")))
build_debug_symbols = Bool(
title=_("Build debug symbols"), required=False,
- description=_("Whether builds for this archive should create debug "
- "symbol packages."))
+ description=_(
+ "Create debug symbol packages for builds in the archive."))
authorized_size = Int(
- title=_("Authorized PPA size "), required=False,
+ title=_("Authorized size"), required=False,
max=2 ** 31 - 1,
- description=_("Maximum size, in MiB, allowed for this PPA."))
+ description=_("Maximum size, in MiB, allowed for the archive."))
purpose = Int(
title=_("Purpose of archive."), required=True, readonly=True,
@@ -401,15 +407,16 @@
description=_("The time when the archive was created."))
relative_build_score = Int(
- title=_("Relative Build Score"), required=True, readonly=False,
+ title=_("Relative build score"), required=True, readonly=False,
description=_(
- "A delta to apply to all build scores for this archive."))
+ "A delta to apply to all build scores for the archive. Builds "
+ "with a higher score will build sooner."))
external_dependencies = Text(
title=_("External dependencies"), required=False, readonly=False,
description=_(
"Newline-separated list of repositories to be used to retrieve "
- "any external build dependencies when building packages in this "
+ "any external build dependencies when building packages in the "
"archive, in the format:\n"
"deb http[s]://[user:pass@]<host>[/path] %(series)s[-pocket] "
"[components]\n"
@@ -418,19 +425,20 @@
"NOTE: This is for migration of OEM PPAs only!"))
enabled_restricted_families = CollectionField(
- title=_("Restricted architecture families this archive can build "
- "on"),
+ title=_("Enabled restricted families"),
+ description=_(
+ "The restricted architecture families on which the archive "
+ "can build."),
value_type=Reference(schema=IProcessorFamily),
readonly=False)
commercial = exported(
Bool(
- title=_("Commercial Archive"),
+ title=_("Commercial"),
required=True,
description=_(
- "Set if this archive is used for commercial purposes and "
- "should appear in the Software Center listings. The archive "
- "must also be private if this is set.")))
+ "Display the archive in Software Center's commercial "
+ "listings. Only private archives can be commercial.")))
def getSourcesForDeletion(name=None, status=None, distroseries=None):
"""All `ISourcePackagePublishingHistory` available for deletion.
@@ -921,9 +929,9 @@
"""Archive interface for operations restricted by view privilege."""
buildd_secret = TextLine(
- title=_("Buildd Secret"), required=False,
- description=_("The password used by the builder to access the "
- "archive."))
+ title=_("Build farm secret"), required=False,
+ description=_(
+ "The password used by the build farm to access the archive."))
dependencies = exported(
CollectionField(
@@ -933,8 +941,10 @@
description = exported(
Text(
- title=_("Archive contents description"), required=False,
- description=_("A short description of this archive's contents.")))
+ title=_("Description"), required=False,
+ description=_(
+ "A short description of the archive. URLs are allowed and "
+ "will be rendered as links.")))
signing_key_fingerprint = exported(
Text(
@@ -1314,10 +1324,6 @@
class IArchiveEdit(Interface):
"""Archive interface for operations restricted by edit privilege."""
- publish = Bool(
- title=_("Publish"), required=False,
- description=_("Whether the archive is to be published or not."))
-
@operation_parameters(
person=Reference(schema=IPerson),
source_package_name=TextLine(
@@ -1442,31 +1448,6 @@
"""Marker interface so traversal works differently for distro archives."""
-class IPPAActivateForm(Interface):
- """Schema used to activate PPAs."""
-
- name = TextLine(
- title=_("PPA name"), required=True, constraint=name_validator,
- description=_("A unique name used to identify this PPA. It will "
- "form part of the URL to the archive repository."))
-
- displayname = StrippedTextLine(
- title=_("Displayname"), required=True,
- description=_("Displayname for this PPA. It will be used in "
- "the signing key's description if this is the "
- "first PPA for a person."))
-
- description = Text(
- title=_("PPA contents description"), required=False,
- description=_(
- "A short description of this PPA. URLs are allowed and will "
- "be rendered as links."))
-
- accepted = Bool(
- title=_("I have read and accepted the PPA Terms of Service."),
- required=True, default=False)
-
-
class IArchiveEditDependenciesForm(Interface):
"""Schema used to edit dependencies settings within a archive."""
=== modified file 'lib/lp/soyuz/stories/ppa/xx-ppa-private-teams.txt'
--- lib/lp/soyuz/stories/ppa/xx-ppa-private-teams.txt 2010-10-28 23:20:26 +0000
+++ lib/lp/soyuz/stories/ppa/xx-ppa-private-teams.txt 2011-01-28 05:35:56 +0000
@@ -44,6 +44,17 @@
>>> print_tag_with_id(browser.contents, 'ppa-privacy-statement')
Since 'Private Team' is a private team this PPA will be private.
+The URL template also shows the private URL.
+
+ >>> print extract_text(
+ ... first_tag_by_class(browser.contents, 'form'))
+ URL:
+ http://private-ppa.launchpad.dev/private-team/
+ At least one lowercase letter or number, followed by letters, numbers,
+ dots, hyphens or pluses. Keep this name short; it is used in URLs.
+ ...
+
+
>>> browser.getControl(name='field.displayname').value = "Private Team PPA"
>>> browser.getControl(name='field.accepted').value = True
>>> browser.getControl("Activate").click()
=== modified file 'lib/lp/soyuz/stories/ppa/xx-ppa-workflow.txt'
--- lib/lp/soyuz/stories/ppa/xx-ppa-workflow.txt 2010-10-30 12:00:34 +0000
+++ lib/lp/soyuz/stories/ppa/xx-ppa-workflow.txt 2011-01-28 05:35:56 +0000
@@ -239,7 +239,7 @@
>>> sample_browser.getLink("Change details").click()
>>> sample_browser.getControl(name="field.description").value = (
... 'Discarded ...')
- >>> sample_browser.getControl("Cancel").click()
+ >>> sample_browser.getLink("Cancel").click()
>>> print sample_browser.title
Devel PPA : âLandscape Developersâ team
@@ -452,13 +452,13 @@
Cancelled changes in the administration form redirects the user to the
PPA overview page and discards the changes.
- >>> admin_browser.getControl("Cancel").click()
+ >>> admin_browser.getLink("Cancel").click()
>>> print admin_browser.title
Hack PPA : James Blackwell
>>> admin_browser.getLink("Administer archive").click()
- >>> admin_browser.getControl("Cancel").click()
+ >>> admin_browser.getLink("Cancel").click()
>>> print admin_browser.title
Hack PPA : James Blackwell
@@ -553,15 +553,15 @@
>>> print extract_text(
... first_tag_by_class(cprov_browser.contents, 'form'))
- PPA name:
- A unique name used to identify this PPA. It will form part of the URL
- to the archive repository.
- Displayname:
- Displayname for this PPA. It will be used in the signing key's
- description if this is the first PPA for a person.
- PPA contents description: (Optional)
- A short description of this PPA. URLs are allowed and will be rendered
- as links.
+ URL:
+ http://ppa.launchpad.dev/cprov/
+ At least one lowercase letter or number, followed by letters, numbers,
+ dots, hyphens or pluses. Keep this name short; it is used in URLs.
+ Display name:
+ A short title for the archive.
+ Description: (Optional)
+ A short description of the archive. URLs are allowed and will be
+ rendered as links.
The 'PPA name' field is not pre-filled and if Celso does not fill it then
an error is raised.
@@ -578,15 +578,17 @@
There is 1 error.
Required input is missing.
-An error is raised if Celso sets an invalid PPA name.
+An error is raised if Celso sets an invalid PPA name. Notice that the widget
+automatically lowercases its input, as valid names must be lowercase. This is
+also enforced by the widget in the browser.
- >>> cprov_browser.getControl(name="field.name").value = 'ExPeRiMeNtAl'
+ >>> cprov_browser.getControl(name="field.name").value = 'ExPeRiMeNtAl!'
>>> cprov_browser.getControl("Activate").click()
>>> for error in get_feedback_messages(cprov_browser.contents):
... print error
There is 1 error.
- Invalid name 'ExPeRiMeNtAl'. Names must be at least two characters ...
+ Invalid name 'experimental!'. Names must be at least two characters ...
If Celso, by mistake, uses the same name of one of his existing PPAs
(the default one is named 'ppa') an error is raised.
=== modified file 'lib/lp/soyuz/templates/archive-activate.pt'
--- lib/lp/soyuz/templates/archive-activate.pt 2010-05-09 21:11:52 +0000
+++ lib/lp/soyuz/templates/archive-activate.pt 2011-01-28 05:35:56 +0000
@@ -9,43 +9,42 @@
<body>
<div metal:fill-slot="main">
- <div class="top-portlet">
- A PPA is a place where you can build and publish your own packages.
- These can be custom versions of Ubuntu packages, or completely new
- packages, and can be built for any
- <a tal:attributes="href view/ubuntu/fmt:url">supported version of Ubuntu</a>.
- For more information, please see the
- <a href="https://help.launchpad.net/Packaging/PPA">PPA help page</a>.
- </div>
-
- <p tal:condition="view/is_private_team" id="ppa-privacy-statement">
- <img src="/@@/info" />
- Since '<tal:name replace="string:${context/displayname}"/>' is
- a <strong>private</strong> team this PPA will be private.
- </p>
-
- <div tal:condition="context/ppas" id="ppas"
- style="padding-top: .3em; padding-bottom: .3em;">
- <h2>Existing PPAs</h2>
- <div tal:replace="structure context/@@+ppas-list"/>
- </div>
-
<div metal:use-macro="context/@@launchpad_form/form">
<div metal:fill-slot="extra_info">
- <p>
- Read the current version of
- <a href="https://help.launchpad.net/PPATermsofUse">PPA Terms of
- Use</a> before activating a new PPA.
- </p>
+ <p>
+ A PPA is a place where you can build and publish your own packages.
+ These can be custom versions of Ubuntu packages, or completely new
+ packages, and can be built for any
+ <a tal:attributes="href view/ubuntu/fmt:url">supported version of Ubuntu</a>.
+ For more information, please see the
+ <a href="https://help.launchpad.net/Packaging/PPA">PPA help page</a>.
+ </p>
+ <div tal:condition="context/ppas" id="ppas"
+ style="padding-top: .3em; padding-bottom: .3em;">
+ <h2>Existing PPAs</h2>
+ <div tal:replace="structure context/@@+ppas-list"/>
+ </div>
+ <p>
+ Read the current version of
+ <a href="https://help.launchpad.net/PPATermsofUse">PPA Terms of
+ Use</a> before activating a new PPA.
+ </p>
+ <p tal:condition="view/is_private_team" id="ppa-privacy-statement">
+ <img src="/@@/info" />
+ Since '<tal:name replace="string:${context/displayname}"/>' is
+ a <strong>private</strong> team this PPA will be private.
+ </p>
</div>
<div class="actions" metal:fill-slot="buttons">
<p>
<img src="/@@/warning" />
- If you have any PPAs with published packages, you will not be able to
- rename <tal:context replace="structure context/fmt:link" /> until
- those PPAs are deleted.
+ A PPA's URL cannot be changed once it has had packages
+ published. You will not be able to rename
+ <tal:context replace="structure context/fmt:link" />
+ (<tt tal:content="context/name" />) until all such PPAs are
+ deleted.
</p>
<input tal:replace="structure view/actions/field.actions.activate/render" />
or <a tal:attributes="href context/fmt:url">Cancel</a>
=== removed file 'lib/lp/soyuz/templates/archive-admin.pt'
--- lib/lp/soyuz/templates/archive-admin.pt 2009-08-06 10:33:41 +0000
+++ lib/lp/soyuz/templates/archive-admin.pt 1970-01-01 00:00:00 +0000
@@ -1,20 +0,0 @@
-<html
- xmlns="http://www.w3.org/1999/xhtml"
- xmlns:tal="http://xml.zope.org/namespaces/tal"
- xmlns:metal="http://xml.zope.org/namespaces/metal"
- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
- metal:use-macro="view/macro:page/main_only"
- i18n:domain="launchpad"
- >
-<body>
-
- <metal:heading fill-slot="heading">
- <h1 tal:condition="not: view/label">Administer archive</h1>
- </metal:heading>
-
- <div metal:fill-slot="main">
- <div class="top-portlet" metal:use-macro="context/@@launchpad_form/form" />
- </div>
-
-</body>
-</html>
=== modified file 'lib/lp/soyuz/templates/archive-copy-packages.pt'
--- lib/lp/soyuz/templates/archive-copy-packages.pt 2009-09-10 11:53:18 +0000
+++ lib/lp/soyuz/templates/archive-copy-packages.pt 2011-01-28 05:35:56 +0000
@@ -18,12 +18,6 @@
</tal:devmode>
</metal:block>
-<div metal:fill-slot="heading">
- <h1 tal:content="CONTEXTS/fmt:pagetitle">
- Copy packages from Blah PPA
- </h1>
-</div>
-
<div metal:fill-slot="main">
<div class="top-portlet">
<tal:cannot_copy condition="not: view/can_copy">
=== modified file 'lib/lp/soyuz/templates/archive-delete-packages.pt'
--- lib/lp/soyuz/templates/archive-delete-packages.pt 2009-09-09 17:54:13 +0000
+++ lib/lp/soyuz/templates/archive-delete-packages.pt 2011-01-28 05:35:56 +0000
@@ -18,12 +18,6 @@
</tal:devmode>
</metal:block>
-<div metal:fill-slot="heading">
- <h1 tal:content="CONTEXTS/fmt:pagetitle">
- Delete packages from Blah PPA
- </h1>
-</div>
-
<div metal:fill-slot="main">
<div class="top-portlet">
<tal:inactive_ppa_header condition="not: view/has_sources">
=== removed file 'lib/lp/soyuz/templates/archive-edit.pt'
--- lib/lp/soyuz/templates/archive-edit.pt 2009-08-06 15:00:37 +0000
+++ lib/lp/soyuz/templates/archive-edit.pt 1970-01-01 00:00:00 +0000
@@ -1,22 +0,0 @@
-<html
- xmlns="http://www.w3.org/1999/xhtml"
- xmlns:tal="http://xml.zope.org/namespaces/tal"
- xmlns:metal="http://xml.zope.org/namespaces/metal"
- xmlns:i18n="http://xml.zope.org/namespaces/i18n"
- metal:use-macro="view/macro:page/main_only"
- i18n:domain="launchpad"
- >
-<body>
-
- <metal:heading fill-slot="heading">
- <h1>Edit archive details</h1>
- </metal:heading>
-
- <div metal:fill-slot="main">
-
- <div class="top-portlet" metal:use-macro="context/@@launchpad_form/form" />
-
- </div>
-
-</body>
-</html>
Follow ups