Merge lp:~cjwatson/launchpad/livefs-minimal-privacy into lp:launchpad

Proposed by Colin Watson
Status: Merged
Merged at revision: 19033
Proposed branch: lp:~cjwatson/launchpad/livefs-minimal-privacy
Merge into: lp:launchpad
Diff against target: 196 lines (+46/-9)
6 files modified
lib/lp/soyuz/interfaces/livefs.py (+2/-1)
lib/lp/soyuz/interfaces/livefsbuild.py (+3/-2)
lib/lp/soyuz/model/livefs.py (+7/-0)
lib/lp/soyuz/model/livefsbuild.py (+3/-1)
lib/lp/soyuz/tests/test_livefs.py (+21/-2)
lib/lp/soyuz/tests/test_livefsbuild.py (+10/-3)
To merge this branch: bzr merge lp:~cjwatson/launchpad/livefs-minimal-privacy
Reviewer Review Type Date Requested Status
William Grant code Approve
Review via email: mp+370759@code.launchpad.net

Commit message

Make LiveFS and LiveFSBuild implement IPrivacy, so that the privacy banner works.

To post a comment you must log in.
Revision history for this message
William Grant (wgrant) wrote :

This isn't quite accurate, since the files' privacy doesn't follow the owner's, but that's rare enough that it probably doesn't matter.

