Merge ~lgp171188/launchpad:allow-launchpad-team-to-view-mirror-prober-logs into launchpad:master

Proposed by Guruprasad
Status: Merged
Approved by: Guruprasad
Approved revision: 984cbfa861756b5a2b9477a1a2cd7f5748788e42
Merge reported by: Otto Co-Pilot
Merged at revision: not available
Proposed branch: ~lgp171188/launchpad:allow-launchpad-team-to-view-mirror-prober-logs
Merge into: launchpad:master
Diff against target: 147 lines (+59/-4)
6 files modified
lib/lp/registry/browser/configure.zcml (+1/-1)
lib/lp/registry/browser/distributionmirror.py (+1/-1)
lib/lp/registry/security.py (+11/-0)
lib/lp/registry/stories/distributionmirror/xx-distributionmirror-prober-logs.rst (+26/-1)
lib/lp/registry/templates/distributionmirror-index.pt (+1/-1)
lib/lp/registry/tests/test_distributionmirror.py (+19/-0)
Reviewer Review Type Date Requested Status
Colin Watson (community) Approve
Ioana Lasc (community) Approve
Review via email: mp+434409@code.launchpad.net

Commit message

Allow Launchpad team members to view mirror prober logs

Show the side menu with a link to the prober logs for users
with the 'launchpad.Moderate' permission on a distribution mirror.

To post a comment you must log in.
Revision history for this message
Ioana Lasc (ilasc) wrote :

Looks good!

review: Approve
Revision history for this message
Colin Watson (cjwatson) :
review: Approve
Revision history for this message
Guruprasad (lgp171188) :
Revision history for this message
Guruprasad (lgp171188) :
Revision history for this message
Colin Watson (cjwatson) :

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1diff --git a/lib/lp/registry/browser/configure.zcml b/lib/lp/registry/browser/configure.zcml
2index 80a57d0..22096c8 100644
3--- a/lib/lp/registry/browser/configure.zcml
4+++ b/lib/lp/registry/browser/configure.zcml
5@@ -2598,7 +2598,7 @@
6 name="+prober-logs"
7 for="lp.registry.interfaces.distributionmirror.IDistributionMirror"
8 class="lp.registry.browser.distributionmirror.DistributionMirrorProberLogView"
9- permission="launchpad.Edit"
10+ permission="launchpad.Moderate"
11 template="../templates/distributionmirror-prober-logs.pt">
12 </browser:page>
13 <browser:menus
14diff --git a/lib/lp/registry/browser/distributionmirror.py b/lib/lp/registry/browser/distributionmirror.py
15index 75aa827..262784e 100644
16--- a/lib/lp/registry/browser/distributionmirror.py
17+++ b/lib/lp/registry/browser/distributionmirror.py
18@@ -61,7 +61,7 @@ class DistributionMirrorOverviewMenu(NavigationMenu):
19 text = "Change details"
20 return Link("+edit", text, icon="edit")
21
22- @enabled_with_permission("launchpad.Edit")
23+ @enabled_with_permission("launchpad.Moderate")
24 def proberlogs(self):
25 text = "Prober logs"
26 enabled = self.context.last_probe_record is not None
27diff --git a/lib/lp/registry/security.py b/lib/lp/registry/security.py
28index 0487001..97e7643 100644
29--- a/lib/lp/registry/security.py
30+++ b/lib/lp/registry/security.py
31@@ -385,6 +385,17 @@ class EditDistributionMirrorByOwnerOrDistroOwnerOrMirrorAdminsOrAdmins(
32 )
33
34
35+class ModerateDistributionMirror(AuthorizationBase):
36+ permission = "launchpad.Moderate"
37+ usedfor = IDistributionMirror
38+
39+ def checkAuthenticated(self, user):
40+ return (
41+ self.forwardCheckAuthenticated(user, self.obj, "launchpad.Edit")
42+ or user.in_launchpad_developers
43+ )
44+
45+
46 class ViewDistributionMirror(AnonymousAuthorization):
47 """Anyone can view an IDistributionMirror."""
48
49diff --git a/lib/lp/registry/stories/distributionmirror/xx-distributionmirror-prober-logs.rst b/lib/lp/registry/stories/distributionmirror/xx-distributionmirror-prober-logs.rst
50index 8b9ae98..581bb7f 100644
51--- a/lib/lp/registry/stories/distributionmirror/xx-distributionmirror-prober-logs.rst
52+++ b/lib/lp/registry/stories/distributionmirror/xx-distributionmirror-prober-logs.rst
53@@ -3,7 +3,7 @@ Distribution mirror prober logs
54
55 Every time we probe a mirror for its contents we keep a log of the probe.
56 All these logs can be seen by the mirror owner or the mirror admin of
57-that mirror's distribution.
58+that mirror's distribution or Launchpad team members.
59
60 >>> browser.addHeader("Authorization", "Basic mark@example.com:test")
61 >>> browser.open("http://launchpad.test/ubuntu/+mirror/archive-mirror2/")
62@@ -18,6 +18,31 @@ that mirror's distribution.
63 >>> print(extract_text(navigation.decode_contents()))
64 1...→...1...of...1...result
65
66+ >>> login("admin@canonical.com")
67+ >>> from zope.component import getUtility
68+ >>> from lp.app.interfaces.launchpad import ILaunchpadCelebrities
69+ >>> launchpad_developer = factory.makePerson(
70+ ... member_of=[getUtility(ILaunchpadCelebrities).launchpad_developers]
71+ ... )
72+ >>> from lp.testing import logout
73+ >>> logout()
74+
75+ >>> from lp.testing.pages import setupBrowserForUser
76+ >>> lp_dev_browser = setupBrowserForUser(launchpad_developer)
77+ >>> lp_dev_browser.open(
78+ ... "http://launchpad.test/ubuntu/+mirror/archive-mirror2/"
79+ ... )
80+ >>> lp_dev_browser.getLink("Prober logs").click()
81+ >>> lp_dev_browser.url
82+ 'http://launchpad.test/ubuntu/+mirror/archive-mirror2/+prober-logs'
83+
84+ >>> navigation = find_tags_by_class(
85+ ... lp_dev_browser.contents, "batch-navigation-index"
86+ ... )[0]
87+ >>> print(extract_text(navigation.decode_contents()))
88+ 1...→...1...of...1...result
89+
90+
91 A random logged in user won't have the rights to see that page.
92
93 >>> user_browser.open(
94diff --git a/lib/lp/registry/templates/distributionmirror-index.pt b/lib/lp/registry/templates/distributionmirror-index.pt
95index 3d840d0..2e7cbec 100644
96--- a/lib/lp/registry/templates/distributionmirror-index.pt
97+++ b/lib/lp/registry/templates/distributionmirror-index.pt
98@@ -157,7 +157,7 @@
99 </div>
100 </tal:main>
101
102- <tal:side metal:fill-slot="side" condition="context/required:launchpad.Edit">
103+ <tal:side metal:fill-slot="side" condition="context/required:launchpad.Moderate">
104 <tal:menu replace="structure context/@@+global-actions" />
105 </tal:side>
106 </body>
107diff --git a/lib/lp/registry/tests/test_distributionmirror.py b/lib/lp/registry/tests/test_distributionmirror.py
108index 4e301c5..7d6a2ee 100644
109--- a/lib/lp/registry/tests/test_distributionmirror.py
110+++ b/lib/lp/registry/tests/test_distributionmirror.py
111@@ -18,11 +18,14 @@ from lp.registry.interfaces.person import IPersonSet
112 from lp.registry.interfaces.pocket import PackagePublishingPocket
113 from lp.services.database.sqlbase import flush_database_updates
114 from lp.services.mail import stub
115+from lp.services.webapp.authorization import check_permission
116 from lp.services.webapp.interfaces import OAuthPermission
117 from lp.services.worlddata.interfaces.country import ICountrySet
118 from lp.testing import (
119 TestCaseWithFactory,
120+ admin_logged_in,
121 api_url,
122+ celebrity_logged_in,
123 login,
124 login_as,
125 person_logged_in,
126@@ -57,6 +60,22 @@ class TestDistributionMirror(TestCaseWithFactory):
127 )
128 removeSecurityProxy(bin_mirror).freshness = freshness
129
130+ def test_distributionmirror_moderate_permission(self):
131+ with admin_logged_in():
132+ self.assertTrue(
133+ check_permission("launchpad.Moderate", self.archive_mirror)
134+ )
135+
136+ with person_logged_in(self.archive_mirror.distribution.owner):
137+ self.assertTrue(
138+ check_permission("launchpad.Moderate", self.archive_mirror)
139+ )
140+
141+ with celebrity_logged_in("launchpad_developers"):
142+ self.assertTrue(
143+ check_permission("launchpad.Moderate", self.archive_mirror)
144+ )
145+
146 def test_archive_mirror_without_content_should_be_disabled(self):
147 self.assertTrue(self.archive_mirror.shouldDisable())
148

Subscribers

People subscribed via source and target branches

to status/vote changes: