Merge lp:~cjohnston/qa-dashboard/smokeng-url-part2 into lp:qa-dashboard

Proposed by Chris Johnston
Status: Merged
Approved by: Chris Johnston
Approved revision: 607
Merged at revision: 611
Proposed branch: lp:~cjohnston/qa-dashboard/smokeng-url-part2
Merge into: lp:qa-dashboard
Diff against target: 383 lines (+179/-23)
4 files modified
smokeng/tables.py (+18/-3)
smokeng/tests.py (+124/-10)
smokeng/urls.py (+9/-4)
smokeng/views.py (+28/-6)
To merge this branch: bzr merge lp:~cjohnston/qa-dashboard/smokeng-url-part2
Reviewer Review Type Date Requested Status
Joe Talbott Approve
PS Jenkins bot continuous-integration Approve
Review via email: mp+188110@code.launchpad.net

Commit message

Add build number and arch to the smokeng urls

Description of the change

Further work to make the smokeng url's understandable by humans

To post a comment you must log in.
Revision history for this message
PS Jenkins bot (ps-jenkins) wrote :

PASSED: Continuous integration, rev:607
http://s-jenkins:8080/job/dashboard-ci/179/
Executed test runs:

Click here to trigger a rebuild:
http://s-jenkins:8080/job/dashboard-ci/179/rebuild

review: Approve (continuous-integration)
Revision history for this message
Joe Talbott (joetalbott) wrote :

I might be biased, but that's some of the nicest code I've seen. ;)

review: Approve

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'smokeng/tables.py'
2--- smokeng/tables.py 2013-09-09 13:06:06 +0000
3+++ smokeng/tables.py 2013-09-27 17:06:21 +0000
4@@ -13,10 +13,19 @@
5 # You should have received a copy of the GNU Affero General Public License
6 # along with this program. If not, see <http://www.gnu.org/licenses/>.
7
8+from django.utils.http import urlquote
9+
10 import django_tables2 as tables
11 from django_tables2.utils import Accessor as A
12
13
14+class LinkColumnQuoted(tables.LinkColumn):
15+
16+ def render_link(self, uri, text, attrs=None):
17+ uri = urlquote(uri, safe='/: %')
18+ return super(LinkColumnQuoted, self).render_link(uri, text, attrs)
19+
20+
21 class SmokeBaseTable(tables.Table):
22 class Meta:
23 attrs = {'class': 'basic wide'}
24@@ -77,7 +86,7 @@
25 'arch',
26 ) + SmokeBaseTable.Meta.fields
27
28- build_number = tables.LinkColumn(
29+ build_number = LinkColumnQuoted(
30 'smokeng.views.image_overview',
31 accessor="build_number",
32 order_by=(
33@@ -90,6 +99,8 @@
34 kwargs={
35 "release": A('release'),
36 "variant": A('variant'),
37+ "arch": A('arch'),
38+ "build_number": A('build_number'),
39 "image_id": A('image_id'),
40 }
41 )
42@@ -105,11 +116,13 @@
43 'ran_at',
44 ) + SmokeBaseTable.Meta.fields
45
46- name = tables.LinkColumn(
47+ name = LinkColumnQuoted(
48 "smokeng.views.image_test_results",
49 kwargs={
50 "release": A('image__release'),
51 "variant": A('image__variant'),
52+ "arch": A('image__arch'),
53+ "build_number": A('image__build_number'),
54 "image_id": A('image__id'),
55 "name": A('name'),
56 },
57@@ -132,11 +145,13 @@
58
59
60 class SmokeTestResultTable(tables.Table):
61- command_type = tables.LinkColumn(
62+ command_type = LinkColumnQuoted(
63 "smokeng.views.test_result_detail",
64 kwargs={
65 "release": A('release'),
66 "variant": A('variant'),
67+ "arch": A('arch'),
68+ "build_number": A('build_number'),
69 "image_id": A('image_id'),
70 "name": A('name'),
71 "id": A('id'),
72
73=== modified file 'smokeng/tests.py'
74--- smokeng/tests.py 2013-09-09 13:06:06 +0000
75+++ smokeng/tests.py 2013-09-27 17:06:21 +0000
76@@ -15,6 +15,7 @@
77
78 import datetime
79 import mock
80+import urllib2
81
82 from django.core.urlresolvers import reverse
83 from django.test import TestCase
84@@ -130,16 +131,51 @@
85
86 self._test_url("{}?sort=bugs".format(url))
87
88- def test_image(self):
89-
90- url = reverse(
91- 'smokeng_image_overview',
92- args=(
93- self.image.release,
94- self.image.variant,
95- self.image.id,
96- ),
97- )
98+ def test_image_overview_url(self):
99+
100+ url = reverse(
101+ 'smokeng_image_overview',
102+ args=(
103+ self.image.release,
104+ self.image.variant,
105+ self.image.arch,
106+ self.image.build_number,
107+ self.image.id,
108+ ),
109+ )
110+ self._test_url(url)
111+
112+ def test_image_overview_touch_ro_url(self):
113+ self.image.build_number = '56:20130920:20130920'
114+ self.image.save()
115+ url = reverse(
116+ 'smokeng_image_overview',
117+ args=(
118+ self.image.release,
119+ self.image.variant,
120+ self.image.arch,
121+ self.image.build_number,
122+ self.image.id,
123+ ),
124+ )
125+ self._test_url(url)
126+
127+ def test_image_overview_unknown_build_number_url(self):
128+ self.image.build_number = '20130920 ?'
129+ self.image.save()
130+ url = reverse(
131+ 'smokeng_image_overview',
132+ args=(
133+ self.image.release,
134+ self.image.variant,
135+ self.image.arch,
136+ self.image.build_number,
137+ self.image.id,
138+ ),
139+ )
140+
141+ # URL quote the url due to the '?'
142+ url = urllib2.quote(url)
143 self._test_url(url)
144
145 def test_image_bug_sorting(self):
146@@ -149,6 +185,8 @@
147 args=(
148 self.image.release,
149 self.image.variant,
150+ self.image.arch,
151+ self.image.build_number,
152 self.image.id,
153 ),
154 )
155@@ -161,6 +199,8 @@
156 args=(
157 self.image.release,
158 self.image.variant,
159+ self.image.arch,
160+ self.image.build_number,
161 self.image.id,
162 self.result.name,
163 ),
164@@ -168,12 +208,49 @@
165 response = self._test_url(url)
166 self.assertTemplateUsed(response, 'smokeng/test_results.html')
167
168+ def test_image_test_results_touch_ro_url(self):
169+ self.image.build_number = '56:20130920:20130920'
170+ self.image.save()
171+ url = reverse(
172+ 'smokeng_image_test_results',
173+ args=(
174+ self.image.release,
175+ self.image.variant,
176+ self.image.arch,
177+ self.image.build_number,
178+ self.image.id,
179+ self.result.name,
180+ ),
181+ )
182+ self._test_url(url)
183+
184+ def test_image_test_results_unknown_build_number_url(self):
185+ self.image.build_number = '20130920 ?'
186+ self.image.save()
187+ url = reverse(
188+ 'smokeng_image_test_results',
189+ args=(
190+ self.image.release,
191+ self.image.variant,
192+ self.image.arch,
193+ self.image.build_number,
194+ self.image.id,
195+ self.result.name,
196+ ),
197+ )
198+
199+ # URL quote the url due to the '?'
200+ url = urllib2.quote(url)
201+ self._test_url(url)
202+
203 def test_test_result_detail_url(self):
204 url = reverse(
205 'smokeng_test_result_detail',
206 args=(
207 self.image.release,
208 self.image.variant,
209+ self.image.arch,
210+ self.image.build_number,
211 self.image.id,
212 self.result.name,
213 self.testcaseresult.pk,
214@@ -182,6 +259,43 @@
215 response = self._test_url(url)
216 self.assertTemplateUsed(response, 'smokeng/test_result_detail.html')
217
218+ def test_image_test_result_detail_touch_ro_url(self):
219+ self.image.build_number = '56:20130920:20130920'
220+ self.image.save()
221+ url = reverse(
222+ 'smokeng_test_result_detail',
223+ args=(
224+ self.image.release,
225+ self.image.variant,
226+ self.image.arch,
227+ self.image.build_number,
228+ self.image.id,
229+ self.result.name,
230+ self.testcaseresult.pk,
231+ ),
232+ )
233+ self._test_url(url)
234+
235+ def test_image_test_result_detail_unknown_build_number_url(self):
236+ self.image.build_number = '20130920 ?'
237+ self.image.save()
238+ url = reverse(
239+ 'smokeng_test_result_detail',
240+ args=(
241+ self.image.release,
242+ self.image.variant,
243+ self.image.arch,
244+ self.image.build_number,
245+ self.image.id,
246+ self.result.name,
247+ self.testcaseresult.pk,
248+ ),
249+ )
250+
251+ # URL quote the url due to the '?'
252+ url = urllib2.quote(url)
253+ self._test_url(url)
254+
255
256 class TestSmoke(TestCase):
257 """ Tests for the smoke models. """
258
259=== modified file 'smokeng/urls.py'
260--- smokeng/urls.py 2013-09-09 13:06:06 +0000
261+++ smokeng/urls.py 2013-09-27 17:06:21 +0000
262@@ -26,18 +26,23 @@
263 name='smokeng_overview',
264 ),
265 url(
266- r'^(?P<release>\w+)/(?P<variant>\w+)/(?P<image_id>\d+)/$',
267+ r'^(?P<release>\w+)/(?P<variant>\w+)/(?P<arch>\w+)'
268+ '/(?P<build_number>(\d+:\d+(\.\d+|):\d+(\.\d+|)|\d+(\.\d+|( |%20)\?|)))'
269+ '/(?P<image_id>\d+)/$',
270 'image_overview',
271 name='smokeng_image_overview',
272 ),
273 url(
274- r'^(?P<release>\w+)/(?P<variant>\w+)/(?P<image_id>\d+)/(?P<name>.*)'
275- '/(?P<id>\d+)/$',
276+ r'^(?P<release>\w+)/(?P<variant>\w+)/(?P<arch>\w+)'
277+ '/(?P<build_number>(\d+:\d+(\.\d+|):\d+(\.\d+|)|\d+(\.\d+|( |%20)\?|)))'
278+ '/(?P<image_id>\d+)/(?P<name>.*)/(?P<id>\d+)/$',
279 'test_result_detail',
280 name='smokeng_test_result_detail',
281 ),
282 url(
283- r'^(?P<release>\w+)/(?P<variant>\w+)/(?P<image_id>\d+)/(?P<name>.*)/$',
284+ r'^(?P<release>\w+)/(?P<variant>\w+)/(?P<arch>\w+)'
285+ '/(?P<build_number>(\d+:\d+(\.\d+|):\d+(\.\d+|)|\d+(\.\d+|( |%20)\?|)))'
286+ '/(?P<image_id>\d+)/(?P<name>.*)/$',
287 'image_test_results',
288 name='smokeng_image_test_results',
289 ),
290
291=== modified file 'smokeng/views.py'
292--- smokeng/views.py 2013-09-09 13:06:06 +0000
293+++ smokeng/views.py 2013-09-27 17:06:21 +0000
294@@ -262,10 +262,10 @@
295 @BreadCrumb(
296 "Image {build_number}",
297 parent=overview,
298- needs=['release', 'variant', 'image_id'],
299+ needs=['release', 'variant', 'arch', 'build_number', 'image_id'],
300 )
301 @require_GET
302-def image_overview(request, release, variant, image_id):
303+def image_overview(request, release, variant, arch, build_number, image_id):
304
305 image = get_object_or_404(SmokeImage, id=image_id)
306 summary, bug_data = image.summary
307@@ -284,6 +284,7 @@
308 image_overview,
309 release=release,
310 variant=variant,
311+ arch=arch,
312 image_id=image_id,
313 build_number=image.build_number,
314 ),
315@@ -298,10 +299,18 @@
316 @BreadCrumb(
317 "{name}",
318 parent=image_overview,
319- needs=['release', 'variant', 'image_id', 'name'],
320+ needs=['release', 'variant', 'arch', 'build_number', 'image_id', 'name'],
321 )
322 @require_GET
323-def image_test_results(request, release, variant, image_id, name):
324+def image_test_results(
325+ request,
326+ release,
327+ variant,
328+ arch,
329+ build_number,
330+ image_id,
331+ name,
332+):
333
334 image = get_object_or_404(SmokeImage, id=image_id)
335 result = get_object_or_404(
336@@ -335,7 +344,9 @@
337 test_data = dict(
338 release=release,
339 name=name,
340+ arch=arch,
341 variant=variant,
342+ build_number=build_number,
343 testcase=test.testcase,
344 url_name=os.path.basename(test.testcase),
345 testsuite=os.path.basename(test.testsuite),
346@@ -364,6 +375,7 @@
347 image_test_results,
348 release=release,
349 variant=variant,
350+ arch=arch,
351 image_id=image_id,
352 name=name,
353 build_number=image.build_number,
354@@ -379,10 +391,19 @@
355 @BreadCrumb(
356 "Testcase details",
357 parent=image_test_results,
358- needs=['release', 'variant', 'image_id', 'name', 'id'],
359+ needs=['release', 'variant', 'arch', 'build_number', 'image_id', 'name', 'id'],
360 )
361 @require_GET
362-def test_result_detail(request, release, variant, image_id, name, id):
363+def test_result_detail(
364+ request,
365+ release,
366+ variant,
367+ arch,
368+ build_number,
369+ image_id,
370+ name,
371+ id,
372+):
373 test = get_object_or_404(
374 SmokeTestResult,
375 pk=id,
376@@ -421,6 +442,7 @@
377 test_result_detail,
378 release=release,
379 variant=variant,
380+ arch=arch,
381 image_id=image_id,
382 name=name,
383 id=id,

Subscribers

People subscribed via source and target branches