= Summary = Enable the archive +edit form to set the 'publish' flag == Proposed fix == Simple addition to the form fields on the +edit page. == Pre-implementation notes == == Implementation details == It's trivial! == Tests == bin/test -cvvt xx-ppa-workflow.txt == Demo and Q/A == = Launchpad lint = This lint is all crack. I'm ignoring it. We really need to fix the linter. Checking for conflicts. and issues in doctests and templates. Running jslint, xmllint, pyflakes, and pylint. Using normal rules. Linting changed files: lib/lp/soyuz/stories/ppa/xx-ppa-workflow.txt lib/lp/soyuz/interfaces/archive.py lib/lp/soyuz/configure.zcml lib/lp/soyuz/browser/archive.py == Pylint notices == lib/lp/soyuz/interfaces/archive.py 40: [F0401] Unable to import 'lazr.enum' (No module named enum) 53: [F0401] Unable to import 'lazr.restful.declarations' (No module named restful) 59: [F0401] Unable to import 'lazr.restful.fields' (No module named restful) 444: [C0322, IArchivePublic.newPackagesetUploader] Operator not preceded by a space packageset=Reference( ^ Interface, title=_("Package set"), required=True), explicit=Bool( title=_("Explicit"), required=False)) @export_factory_operation(Interface, []) def newPackagesetUploader(person, packageset, explicit=False): 468: [C0322, IArchivePublic.getUploadersForPackageset] Operator not preceded by a space packageset=Reference( ^ Interface, title=_("Package set"), required=True), direct_permissions=Bool( title=_("Ignore package set hierarchy"), required=False)) @operation_returns_collection_of(Interface) @export_read_operation() def getUploadersForPackageset(packageset, direct_permissions=True): 490: [C0322, IArchivePublic.deletePackagesetUploader] Operator not preceded by a space packageset=Reference( ^ Interface, title=_("Package set"), required=True), explicit=Bool( title=_("Explicit"), required=False)) @export_write_operation() def deletePackagesetUploader(person, packageset, explicit=False): 525: [C0322, IArchivePublic.getPackagesetsForSourceUploader] Operator not preceded by a space person=Reference(schema=IPerson)) ^ @operation_returns_collection_of(Interface) @export_read_operation() def getPackagesetsForSourceUploader(sourcepackagename, person): 554: [C0322, IArchivePublic.getPackagesetsForSource] Operator not preceded by a space direct_permissions=Bool( ^ title=_("Ignore package set hierarchy"), required=False)) @operation_returns_collection_of(Interface) @export_read_operation() def getPackagesetsForSource( sourcepackagename, direct_permissions=True): 583: [C0322, IArchivePublic.isSourceUploadAllowed] Operator not preceded by a space title=_("Source package name"), required=True), ^ person=Reference(schema=IPerson), distroseries=Reference( Interface, title=_("The distro series"), required=False)) @export_read_operation() def isSourceUploadAllowed(sourcepackagename, person, distroseries=None): 654: [C0322, IArchiveView.getPublishedSources] Operator not preceded by a space status=Choice( ^ title=_('Package Publishing Status'), description=_('The status of this publishing record'), vocabulary=DBEnumeratedType, required=False), distroseries=Reference( Interface, title=_("Distroseries name"), required=False), pocket=Choice( title=_("Pocket"), description=_("The pocket into which this entry is published"), vocabulary=DBEnumeratedType, required=False, readonly=True), exact_match=Bool( title=_("Exact Match"), description=_("Whether or not to filter source names by exact" " matching."), required=False), created_since_date=Datetime( title=_("Created Since Date"), description=_("Return entries whose `date_created` is greater " "than or equal to this date."), required=False)) @operation_returns_collection_of(Interface) @export_read_operation() def getPublishedSources(name=None, version=None, status=None, distroseries=None, pocket=None, exact_match=False, created_since_date=None): 708: [C0322, IArchiveView.getAllPublishedBinaries] Operator not preceded by a space status=Choice( ^ title=_("Package Publishing Status"), description=_("The status of this publishing record"), vocabulary=DBEnumeratedType, required=False), distroarchseries=Reference( Interface, title=_("Distro Arch Series"), required=False), pocket=Choice( title=_("Pocket"), description=_("The pocket into which this entry is published"), vocabulary=DBEnumeratedType, required=False, readonly=True), exact_match=Bool( description=_("Whether or not to filter binary names by exact " "matching."), required=False)) @operation_returns_collection_of(Interface) @export_operation_as("getPublishedBinaries") @export_read_operation() def getAllPublishedBinaries(name=None, version=None, status=None, distroarchseries=None, pocket=None, exact_match=False): 752: [C0322, IArchiveView.getBuildCounters] Operator not preceded by a space title=_("Include builds with state NEEDSBUILD"), required=False)) ^ @export_read_operation() def getBuildCounters(include_needsbuild=True): 780: [C0322, IArchiveView.getBuildSummariesForSourceIds] Operator not preceded by a space title=_("A list of source publishing history record ids."), ^ value_type=Int())) @export_read_operation() def getBuildSummariesForSourceIds(source_ids): 878: [C0322, IArchiveAppend.syncSources] Operator not preceded by a space title=_("Source package names"), ^ value_type=TextLine()), from_archive=Reference(schema=Interface), #Really IArchive, see below to_pocket=TextLine(title=_("Pocket name")), to_series=TextLine(title=_("Distroseries name"), required=False), include_binaries=Bool( title=_("Include Binaries"), description=_("Whether or not to copy binaries already built for" " this source"), required=False)) @export_write_operation() def syncSources(source_names, from_archive, to_pocket, to_series=None, include_binaries=False): 919: [C0322, IArchiveAppend.syncSource] Operator not preceded by a space version=TextLine(title=_("Version")), ^ from_archive=Reference(schema=Interface), #Really IArchive, see below to_pocket=TextLine(title=_("Pocket name")), to_series=TextLine(title=_("Distroseries name"), required=False), include_binaries=Bool( title=_("Include Binaries"), description=_("Whether or not to copy binaries already built for" " this source"), required=False)) @export_write_operation() def syncSource(source_name, version, from_archive, to_pocket, to_series=None, include_binaries=False): 959: [C0322, IArchiveAppend.newSubscription] Operator not preceded by a space title=_("Subscriber"), ^ required=True, vocabulary='ValidPersonOrTeam', description=_("The person who is subscribed.")), date_expires=Datetime(title=_("Date of Expiration"), required=False, description=_("The timestamp when the subscription will " "expire.")), description=Text(title=_("Description"), required=False, description=_("Free text describing this subscription."))) @export_factory_operation(Interface, []) def newSubscription(subscriber, registrant, date_expires=None, description=None): 998: [C0322, IArchiveEdit.newPackageUploader] Operator not preceded by a space source_package_name=TextLine( ^ title=_("Source Package Name"), required=True)) @export_factory_operation(Interface, []) def newPackageUploader(person, source_package_name): 1014: [C0322, IArchiveEdit.newComponentUploader] Operator not preceded by a space component_name=TextLine( ^ title=_("Component Name"), required=True)) @export_factory_operation(Interface, []) def newComponentUploader(person, component_name): 1031: [C0322, IArchiveEdit.newQueueAdmin] Operator not preceded by a space component_name=TextLine( ^ title=_("Component Name"), required=True)) @export_factory_operation(Interface, []) def newQueueAdmin(person, component_name): 1049: [C0322, IArchiveEdit.deletePackageUploader] Operator not preceded by a space source_package_name=TextLine( ^ title=_("Source Package Name"), required=True)) @export_write_operation() def deletePackageUploader(person, source_package_name): 1062: [C0322, IArchiveEdit.deleteComponentUploader] Operator not preceded by a space component_name=TextLine( ^ title=_("Component Name"), required=True)) @export_write_operation() def deleteComponentUploader(person, component_name): 1074: [C0322, IArchiveEdit.deleteQueueAdmin] Operator not preceded by a space component_name=TextLine( ^ title=_("Component Name"), required=True)) @export_write_operation() def deleteQueueAdmin(person, component_name):