Merge ~cjwatson/launchpad:export-getSourceFilter into launchpad:master

Proposed by Colin Watson
Status: Merged
Approved by: Colin Watson
Approved revision: 712f8e6483fd56c21f06732249c468c3f3b8cdad
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~cjwatson/launchpad:export-getSourceFilter
Merge into: launchpad:master
Diff against target: 263 lines (+69/-27)
8 files modified
lib/lp/_schema_circular_imports.py (+3/-0)
lib/lp/services/webservice/wadl-to-refhtml.xsl (+9/-0)
lib/lp/soyuz/browser/configure.zcml (+5/-1)
lib/lp/soyuz/browser/distroarchseries.py (+10/-2)
lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py (+14/-11)
lib/lp/soyuz/interfaces/distroarchseries.py (+5/-0)
lib/lp/soyuz/interfaces/distroarchseriesfilter.py (+20/-12)
lib/lp/soyuz/interfaces/webservice.py (+3/-1)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Ioana Lasc (community) Approve
Review via email: mp+373625@code.launchpad.net

Commit message

Export IDistroArchSeries.getSourceFilter

This allows webservice users to find out which source filters are
currently set.

I had to export IDistroArchSeriesFilter to make this work. Since there
can only be one source filter per DAS (enforced by a DB constraint), the
URL is just the DAS URL with +source-filter appended.

To post a comment you must log in.
Revision history for this message
Ioana Lasc (ilasc) :
review: Approve
Revision history for this message
Otto Co-Pilot (otto-copilot) wrote :
Revision history for this message
Colin Watson (cjwatson) wrote :