review: Approve (code)

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/lp/soyuz/interfaces/livefs.py'
--- lib/lp/soyuz/interfaces/livefs.py 2019-06-12 10:59:25 +0000
+++ lib/lp/soyuz/interfaces/livefs.py 2019-07-30 10:36:05 +0000
@@ -59,6 +59,7 @@
5959
60from lp import _60from lp import _
61from lp.app.errors import NameLookupFailed61from lp.app.errors import NameLookupFailed
62from lp.app.interfaces.launchpad import IPrivacy
62from lp.app.validators.name import name_validator63from lp.app.validators.name import name_validator
63from lp.registry.interfaces.distroseries import IDistroSeries64from lp.registry.interfaces.distroseries import IDistroSeries
64from lp.registry.interfaces.person import IPerson65from lp.registry.interfaces.person import IPerson
@@ -139,7 +140,7 @@
139 """This live filesystem cannot be deleted."""140 """This live filesystem cannot be deleted."""
140141
141142
142class ILiveFSView(Interface):143class ILiveFSView(IPrivacy):
143 """`ILiveFS` attributes that require launchpad.View permission."""144 """`ILiveFS` attributes that require launchpad.View permission."""
144145
145 id = exported(Int(title=_("ID"), required=True, readonly=True))146 id = exported(Int(title=_("ID"), required=True, readonly=True))
146147
=== modified file 'lib/lp/soyuz/interfaces/livefsbuild.py'
--- lib/lp/soyuz/interfaces/livefsbuild.py 2015-09-15 20:16:47 +0000
+++ lib/lp/soyuz/interfaces/livefsbuild.py 2019-07-30 10:36:05 +0000
@@ -1,4 +1,4 @@
1# Copyright 2014-2015 Canonical Ltd. This software is licensed under the1# Copyright 2014-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"""Live filesystem build interfaces."""4"""Live filesystem build interfaces."""
@@ -30,6 +30,7 @@
30 )30 )
3131
32from lp import _32from lp import _
33from lp.app.interfaces.launchpad import IPrivacy
33from lp.buildmaster.interfaces.buildfarmjob import ISpecificBuildFarmJobSource34from lp.buildmaster.interfaces.buildfarmjob import ISpecificBuildFarmJobSource
34from lp.buildmaster.interfaces.packagebuild import IPackageBuild35from lp.buildmaster.interfaces.packagebuild import IPackageBuild
35from lp.registry.interfaces.person import IPerson36from lp.registry.interfaces.person import IPerson
@@ -54,7 +55,7 @@
54 required=True, readonly=True)55 required=True, readonly=True)
5556
5657
57class ILiveFSBuildView(IPackageBuild):58class ILiveFSBuildView(IPackageBuild, IPrivacy):
58 """`ILiveFSBuild` attributes that require launchpad.View permission."""59 """`ILiveFSBuild` attributes that require launchpad.View permission."""
5960
60 requester = exported(Reference(61 requester = exported(Reference(
6162
=== modified file 'lib/lp/soyuz/model/livefs.py'
--- lib/lp/soyuz/model/livefs.py 2019-06-12 10:59:25 +0000
+++ lib/lp/soyuz/model/livefs.py 2019-07-30 10:36:05 +0000
@@ -139,6 +139,13 @@
139 self.keep_binary_files_days = keep_binary_files_days139 self.keep_binary_files_days = keep_binary_files_days
140140
141 @property141 @property
142 def private(self):
143 """See `IPrivacy`."""
144 # A LiveFS has no privacy support of its own, but it is private if
145 # its owner is.
146 return self.owner.private
147
148 @property
142 def keep_binary_files_days(self):149 def keep_binary_files_days(self):
143 """See `ILiveFS`."""150 """See `ILiveFS`."""
144 # Rounding up preserves the "at least this many days" part of the151 # Rounding up preserves the "at least this many days" part of the
145152
=== modified file 'lib/lp/soyuz/model/livefsbuild.py'
--- lib/lp/soyuz/model/livefsbuild.py 2017-07-18 16:22:03 +0000
+++ lib/lp/soyuz/model/livefsbuild.py 2019-07-30 10:36:05 +0000
@@ -1,4 +1,4 @@
1# Copyright 2014-2017 Canonical Ltd. This software is licensed under the1# Copyright 2014-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
@@ -171,6 +171,8 @@
171 """See `IBuildFarmJob`."""171 """See `IBuildFarmJob`."""
172 return self.livefs.owner.private or self.archive.private172 return self.livefs.owner.private or self.archive.private
173173
174 private = is_private
175
174 @property176 @property
175 def title(self):177 def title(self):
176 das = self.distro_arch_series178 das = self.distro_arch_series
177179
=== modified file 'lib/lp/soyuz/tests/test_livefs.py'
--- lib/lp/soyuz/tests/test_livefs.py 2019-06-12 10:59:25 +0000
+++ lib/lp/soyuz/tests/test_livefs.py 2019-07-30 10:36:05 +0000
@@ -20,6 +20,7 @@
20from zope.security.interfaces import Unauthorized20from zope.security.interfaces import Unauthorized
21from zope.security.proxy import removeSecurityProxy21from zope.security.proxy import removeSecurityProxy
2222
23from lp.app.interfaces.launchpad import IPrivacy
23from lp.buildmaster.enums import (24from lp.buildmaster.enums import (
24 BuildQueueStatus,25 BuildQueueStatus,
25 BuildStatus,26 BuildStatus,
@@ -85,10 +86,11 @@
85 self.useFixture(FeatureFixture({LIVEFS_FEATURE_FLAG: "on"}))86 self.useFixture(FeatureFixture({LIVEFS_FEATURE_FLAG: "on"}))
8687
87 def test_implements_interfaces(self):88 def test_implements_interfaces(self):
88 # LiveFS implements ILiveFS.89 # LiveFS implements ILiveFS and IPrivacy.
89 livefs = self.factory.makeLiveFS()90 livefs = self.factory.makeLiveFS()
90 with person_logged_in(livefs.owner):91 with person_logged_in(livefs.owner):
91 self.assertProvides(livefs, ILiveFS)92 self.assertProvides(livefs, ILiveFS)
93 self.assertProvides(livefs, IPrivacy)
9294
93 def test_avoids_problematic_snapshots(self):95 def test_avoids_problematic_snapshots(self):
94 self.assertThat(96 self.assertThat(
@@ -112,6 +114,20 @@
112 self.assertSqlAttributeEqualsDate(114 self.assertSqlAttributeEqualsDate(
113 livefs, "date_last_modified", UTC_NOW)115 livefs, "date_last_modified", UTC_NOW)
114116
117 def test_private_owner(self):
118 # A LiveFS is private if its owner is.
119 person = self.factory.makePerson()
120 team = self.factory.makeTeam(
121 owner=person, visibility=PersonVisibility.PRIVATE)
122 with person_logged_in(person):
123 livefs = self.factory.makeLiveFS(registrant=person, owner=team)
124 self.assertTrue(livefs.private)
125
126 def test_public(self):
127 # A LiveFS is public if its owner is.
128 livefs = self.factory.makeLiveFS()
129 self.assertFalse(livefs.private)
130
115 def test_relative_build_score(self):131 def test_relative_build_score(self):
116 # Buildd admins can change the relative build score of a LiveFS, but132 # Buildd admins can change the relative build score of a LiveFS, but
117 # ordinary users cannot.133 # ordinary users cannot.
@@ -665,7 +681,10 @@
665 private=True)681 private=True)
666 archive_url = api_url(archive)682 archive_url = api_url(archive)
667 livefs, _ = self.makeLiveFS(distroseries=distroseries)683 livefs, _ = self.makeLiveFS(distroseries=distroseries)
668 response = self.webservice.named_post(684 private_webservice = webservice_for_person(
685 self.person, permission=OAuthPermission.WRITE_PRIVATE)
686 private_webservice.default_api_version = "devel"
687 response = private_webservice.named_post(
669 livefs["self_link"], "requestBuild", archive=archive_url,688 livefs["self_link"], "requestBuild", archive=archive_url,
670 distro_arch_series=distroarchseries_url, pocket="Release")689 distro_arch_series=distroarchseries_url, pocket="Release")
671 self.assertEqual(201, response.status)690 self.assertEqual(201, response.status)
672691
=== modified file 'lib/lp/soyuz/tests/test_livefsbuild.py'
--- lib/lp/soyuz/tests/test_livefsbuild.py 2019-05-22 14:57:45 +0000
+++ lib/lp/soyuz/tests/test_livefsbuild.py 2019-07-30 10:36:05 +0000
@@ -1,4 +1,4 @@
1# Copyright 2014-2018 Canonical Ltd. This software is licensed under the1# Copyright 2014-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"""Test live filesystem build features."""4"""Test live filesystem build features."""
@@ -21,7 +21,10 @@
21from zope.security.proxy import removeSecurityProxy21from zope.security.proxy import removeSecurityProxy
2222
23from lp.app.errors import NotFoundError23from lp.app.errors import NotFoundError
24from lp.app.interfaces.launchpad import ILaunchpadCelebrities24from lp.app.interfaces.launchpad import (
25 ILaunchpadCelebrities,
26 IPrivacy,
27 )
25from lp.buildmaster.enums import BuildStatus28from lp.buildmaster.enums import BuildStatus
26from lp.buildmaster.interfaces.buildqueue import IBuildQueue29from lp.buildmaster.interfaces.buildqueue import IBuildQueue
27from lp.buildmaster.interfaces.packagebuild import IPackageBuild30from lp.buildmaster.interfaces.packagebuild import IPackageBuild
@@ -96,9 +99,10 @@
96 self.build = self.factory.makeLiveFSBuild()99 self.build = self.factory.makeLiveFSBuild()
97100
98 def test_implements_interfaces(self):101 def test_implements_interfaces(self):
99 # LiveFSBuild implements IPackageBuild and ILiveFSBuild.102 # LiveFSBuild implements IPackageBuild, ILiveFSBuild, and IPrivacy.
100 self.assertProvides(self.build, IPackageBuild)103 self.assertProvides(self.build, IPackageBuild)
101 self.assertProvides(self.build, ILiveFSBuild)104 self.assertProvides(self.build, ILiveFSBuild)
105 self.assertProvides(self.build, IPrivacy)
102106
103 def test_queueBuild(self):107 def test_queueBuild(self):
104 # LiveFSBuild can create the queue entry for itself.108 # LiveFSBuild can create the queue entry for itself.
@@ -127,16 +131,19 @@
127 def test_is_private(self):131 def test_is_private(self):
128 # A LiveFSBuild is private iff its LiveFS and archive are.132 # A LiveFSBuild is private iff its LiveFS and archive are.
129 self.assertFalse(self.build.is_private)133 self.assertFalse(self.build.is_private)
134 self.assertFalse(self.build.private)
130 private_team = self.factory.makeTeam(135 private_team = self.factory.makeTeam(
131 visibility=PersonVisibility.PRIVATE)136 visibility=PersonVisibility.PRIVATE)
132 with person_logged_in(private_team.teamowner):137 with person_logged_in(private_team.teamowner):
133 build = self.factory.makeLiveFSBuild(138 build = self.factory.makeLiveFSBuild(
134 requester=private_team.teamowner, owner=private_team)139 requester=private_team.teamowner, owner=private_team)
135 self.assertTrue(build.is_private)140 self.assertTrue(build.is_private)
141 self.assertTrue(build.private)
136 private_archive = self.factory.makeArchive(private=True)142 private_archive = self.factory.makeArchive(private=True)
137 with person_logged_in(private_archive.owner):143 with person_logged_in(private_archive.owner):
138 build = self.factory.makeLiveFSBuild(archive=private_archive)144 build = self.factory.makeLiveFSBuild(archive=private_archive)
139 self.assertTrue(build.is_private)145 self.assertTrue(build.is_private)
146 self.assertTrue(build.private)
140147
141 def test_can_be_cancelled(self):148 def test_can_be_cancelled(self):
142 # For all states that can be cancelled, can_be_cancelled returns True.149 # For all states that can be cancelled, can_be_cancelled returns True.