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
1=== modified file 'lib/offspring/web/queuemanager/tests/test_views.py'
2--- lib/offspring/web/queuemanager/tests/test_views.py 2011-10-10 15:01:45 +0000
3+++ lib/offspring/web/queuemanager/tests/test_views.py 2011-10-13 23:08:23 +0000
4@@ -259,6 +259,53 @@
5 self.assertEqual([], list(access_group.members.all()))
6
7
8+class ProjectBuildsViewTests(TestCase, ProjectViewTestsMixin):
9+ view_path = 'offspring.web.queuemanager.views.builds'
10+
11+ def get_expected_page_heading(self, project):
12+ return 'Build Records for %s' % project.title
13+
14+ def test_public_project(self):
15+ project = factory.makeProject(is_private=False)
16+ build = factory.makeBuildResult(project=project)
17+ response = self.client.get(
18+ reverse(self.view_path, args=[project.name]))
19+ self.assertContains(
20+ response, self.get_expected_page_heading(project),
21+ status_code=200, msg_prefix=response.content)
22+
23+
24+class OverallBuildsViewTests(TestCase):
25+ view_path = 'offspring.web.queuemanager.views.builds'
26+
27+ def test_public_builds_are_shown(self):
28+ project = factory.makeProject(is_private=False)
29+ build = factory.makeBuildResult(project=project)
30+ response = self.client.get(reverse(self.view_path))
31+ self.assertContains(
32+ response, build.name, status_code=200, msg_prefix=response.content)
33+
34+ def test_private_builds_are_shown_if_user_has_rights(self):
35+ project = factory.makeProject(is_private=True)
36+ build = factory.makeBuildResult(project=project)
37+ user = project.owner
38+ self.assertTrue(
39+ self.client.login(username=user.username, password=user.username))
40+ response = self.client.get(reverse(self.view_path))
41+ self.assertContains(
42+ response, build.name, status_code=200, msg_prefix=response.content)
43+
44+ def test_private_builds_are_not_shown_if_user_has_no_rights(self):
45+ project = factory.makeProject(is_private=True)
46+ build = factory.makeBuildResult(project=project)
47+ user = factory.makeUser()
48+ self.assertTrue(
49+ self.client.login(username=user.username, password=user.username))
50+ response = self.client.get(reverse(self.view_path))
51+ self.assertNotContains(
52+ response, build.name, status_code=200, msg_prefix=response.content)
53+
54+
55 def make_user_and_login(client):
56 user = factory.makeUser()
57 return client.login(username=user.username, password=user.username)
58
59=== modified file 'lib/offspring/web/queuemanager/views.py'
60--- lib/offspring/web/queuemanager/views.py 2011-10-10 20:40:28 +0000
61+++ lib/offspring/web/queuemanager/views.py 2011-10-13 23:08:23 +0000
62@@ -104,13 +104,15 @@
63 context_instance=RequestContext(request))
64
65 def builds(request, projectName=None):
66+ user = request.user
67+ user_visible_builds = BuildResult.all_objects.accessible_by_user(user)
68 if projectName is not None:
69- p = get_object_or_404(Project, pk=projectName)
70- buildResults_list = BuildResult.objects.filter(
71- project = projectName).order_by("finished_at").reverse()
72+ p = get_possibly_private_object(user, Project, pk=projectName)
73+ buildResults_list = user_visible_builds.filter(
74+ project=projectName).order_by("finished_at").reverse()
75 else:
76 p = None
77- buildResults_list = BuildResult.objects.select_related(
78+ buildResults_list = user_visible_builds.select_related(
79 'builder', 'requestor', 'project').order_by("finished_at").reverse()
80 paginator = Paginator(buildResults_list, 15)
81
82@@ -124,8 +126,12 @@
83 except (EmptyPage, InvalidPage):
84 buildResults = paginator.page(paginator.num_pages)
85
86+ is_private = False
87+ if p is not None and p.is_private:
88+ is_private = True
89 pageData = {
90 'project' : p,
91+ 'is_private' : is_private,
92 'build_results' : buildResults,
93 'pillar' : 'builds'
94 }
95@@ -229,7 +235,9 @@
96 request.user)
97 p = get_possibly_private_object(
98 request.user, user_visible_objects, pk=projectName)
99- project_build_results = BuildResult.objects.filter(
100+ user_visible_builds = BuildResult.all_objects.accessible_by_user(
101+ request.user)
102+ project_build_results = user_visible_builds.filter(
103 project = p).exclude(result = None)
104 build_stats = {
105 'fail_count' : project_build_results.filter(result = ProjectBuildStates.FAILED).count(),

Subscribers

People subscribed via source and target branches