Self-approving to work around incorrect repository reviewer.

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
diff --git a/lib/lp/_schema_circular_imports.py b/lib/lp/_schema_circular_imports.py
index cffb8ab..20db323 100644
--- a/lib/lp/_schema_circular_imports.py
+++ b/lib/lp/_schema_circular_imports.py
@@ -189,6 +189,7 @@ from lp.soyuz.interfaces.binarypackagerelease import (
189 )189 )
190from lp.soyuz.interfaces.buildrecords import IHasBuildRecords190from lp.soyuz.interfaces.buildrecords import IHasBuildRecords
191from lp.soyuz.interfaces.distroarchseries import IDistroArchSeries191from lp.soyuz.interfaces.distroarchseries import IDistroArchSeries
192from lp.soyuz.interfaces.distroarchseriesfilter import IDistroArchSeriesFilter
192from lp.soyuz.interfaces.livefs import ILiveFSView193from lp.soyuz.interfaces.livefs import ILiveFSView
193from lp.soyuz.interfaces.livefsbuild import (194from lp.soyuz.interfaces.livefsbuild import (
194 ILiveFSBuild,195 ILiveFSBuild,
@@ -496,6 +497,8 @@ patch_reference_property(
496patch_reference_property(IDistroArchSeries, 'main_archive', IArchive)497patch_reference_property(IDistroArchSeries, 'main_archive', IArchive)
497patch_plain_parameter_type(498patch_plain_parameter_type(
498 IDistroArchSeries, 'setChrootFromBuild', 'livefsbuild', ILiveFSBuild)499 IDistroArchSeries, 'setChrootFromBuild', 'livefsbuild', ILiveFSBuild)
500patch_entry_return_type(
501 IDistroArchSeries, 'getSourceFilter', IDistroArchSeriesFilter)
499patch_plain_parameter_type(502patch_plain_parameter_type(
500 IDistroArchSeries, 'setSourceFilter', 'packageset', IPackageset)503 IDistroArchSeries, 'setSourceFilter', 'packageset', IPackageset)
501504
diff --git a/lib/lp/services/webservice/wadl-to-refhtml.xsl b/lib/lp/services/webservice/wadl-to-refhtml.xsl
index 3df6657..d5198b0 100644
--- a/lib/lp/services/webservice/wadl-to-refhtml.xsl
+++ b/lib/lp/services/webservice/wadl-to-refhtml.xsl
@@ -299,6 +299,15 @@
299 <xsl:text>/</xsl:text>299 <xsl:text>/</xsl:text>
300 <var>&lt;architecture_tag&gt;</var>300 <var>&lt;architecture_tag&gt;</var>
301 </xsl:when>301 </xsl:when>
302 <xsl:when test="@id = 'distro_arch_series_filter'">
303 <xsl:text>/</xsl:text>
304 <var>&lt;distribution.name&gt;</var>
305 <xsl:text>/</xsl:text>
306 <var>&lt;distroseries.name&gt;</var>
307 <xsl:text>/</xsl:text>
308 <var>&lt;architecture_tag&gt;</var>
309 <xsl:text>/+source-filter</xsl:text>
310 </xsl:when>
302 <xsl:when test="@id = 'distro_series'">311 <xsl:when test="@id = 'distro_series'">
303 <xsl:text>/</xsl:text>312 <xsl:text>/</xsl:text>
304 <var>&lt;distribution.name&gt;</var>313 <var>&lt;distribution.name&gt;</var>
diff --git a/lib/lp/soyuz/browser/configure.zcml b/lib/lp/soyuz/browser/configure.zcml
index 595aedf..1ce6b53 100644
--- a/lib/lp/soyuz/browser/configure.zcml
+++ b/lib/lp/soyuz/browser/configure.zcml
@@ -1,4 +1,4 @@
1<!-- Copyright 2009-2015 Canonical Ltd. This software is licensed under the1<!-- Copyright 2009-2019 Canonical Ltd. This software is licensed under the
2 GNU Affero General Public License version 3 (see the file LICENSE).2 GNU Affero General Public License version 3 (see the file LICENSE).
3-->3-->
44
@@ -156,6 +156,10 @@
156 template="../templates/distroarchseriesbinarypackagerelease-portlet-details.pt"/>156 template="../templates/distroarchseriesbinarypackagerelease-portlet-details.pt"/>
157 </browser:pages>157 </browser:pages>
158 <browser:url158 <browser:url
159 for="lp.soyuz.interfaces.distroarchseriesfilter.IDistroArchSeriesFilter"
160 path_expression="string:+source-filter"
161 attribute_to_parent="distroarchseries"/>
162 <browser:url
159 for="lp.soyuz.interfaces.archive.IArchiveSet"163 for="lp.soyuz.interfaces.archive.IArchiveSet"
160 path_expression="string:archives"164 path_expression="string:archives"
161 parent_utility="lp.services.webapp.interfaces.ILaunchpadRoot"165 parent_utility="lp.services.webapp.interfaces.ILaunchpadRoot"
diff --git a/lib/lp/soyuz/browser/distroarchseries.py b/lib/lp/soyuz/browser/distroarchseries.py
index 24cbc76..949809b 100644
--- a/lib/lp/soyuz/browser/distroarchseries.py
+++ b/lib/lp/soyuz/browser/distroarchseries.py
@@ -1,4 +1,4 @@
1# Copyright 2009-2012 Canonical Ltd. This software is licensed under the1# Copyright 2009-2019 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4__metaclass__ = type4__metaclass__ = type
@@ -33,7 +33,10 @@ from lp.services.webapp.menu import (
33 Link,33 Link,
34 NavigationMenu,34 NavigationMenu,
35 )35 )
36from lp.services.webapp.publisher import canonical_url36from lp.services.webapp.publisher import (
37 canonical_url,
38 stepto,
39 )
37from lp.soyuz.browser.packagesearch import PackageSearchViewBase40from lp.soyuz.browser.packagesearch import PackageSearchViewBase
38from lp.soyuz.interfaces.distroarchseries import IDistroArchSeries41from lp.soyuz.interfaces.distroarchseries import IDistroArchSeries
3942
@@ -42,6 +45,11 @@ class DistroArchSeriesNavigation(GetitemNavigation):
4245
43 usedfor = IDistroArchSeries46 usedfor = IDistroArchSeries
4447
48 @stepto('+source-filter')
49 def traverse_source_filter(self):
50 """Traverse to the `IDistroArchSeriesFilter` for this DAS, if any."""
51 return self.context.getSourceFilter()
52
4553
46class DistroArchSeriesBreadcrumb(Breadcrumb):54class DistroArchSeriesBreadcrumb(Breadcrumb):
47 """Builds a breadcrumb for `DistroArchSeries`."""55 """Builds a breadcrumb for `DistroArchSeries`."""
diff --git a/lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py b/lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py
index 9a7748f..74290a4 100644
--- a/lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py
+++ b/lib/lp/soyuz/browser/tests/test_distroarchseries_webservice.py
@@ -11,7 +11,11 @@ from lazr.restfulclient.errors import (
11 BadRequest,11 BadRequest,
12 Unauthorized,12 Unauthorized,
13 )13 )
14from testtools.matchers import MatchesStructure14from testtools.matchers import (
15 EndsWith,
16 Equals,
17 MatchesStructure,
18 )
15from zope.security.management import endInteraction19from zope.security.management import endInteraction
1620
17from lp.buildmaster.enums import BuildBaseImageType21from lp.buildmaster.enums import BuildBaseImageType
@@ -334,15 +338,14 @@ class TestDistroArchSeriesWebservice(TestCaseWithFactory):
334 webservice = launchpadlib_for("testing", user, version="devel")338 webservice = launchpadlib_for("testing", user, version="devel")
335 ws_das = ws_object(webservice, das)339 ws_das = ws_object(webservice, das)
336 ws_das.setSourceFilter(packageset=packageset_url, sense="Include")340 ws_das.setSourceFilter(packageset=packageset_url, sense="Include")
337 with person_logged_in(user):341 ws_dasf = ws_das.getSourceFilter()
338 dasf = das.getSourceFilter()342 self.assertThat(ws_dasf, MatchesStructure(
339 self.assertThat(dasf, MatchesStructure.byEquality(343 packageset_link=EndsWith(packageset_url),
340 packageset=packageset, sense=DistroArchSeriesFilterSense.INCLUDE))344 sense=Equals("Include")))
341 ws_das.setSourceFilter(packageset=packageset_url, sense="Exclude")345 ws_das.setSourceFilter(packageset=packageset_url, sense="Exclude")
342 with person_logged_in(user):346 ws_dasf = ws_das.getSourceFilter()
343 dasf = das.getSourceFilter()347 self.assertThat(ws_dasf, MatchesStructure(
344 self.assertThat(dasf, MatchesStructure.byEquality(348 packageset_link=EndsWith(packageset_url),
345 packageset=packageset, sense=DistroArchSeriesFilterSense.EXCLUDE))349 sense=Equals("Exclude")))
346 ws_das.removeSourceFilter()350 ws_das.removeSourceFilter()
347 with person_logged_in(user):351 self.assertIsNone(ws_das.getSourceFilter())
348 self.assertIsNone(das.getSourceFilter())
diff --git a/lib/lp/soyuz/interfaces/distroarchseries.py b/lib/lp/soyuz/interfaces/distroarchseries.py
index 02b4a92..8f5caa1 100644
--- a/lib/lp/soyuz/interfaces/distroarchseries.py
+++ b/lib/lp/soyuz/interfaces/distroarchseries.py
@@ -24,6 +24,7 @@ from lazr.restful.declarations import (
24 exported,24 exported,
25 operation_for_version,25 operation_for_version,
26 operation_parameters,26 operation_parameters,
27 operation_returns_entry,
27 REQUEST_USER,28 REQUEST_USER,
28 )29 )
29from lazr.restful.fields import (30from lazr.restful.fields import (
@@ -233,6 +234,10 @@ class IDistroArchSeriesPublic(IHasBuildRecords, IHasOwner):
233 this distro arch series.234 this distro arch series.
234 """235 """
235236
237 # Really IDistroArchSeriesFilter, patched in _schema_circular_imports.py.
238 @operation_returns_entry(Interface)
239 @export_read_operation()
240 @operation_for_version("devel")
236 def getSourceFilter():241 def getSourceFilter():
237 """Get the filter for packages to build for this architecture, if any.242 """Get the filter for packages to build for this architecture, if any.
238243
diff --git a/lib/lp/soyuz/interfaces/distroarchseriesfilter.py b/lib/lp/soyuz/interfaces/distroarchseriesfilter.py
index a78e1fa..1cc324a 100644
--- a/lib/lp/soyuz/interfaces/distroarchseriesfilter.py
+++ b/lib/lp/soyuz/interfaces/distroarchseriesfilter.py
@@ -12,6 +12,10 @@ __all__ = [
12 'NoSuchDistroArchSeriesFilter',12 'NoSuchDistroArchSeriesFilter',
13 ]13 ]
1414
15from lazr.restful.declarations import (
16 export_as_webservice_entry,
17 exported,
18 )
15from lazr.restful.fields import Reference19from lazr.restful.fields import Reference
16from zope.interface import Interface20from zope.interface import Interface
17from zope.schema import (21from zope.schema import (
@@ -39,37 +43,37 @@ class IDistroArchSeriesFilterView(Interface):
3943
40 id = Int(title=_("ID"), readonly=True, required=True)44 id = Int(title=_("ID"), readonly=True, required=True)
4145
42 distroarchseries = Reference(46 distroarchseries = exported(Reference(
43 title=_("Distro arch series"), required=True, readonly=True,47 title=_("Distro arch series"), required=True, readonly=True,
44 schema=IDistroArchSeries,48 schema=IDistroArchSeries,
45 description=_("The distro arch series that this filter is for."))49 description=_("The distro arch series that this filter is for.")))
4650
47 packageset = Reference(51 packageset = exported(Reference(
48 title=_("Package set"), required=True, readonly=True,52 title=_("Package set"), required=True, readonly=True,
49 schema=IPackageset,53 schema=IPackageset,
50 description=_(54 description=_(
51 "The package set to be included in or excluded from this distro "55 "The package set to be included in or excluded from this distro "
52 "arch series."))56 "arch series.")))
5357
54 sense = Choice(58 sense = exported(Choice(
55 title=_("Sense"),59 title=_("Sense"),
56 vocabulary=DistroArchSeriesFilterSense, required=True, readonly=True,60 vocabulary=DistroArchSeriesFilterSense, required=True, readonly=True,
57 description=_(61 description=_(
58 "Whether the filter represents packages to include or exclude "62 "Whether the filter represents packages to include or exclude "
59 "from the distro arch series."))63 "from the distro arch series.")))
6064
61 creator = PublicPersonChoice(65 creator = exported(PublicPersonChoice(
62 title=_("Creator"), required=True, readonly=True,66 title=_("Creator"), required=True, readonly=True,
63 vocabulary="ValidPerson",67 vocabulary="ValidPerson",
64 description=_("The user who created this filter."))68 description=_("The user who created this filter.")))
6569
66 date_created = Datetime(70 date_created = exported(Datetime(
67 title=_("Date created"), required=True, readonly=True,71 title=_("Date created"), required=True, readonly=True,
68 description=_("The time when this filter was created."))72 description=_("The time when this filter was created.")))
6973
70 date_last_modified = Datetime(74 date_last_modified = exported(Datetime(
71 title=_("Date last modified"), required=True, readonly=True,75 title=_("Date last modified"), required=True, readonly=True,
72 description=_("The time when this filter was last modified."))76 description=_("The time when this filter was last modified.")))
7377
74 def isSourceIncluded(sourcepackagename):78 def isSourceIncluded(sourcepackagename):
75 """Is this source package name included by this filter?79 """Is this source package name included by this filter?
@@ -103,6 +107,10 @@ class IDistroArchSeriesFilter(
103 exclude some packages ("this architecture can't handle some packages so107 exclude some packages ("this architecture can't handle some packages so
104 we want to make them go away centrally").108 we want to make them go away centrally").
105 """109 """
110 # XXX cjwatson 2019-10-04 bug=760849: "beta" is a lie to get WADL
111 # generation working. Individual attributes must set their version to
112 # "devel".
113 export_as_webservice_entry(as_of="beta")
106114
107115
108class IDistroArchSeriesFilterSet(Interface):116class IDistroArchSeriesFilterSet(Interface):
diff --git a/lib/lp/soyuz/interfaces/webservice.py b/lib/lp/soyuz/interfaces/webservice.py
index 21591de..3620e81 100644
--- a/lib/lp/soyuz/interfaces/webservice.py
+++ b/lib/lp/soyuz/interfaces/webservice.py
@@ -1,4 +1,4 @@
1# Copyright 2010-2017 Canonical Ltd. This software is licensed under the1# Copyright 2010-2019 Canonical Ltd. This software is licensed under the
2# GNU Affero General Public License version 3 (see the file LICENSE).2# GNU Affero General Public License version 3 (see the file LICENSE).
33
4"""All the interfaces that are exposed through the webservice.4"""All the interfaces that are exposed through the webservice.
@@ -30,6 +30,7 @@ __all__ = [
30 'IBinaryPackagePublishingHistory',30 'IBinaryPackagePublishingHistory',
31 'IBinaryPackageReleaseDownloadCount',31 'IBinaryPackageReleaseDownloadCount',
32 'IDistroArchSeries',32 'IDistroArchSeries',
33 'IDistroArchSeriesFilter',
33 'ILiveFS',34 'ILiveFS',
34 'ILiveFSBuild',35 'ILiveFSBuild',
35 'ILiveFSSet',36 'ILiveFSSet',
@@ -87,6 +88,7 @@ from lp.soyuz.interfaces.binarypackagerelease import (
87 IBinaryPackageReleaseDownloadCount,88 IBinaryPackageReleaseDownloadCount,
88 )89 )
89from lp.soyuz.interfaces.distroarchseries import IDistroArchSeries90from lp.soyuz.interfaces.distroarchseries import IDistroArchSeries
91from lp.soyuz.interfaces.distroarchseriesfilter import IDistroArchSeriesFilter
90from lp.soyuz.interfaces.livefs import (92from lp.soyuz.interfaces.livefs import (
91 ILiveFS,93 ILiveFS,
92 ILiveFSSet,94 ILiveFSSet,

Subscribers

People subscribed via source and target branches

to status/vote changes: