Merge lp:~salgado/offspring/build-lists into lp:~linaro-automation/offspring/private-builds

Proposed by Guilherme Salgado
Status: Merged
Approved by: James Tunnicliffe
Approved revision: 80
Merged at revision: 60
Proposed branch: lp:~salgado/offspring/build-lists
Merge into: lp:~linaro-automation/offspring/private-builds
Diff against target: 105 lines (+60/-5)
2 files modified
lib/offspring/web/queuemanager/tests/test_views.py (+47/-0)
lib/offspring/web/queuemanager/views.py (+13/-5)
To merge this branch: bzr merge lp:~salgado/offspring/build-lists
Reviewer Review Type Date Requested Status
James Tunnicliffe (community) Approve
Review via email: mp+79348@code.launchpad.net

Description of the change

This branch changes the builds() view to be privacy aware, so that private builds are shown if the user is allowed to see them. It also adds the padlock icon to the project builds view (/builds/<projectname>), when the project is private.

To post a comment you must log in.
Revision history for this message
James Tunnicliffe (dooferlad) wrote :

Looks good.

review: Approve
Revision history for this message
Guilherme Salgado (salgado) wrote :

Thanks for the review, James

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
=== modified file 'lib/offspring/web/queuemanager/tests/test_views.py'
--- lib/offspring/web/queuemanager/tests/test_views.py 2011-10-10 15:01:45 +0000
+++ lib/offspring/web/queuemanager/tests/test_views.py 2011-10-13 23:08:23 +0000
@@ -259,6 +259,53 @@
259 self.assertEqual([], list(access_group.members.all()))259 self.assertEqual([], list(access_group.members.all()))
260260
261261
262class ProjectBuildsViewTests(TestCase, ProjectViewTestsMixin):
263 view_path = 'offspring.web.queuemanager.views.builds'
264
265 def get_expected_page_heading(self, project):
266 return 'Build Records for %s' % project.title
267
268 def test_public_project(self):
269 project = factory.makeProject(is_private=False)
270 build = factory.makeBuildResult(project=project)
271 response = self.client.get(
272 reverse(self.view_path, args=[project.name]))
273 self.assertContains(
274 response, self.get_expected_page_heading(project),
275 status_code=200, msg_prefix=response.content)
276
277
278class OverallBuildsViewTests(TestCase):
279 view_path = 'offspring.web.queuemanager.views.builds'
280
281 def test_public_builds_are_shown(self):
282 project = factory.makeProject(is_private=False)
283 build = factory.makeBuildResult(project=project)
284 response = self.client.get(reverse(self.view_path))
285 self.assertContains(
286 response, build.name, status_code=200, msg_prefix=response.content)
287
288 def test_private_builds_are_shown_if_user_has_rights(self):
289 project = factory.makeProject(is_private=True)
290 build = factory.makeBuildResult(project=project)
291 user = project.owner
292 self.assertTrue(
293 self.client.login(username=user.username, password=user.username))
294 response = self.client.get(reverse(self.view_path))
295 self.assertContains(
296 response, build.name, status_code=200, msg_prefix=response.content)
297
298 def test_private_builds_are_not_shown_if_user_has_no_rights(self):
299 project = factory.makeProject(is_private=True)
300 build = factory.makeBuildResult(project=project)
301 user = factory.makeUser()
302 self.assertTrue(
303 self.client.login(username=user.username, password=user.username))
304 response = self.client.get(reverse(self.view_path))
305 self.assertNotContains(
306 response, build.name, status_code=200, msg_prefix=response.content)
307
308
262def make_user_and_login(client):309def make_user_and_login(client):
263 user = factory.makeUser()310 user = factory.makeUser()
264 return client.login(username=user.username, password=user.username)311 return client.login(username=user.username, password=user.username)
265312
=== modified file 'lib/offspring/web/queuemanager/views.py'
--- lib/offspring/web/queuemanager/views.py 2011-10-10 20:40:28 +0000
+++ lib/offspring/web/queuemanager/views.py 2011-10-13 23:08:23 +0000
@@ -104,13 +104,15 @@
104 context_instance=RequestContext(request))104 context_instance=RequestContext(request))
105105
106def builds(request, projectName=None):106def builds(request, projectName=None):
107 user = request.user
108 user_visible_builds = BuildResult.all_objects.accessible_by_user(user)
107 if projectName is not None:109 if projectName is not None:
108 p = get_object_or_404(Project, pk=projectName)110 p = get_possibly_private_object(user, Project, pk=projectName)
109 buildResults_list = BuildResult.objects.filter(111 buildResults_list = user_visible_builds.filter(
110 project = projectName).order_by("finished_at").reverse()112 project=projectName).order_by("finished_at").reverse()
111 else:113 else:
112 p = None114 p = None
113 buildResults_list = BuildResult.objects.select_related(115 buildResults_list = user_visible_builds.select_related(
114 'builder', 'requestor', 'project').order_by("finished_at").reverse()116 'builder', 'requestor', 'project').order_by("finished_at").reverse()
115 paginator = Paginator(buildResults_list, 15)117 paginator = Paginator(buildResults_list, 15)
116118
@@ -124,8 +126,12 @@
124 except (EmptyPage, InvalidPage):126 except (EmptyPage, InvalidPage):
125 buildResults = paginator.page(paginator.num_pages)127 buildResults = paginator.page(paginator.num_pages)
126128
129 is_private = False
130 if p is not None and p.is_private:
131 is_private = True
127 pageData = { 132 pageData = {
128 'project' : p, 133 'project' : p,
134 'is_private' : is_private,
129 'build_results' : buildResults,135 'build_results' : buildResults,
130 'pillar' : 'builds' 136 'pillar' : 'builds'
131 }137 }
@@ -229,7 +235,9 @@
229 request.user)235 request.user)
230 p = get_possibly_private_object(236 p = get_possibly_private_object(
231 request.user, user_visible_objects, pk=projectName)237 request.user, user_visible_objects, pk=projectName)
232 project_build_results = BuildResult.objects.filter(238 user_visible_builds = BuildResult.all_objects.accessible_by_user(
239 request.user)
240 project_build_results = user_visible_builds.filter(
233 project = p).exclude(result = None)241 project = p).exclude(result = None)
234 build_stats = { 242 build_stats = {
235 'fail_count' : project_build_results.filter(result = ProjectBuildStates.FAILED).count(),243 'fail_count' : project_build_results.filter(result = ProjectBuildStates.FAILED).count(),

Subscribers

People subscribed via source and target branches