Merge lp:~toykeeper/qlbr/support-extras into lp:qlbr

Proposed by Selene ToyKeeper
Status: Needs review
Proposed branch: lp:~toykeeper/qlbr/support-extras
Merge into: lp:qlbr
Diff against target: 518 lines (+306/-42)
9 files modified
README (+1/-1)
qlbr/__init__.py (+15/-0)
qlbr/local_settings_example.py (+2/-0)
qlbr/management/commands/__init__.py (+9/-4)
qlbr/management/commands/get_task_data.py (+2/-15)
qlbr/templates/qlbr/qa-default.html (+79/-14)
qlbr/urls.py (+136/-4)
qlbr/views.py (+25/-4)
searches.json (+37/-0)
To merge this branch: bzr merge lp:~toykeeper/qlbr/support-extras
Reviewer Review Type Date Requested Status
Max Brustkern (community) Approve
Selene ToyKeeper (community) Needs Resubmitting
Allan LeSage Pending
Review via email: mp+207715@code.launchpad.net

Commit message

Lots of updates from the QA sprint:
 - Lots of specific reports added.
 - Added search by multiple statuses, and synced the javascript buttons with report parameters.
 - Made it possible to run authenticated, to see private bugs.
 - Added 'updated' column, simplified date formats.
 - Page title configurable per-report.
 - Gather data from more projects and tags.
 - Minor refactor

Description of the change

Lots of updates from the QA sprint:
 - Lots of specific reports added.
 - Added search by multiple statuses, and synced the javascript buttons with report parameters.
 - Made it possible to run authenticated, to see private bugs.
 - Added 'updated' column, simplified date formats.
 - Page title configurable per-report.
 - Gather data from more projects and tags.
 - Minor refactoring.

To post a comment you must log in.
Revision history for this message
Max Brustkern (nuclearbob) wrote :

Some of the indentation doesn't look uniform on lines 132-165, so if you intentionally changed that, maybe we could clean it up a bit. Not a huge deal, since the page works, and I've got another merge incoming after this that can fix that if needed.

Have you run flake8 on the python sections? Some of the alignment there looks off to me as well, but I may be incorrect.

I'll ask Allan to take a look as well, but this looks generally good to me. I think we may want to re-enable the ability to dynamically show or hide the header, but we can figure that out in the other stuff I'm working on landing.

lp:~toykeeper/qlbr/support-extras updated
65. By Selene ToyKeeper

cleaned up template indentation

Revision history for this message
Selene ToyKeeper (toykeeper) wrote :

Ah, good catch. I was fighting with vim in the template, since it didn't know how to parse the mixed language. Fixed.

I hadn't run flake8 either, but it looks like the changes are primarily because vim is configured according to somewhat different rules than flake8. (indents are always a multiple of 4 spaces, usually 1 indent for functions and classes and control structures but generally 2 for lists and tuples and such) I'll flake-ify it and re-push.

lp:~toykeeper/qlbr/support-extras updated
66. By Selene ToyKeeper

fixed flake8 complaints

Revision history for this message
Selene ToyKeeper (toykeeper) wrote :

Flake'd, and ready to go.

review: Needs Resubmitting
Revision history for this message
Max Brustkern (nuclearbob) wrote :

The template indentation still looks weird to me, but maybe Allan has thoughts on that. The rest of it looks good to me.

review: Approve

Unmerged revisions

66. By Selene ToyKeeper

fixed flake8 complaints

65. By Selene ToyKeeper

cleaned up template indentation

64. By Selene ToyKeeper

Added report for elopio's bugs. Made qa-untriaged only include qa-touch bugs.

63. By Selene ToyKeeper

Added/fixed a bunch of reports:
  + tagged with qa-touch
  + recently-created qa-touch bugs
  + recently-closed qa-touch bugs
  + recently-active qa-touch bugs
  + fixed qa-touch bugs which haven't landed for 2+ weeks
  + fixed support bugs which haven't landed for 2+ weeks
  + all bugs
  + critical bugs which aren't assigned to anyone
  * fixed support "new bugs" to include already-fixed ones
  * recently-closed support bugs instead of all closed support bugs

62. By Selene ToyKeeper

Added 'Updated' column to main view. Simplified date formats.

61. By Selene ToyKeeper

Moved LP task status list into one place, ish.
Made template status checkboxes updated based on report parameters.
Added a way to search by multiple statuses (OR, not AND).
Added 'new', 'closed', 'updated', 'needs attention' support reports.
Improved results for support 'untriaged' report (now includes 'confirmed').
Made terminal-state bugs show up in reports where they should be seen.

60. By Selene ToyKeeper

Added quick links for defined reports.
Added report for un-triaged support bugs.

59. By Selene ToyKeeper

Added some simple support-related reports.
Made the page title configurable per URL pattern.

58. By Selene ToyKeeper

added u1-support search

57. By Selene ToyKeeper

Added LP_ANON setting, in case you want to access private bugs.

Preview Diff

[H/L] Next/Prev Comment, [J/K] Next/Prev File, [N/P] Next/Prev Hunk
1=== modified file 'README'
2--- README 2013-12-02 22:16:00 +0000
3+++ README 2014-02-21 18:12:43 +0000
4@@ -14,7 +14,7 @@
5 cd qlbr
6 cp qlbr/local_settings_example.py to qlbr/local_settings.py
7 python manage.py syncdb --noinput
8- python manage.py load_searches qlbr/searches.json
9+ python manage.py load_searches searches.json
10 python manage.py get_task_data reload
11 python manage.py runserver 0.0.0.0:8000
12 Installation in a container or instance is recommended.
13
14=== modified file 'qlbr/__init__.py'
15--- qlbr/__init__.py 2013-11-26 21:33:14 +0000
16+++ qlbr/__init__.py 2014-02-21 18:12:43 +0000
17@@ -20,6 +20,21 @@
18
19 logging.basicConfig(format='%(levelname)s:%(message)s', level=logging.INFO)
20
21+LP_STATUSES = ['New',
22+ 'Confirmed',
23+ 'Triaged',
24+ 'In Progress',
25+ 'Fix Committed',
26+ 'Opinion',
27+ 'Invalid',
28+ "Won't Fix",
29+ 'Fix Released',
30+ 'Expired',
31+ 'Incomplete',
32+ 'Incomplete (with response)',
33+ 'Incomplete (without response)',
34+ ]
35+
36
37 class tz(datetime.tzinfo):
38
39
40=== modified file 'qlbr/local_settings_example.py'
41--- qlbr/local_settings_example.py 2013-11-26 21:33:14 +0000
42+++ qlbr/local_settings_example.py 2014-02-21 18:12:43 +0000
43@@ -22,6 +22,8 @@
44 # our launchpadlib cache goes in user's home dir by default
45 CACHEDIR = expanduser("~/.launchpadlib/cache/")
46
47+LP_ANON = True
48+
49 ADMINS = (
50 ('Max Brustkern', 'max.brustkern@canonical.com'),
51 ('Allan LeSage', 'allan.lesage@canonical.com'),
52
53=== modified file 'qlbr/management/commands/__init__.py'
54--- qlbr/management/commands/__init__.py 2013-11-26 21:33:14 +0000
55+++ qlbr/management/commands/__init__.py 2014-02-21 18:12:43 +0000
56@@ -18,7 +18,7 @@
57 from django.core.management.base import BaseCommand
58 from launchpadlib.launchpad import Launchpad
59
60-from qlbr.settings import CACHEDIR
61+from qlbr.settings import CACHEDIR, LP_ANON
62
63
64 class LaunchpadCommand(BaseCommand):
65@@ -28,6 +28,11 @@
66 def __init__(self):
67 """Establish a launchpad connection."""
68 super(LaunchpadCommand, self).__init__()
69- self.lp = Launchpad.login_anonymously('QA Reports',
70- 'production',
71- CACHEDIR)
72+ if LP_ANON:
73+ self.lp = Launchpad.login_anonymously('QA Reports',
74+ 'production',
75+ CACHEDIR)
76+ else:
77+ self.lp = Launchpad.login_with('QLBR private',
78+ 'production',
79+ CACHEDIR)
80
81=== modified file 'qlbr/management/commands/get_task_data.py'
82--- qlbr/management/commands/get_task_data.py 2013-11-26 21:33:14 +0000
83+++ qlbr/management/commands/get_task_data.py 2014-02-21 18:12:43 +0000
84@@ -20,7 +20,7 @@
85
86 from django.core.exceptions import ObjectDoesNotExist
87
88-from qlbr import TZ
89+from qlbr import TZ, LP_STATUSES
90 from qlbr.management.commands import LaunchpadCommand
91 from qlbr.models import Bug, Person, Search, SearchTag, Tag, Task
92
93@@ -157,20 +157,7 @@
94
95 def search_tasks(self, defaults={
96 'omit_duplicates': False,
97- 'status': ['New',
98- 'Confirmed',
99- 'Triaged',
100- 'In Progress',
101- 'Fix Committed',
102- 'Opinion',
103- 'Invalid',
104- "Won't Fix",
105- 'Fix Released',
106- 'Expired',
107- 'Incomplete',
108- 'Incomplete (with response)',
109- 'Incomplete (without response)'
110- ]}):
111+ 'status': LP_STATUSES[:]}):
112 """Perform all defined searches and slurp relevant data."""
113 for search in Search.objects.all():
114 logger.info('Running search: %s', search)
115
116=== modified file 'qlbr/templates/qlbr/qa-default.html'
117--- qlbr/templates/qlbr/qa-default.html 2013-11-20 15:39:37 +0000
118+++ qlbr/templates/qlbr/qa-default.html 2014-02-21 18:12:43 +0000
119@@ -41,16 +41,40 @@
120 <td valign="top">
121 <p class="l2-section-heading">Status</p>
122 <table width="100%">
123- <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="New" /> New </td>
124- <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Incomplete" /> Incomplete </td></tr>
125- <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Confirmed" /> Confirmed </td>
126- <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" value="Fix Released" /> Fix Released </td></tr>
127- <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Triaged" /> Triaged </td>
128- <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" value="Won't Fix" /> Won't Fix </td></tr>
129- <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="In Progress" /> In Progress </td>
130- <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" value="Opinion" /> Opinion </td></tr>
131- <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" checked value="Fix Committed" /> Fix Committed </td>
132- <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)" value="Invalid" /> Invalid </td></tr>
133+ <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
134+ {% if "New" in statuses %}checked{% endif %}
135+ value="New" /> New </td>
136+ <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
137+ {% if "Incomplete" in statuses %}checked{% endif %}
138+ value="Incomplete" /> Incomplete </td></tr>
139+ <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
140+ {% if "Confirmed" in statuses %}checked{% endif %}
141+ value="Confirmed" /> Confirmed </td>
142+ <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
143+ {% if "Fix Released" in statuses %}checked{% endif %}
144+ value="Fix Released" /> Fix Released </td></tr>
145+ <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
146+ {% if "Triaged" in statuses %}checked{% endif %}
147+ value="Triaged" /> Triaged </td>
148+ <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
149+ {% if "Won't Fix" in statuses %}checked{% endif %}
150+ value="Won't Fix" /> Won't Fix </td></tr>
151+ <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
152+ {% if "In Progress" in statuses %}checked{% endif %}
153+ value="In Progress" /> In Progress </td>
154+ <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
155+ {% if "Opinion" in statuses %}checked{% endif %}
156+ value="Opinion" /> Opinion </td></tr>
157+ <tr><td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
158+ {% if "Fix Committed" in statuses %}checked{% endif %}
159+ value="Fix Committed" /> Fix Committed </td>
160+ <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
161+ {% if "Invalid" in statuses %}checked{% endif %}
162+ value="Invalid" /> Invalid </td></tr>
163+ <tr><td width="50%"> </td>
164+ <td width="50%"> <input type="checkbox" name="status" onclick="status_handler(this, 'status', true)"
165+ {% if "Expired" in statuses %}checked{% endif %}
166+ value="Expired" /> Expired </td></tr>
167 </table>
168 </td>
169
170@@ -97,6 +121,44 @@
171 {{ report_title }}
172 </div>
173
174+ <div class="reports">
175+ <b><a href="{% url 'qa' %}">QA:</a></b>
176+ -
177+ <a href="{% url 'untriaged' %}">Un-triaged</a>
178+ -
179+ <a href="{% url 'today' %}">Today</a>
180+ -
181+ <a href="{% url 'qa-new' %}">New</a>
182+ -
183+ <a href="{% url 'qa-closed' %}">Recently Closed</a>
184+ -
185+ <a href="{% url 'qa-active' %}">Updated</a>
186+ -
187+ <a href="{% url 'qa-not-yet-landed' %}">Needs to Land</a>
188+ <br />
189+ <b><a href="{% url 'support' %}">Support:</a></b>
190+ -
191+ <a href="{% url 'support-escalated' %}">Escalated</a>
192+ -
193+ <a href="{% url 'support-untriaged' %}">Un-triaged</a>
194+ -
195+ <a href="{% url 'support-new' %}">New</a>
196+ -
197+ <a href="{% url 'support-closed' %}">Recently Closed</a>
198+ -
199+ <a href="{% url 'support-active' %}">Updated</a>
200+ -
201+ <a href="{% url 'support-escalated-inactive' %}">Needs Attention</a>
202+ -
203+ <a href="{% url 'support-not-yet-landed' %}">Needs to Land</a>
204+ <br />
205+ <b><a href="{% url 'index' %}">General:</a></b>
206+ -
207+ <a href="{% url 'all-crit-unassigned' %}">Critical &amp; Unassigned</a>
208+ <br />
209+ <a href="{% url 'tag-elopio' %}">Elopio</a>
210+ </div>
211+
212 {% if datefilter %}<div>
213 <form name="datefilter">
214 <table width="100%">
215@@ -120,10 +182,11 @@
216 <th>Summary</th>
217 <th width="80">Importance</th>
218 <th width="80">Status</th>
219- <th width="140">Reporter</th>
220- <th width="140">Assignee</th>
221+ <th width="100">Reporter</th>
222+ <th width="100">Assignee</th>
223 <th width="200">Tags</th>
224- <th width="140">Created</th>
225+ <th width="80">Created</th>
226+ <th width="80">Updated</th>
227 <th width="65">Duplicate</th>
228 </tr>
229 </thead>
230@@ -150,8 +213,9 @@
231 <tr><td>Status</td><td>The bug task's status.</td></tr>
232 <tr><td>Reporter</td><td>The person who reported the bug.</td></tr>
233 <tr><td>Assignee</td><td>The person or team assigned to work on the bug.</td></tr>
234- <tr><td>Tags/td><td>The tags applied to the bug.</td></tr>
235+ <tr><td>Tags</td><td>The tags applied to the bug.</td></tr>
236 <tr><td>Created</td><td>The date the bug was created.</td></tr>
237+ <tr><td>Updated</td><td>The date the bug was last updated.</td></tr>
238 <tr><td>Duplicate</td><td>The duplicate bug reported by the QA team.</td></tr>
239 </tbody>
240 </table>
241@@ -400,6 +464,7 @@
242 s += "<td>" + task.assignee + "</td>";
243 s += "<td>" + task.taglist + "</td>";
244 s += "<td>" + task.date_created + "</td>";
245+ s += "<td>" + task.date_last_updated + "</td>";
246 s += "<td>" + task.duplicate_link + "</td>";
247 s += "</tr>";
248 tables[task.target] += s;
249
250=== modified file 'qlbr/urls.py'
251--- qlbr/urls.py 2013-12-03 20:12:05 +0000
252+++ qlbr/urls.py 2014-02-21 18:12:43 +0000
253@@ -25,10 +25,142 @@
254 urlpatterns = patterns(
255 '',
256 url(r'^$', 'qlbr.views.index', name='index'),
257- url(r'^untriaged$', 'qlbr.views.index', {'triaged': False}, name='index'),
258- url(r'^today$', 'qlbr.views.index', {'task_filter':
259- {'bug__date_last_updated__gt':
260- datetime.datetime.now()-datetime.timedelta(1)}}),
261+ # tagged with qa-touch
262+ url(r'^qa-touch$', 'qlbr.views.index', {
263+ 'title': 'All QA Bugs',
264+ 'task_filter': {'bug__tags': 'qa-touch'},
265+ }, name='qa'),
266+ # not yet triaged
267+ url(r'^untriaged$', 'qlbr.views.index', {
268+ 'task_filter': {'bug__tags': 'qa-touch'},
269+ 'statuses': ['New', 'Confirmed'],
270+ 'title': 'Un-triaged QA Bugs'}, name='untriaged'),
271+ url(r'^today$', 'qlbr.views.index', {
272+ 'title': 'QA Bugs Updated Today',
273+ 'task_filter': {'bug__date_last_updated__gt':
274+ datetime.datetime.now()-datetime.timedelta(1)}},
275+ name='today'),
276+ # created in the past 90 days (use javascript features for shorter windows)
277+ url(r'^new$', 'qlbr.views.index', {
278+ 'title': 'New QA Bugs',
279+ 'task_filter': {'bug__tags': 'qa-touch',
280+ 'bug__date_created__gt':
281+ datetime.datetime.now()-datetime.timedelta(90)},
282+ 'statuses': ['All']},
283+ name='qa-new'),
284+ # recently fixed or closed or rejected bugs
285+ url(r'^closed$', 'qlbr.views.index', {
286+ 'title': 'Recently-Closed QA Bugs',
287+ 'task_filter': {'bug__tags': 'qa-touch',
288+ 'bug__date_last_updated__gt':
289+ datetime.datetime.now()-datetime.timedelta(90),
290+ },
291+ 'statuses': ['Fix Committed', 'Fix Released', "Won't Fix", 'Invalid']},
292+ name='qa-closed',
293+ ),
294+ # recently active
295+ url(r'^active$', 'qlbr.views.index', {
296+ 'title': 'Recently Active QA Bugs',
297+ 'task_filter': {'bug__tags': 'qa-touch',
298+ 'bug__date_last_updated__gt':
299+ datetime.datetime.now()-datetime.timedelta(14)},
300+ 'statuses': ['All'],
301+ },
302+ name='qa-active'),
303+ # fixed but not deployed for 2+ weeks
304+ url(r'^not-yet-landed$', 'qlbr.views.index', {
305+ 'title': 'Fixed QA Bugs which probably should have landed by now',
306+ 'task_filter': {'bug__tags': 'qa-touch',
307+ 'bug__date_last_updated__lt':
308+ datetime.datetime.now()-datetime.timedelta(14),
309+ },
310+ 'statuses': ['Fix Committed']},
311+ name='qa-not-yet-landed',
312+ ),
313+
314+ ##### Support URLs #####
315+ # all support bugs
316+ url(r'^support$', 'qlbr.views.index', {
317+ 'title': 'Support Bugs',
318+ 'task_filter': {'bug__tags': 'u1-by-support'}},
319+ name='support',
320+ ),
321+ # not yet triaged
322+ url(r'^support/untriaged$', 'qlbr.views.index', {
323+ 'title': 'Un-triaged Support Bugs',
324+ 'task_filter': {'bug__tags': 'u1-by-support'},
325+ 'statuses': ['New', 'Confirmed']},
326+ name='support-untriaged',
327+ ),
328+ # tagged as escalated
329+ url(r'^support/escalated$', 'qlbr.views.index', {
330+ 'title': 'Escalated Support Bugs',
331+ 'task_filter': {'bug__tags': 'u1-support-escalated'}},
332+ name='support-escalated'),
333+ # created in the past 90 days (use javascript features for shorter windows)
334+ url(r'^support/new$', 'qlbr.views.index', {
335+ 'title': 'New Support Bugs',
336+ 'task_filter': {'bug__tags': 'u1-by-support',
337+ 'bug__date_created__gt':
338+ datetime.datetime.now()-datetime.timedelta(90)},
339+ 'statuses': ['All'],
340+ },
341+ name='support-new'),
342+ # recently fixed or closed or rejected bugs
343+ url(r'^support/closed$', 'qlbr.views.index', {
344+ 'title': 'Recently-Closed Support Bugs',
345+ 'task_filter': {'bug__tags': 'u1-by-support',
346+ 'bug__date_last_updated__gt':
347+ datetime.datetime.now()-datetime.timedelta(90),
348+ },
349+ 'statuses': ['Fix Committed', 'Fix Released', "Won't Fix", 'Invalid']},
350+ name='support-closed',
351+ ),
352+ # recently active
353+ url(r'^support/active$', 'qlbr.views.index', {
354+ 'title': 'Recently Active Support Bugs',
355+ 'task_filter': {'bug__tags': 'u1-by-support',
356+ 'bug__date_last_updated__gt':
357+ datetime.datetime.now()-datetime.timedelta(14)},
358+ 'statuses': ['All'],
359+ },
360+ name='support-active'),
361+ # escalated but not recently active
362+ url(r'^support/escalated-inactive$', 'qlbr.views.index', {
363+ 'title': 'Escalated but Inactive Support Bugs',
364+ 'task_filter': {'bug__tags': 'u1-support-escalated',
365+ 'bug__date_last_updated__lt':
366+ datetime.datetime.now()-datetime.timedelta(14)}},
367+ name='support-escalated-inactive'),
368+ # fixed but not deployed for 2+ weeks
369+ url(r'^support/not-yet-landed$', 'qlbr.views.index', {
370+ 'title': 'Fixed Support Bugs which probably should have landed by now',
371+ 'task_filter': {'bug__tags': 'u1-by-support',
372+ 'bug__date_last_updated__lt':
373+ datetime.datetime.now()-datetime.timedelta(14)},
374+ 'statuses': ['Fix Committed']},
375+ name='support-not-yet-landed'),
376+
377+ ##### General URLs (no specific tag) #####
378+ url(r'^all-crit-unassigned$', 'qlbr.views.index', {
379+ 'title': "Critical Tasks which aren't assigned",
380+ 'task_filter': {'importance': 'Critical',
381+ 'assignee': None,
382+ },
383+ },
384+ name='all-crit-unassigned'),
385+
386+ ##### Requested for specific people #####
387+ url(r'^tag/elopio$', 'qlbr.views.index', {
388+ 'title': "Elopio's bugs",
389+ 'task_filter': {'bug__tags': 'elopio'},
390+ },
391+ name='tag-elopio'),
392+
393+ # TODO: add a view for bugs which *don't* have a relevant tag
394+ # (no 'qa-touch' or 'u1-by-support' attached)
395+
396+ ##### Django URLs #####
397 url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
398 url(r'^admin/', include(admin.site.urls)),
399 )
400
401=== modified file 'qlbr/views.py'
402--- qlbr/views.py 2013-12-03 20:12:05 +0000
403+++ qlbr/views.py 2014-02-21 18:12:43 +0000
404@@ -21,11 +21,12 @@
405
406 from django.shortcuts import render
407
408-from qlbr import TZ
409+from qlbr import TZ, LP_STATUSES
410 from qlbr.models import Task
411
412
413-def index(request, task_filter=None, triaged=None):
414+def index(request, task_filter=None, triaged=None, title='QA Bugs',
415+ statuses=None):
416 """Main view of all bugs.
417
418 :returns: view of all bugs
419@@ -37,12 +38,17 @@
420 task_iterator = Task.objects.iterator()
421 else:
422 task_iterator = Task.objects.filter(**task_filter).iterator()
423+
424+ def datefmt(d):
425+ return d.strftime('%Y-%m-%d')
426+
427 for task in task_iterator:
428 bugid = task.bug.bug_id
429 report_task = {
430 'title': task.bug.title,
431 'taglist': task.bug.tag_list,
432- 'date_created': task.date_created.isoformat(),
433+ 'date_created': datefmt(task.date_created),
434+ 'date_last_updated': datefmt(task.bug.date_last_updated),
435 'age': (datetime.datetime.now(TZ) - task.date_created).days,
436 'importance': task.importance,
437 'status': task.status,
438@@ -84,6 +90,20 @@
439 tasks[bugid] = []
440 tasks[bugid].append(report_task)
441
442+ if not statuses:
443+ statuses = [
444+ 'New',
445+ 'Confirmed',
446+ 'Triaged',
447+ 'In Progress',
448+ 'Fix Committed',
449+ 'Incomplete',
450+ 'Incomplete (with response)',
451+ 'Incomplete (without response)'
452+ ]
453+ if statuses == ['All']:
454+ statuses = LP_STATUSES[:]
455+
456 targets = {}
457 for bugid in tasks:
458 for task in tasks[bugid]:
459@@ -97,10 +117,11 @@
460 target_report_order = sorted(
461 [(targets[target], target) for target in targets])
462 tasks_json_dump = json.dumps(tasks, sort_keys=True, indent=4)
463- context = {'report_title': 'QA Bugs',
464+ context = {'report_title': title,
465 'tasks': tasks,
466 'timestamp': datetime.datetime.now().isoformat(),
467 'datefilter': True,
468+ 'statuses': statuses,
469 'target_report_order': target_report_order,
470 'tasks_json_dump': tasks_json_dump}
471 return render(request, 'qlbr/qa-default.html', context)
472
473=== modified file 'searches.json'
474--- searches.json 2013-11-06 22:06:48 +0000
475+++ searches.json 2014-02-21 18:12:43 +0000
476@@ -61,5 +61,42 @@
477 "qa-touch"
478 ]
479 }
480+ },
481+ {
482+ "name": "u1-support",
483+ "search_tags": [
484+ "u1-support"
485+ ],
486+ "projects": [
487+ "ubuntuone",
488+ "software-center-agent",
489+ "canonical-identity-provider",
490+ "canonical-payment-service",
491+ "click-package-index"
492+ ],
493+ "criteria": {
494+ "tags": [
495+ "u1-by-support"
496+ ]
497+ }
498+ },
499+ {
500+ "name": "elopio",
501+ "search_tags": [
502+ "elopio"
503+ ],
504+ "projects": [
505+ "ubuntu",
506+ "ubuntuone",
507+ "software-center-agent",
508+ "canonical-identity-provider",
509+ "canonical-payment-service",
510+ "click-package-index"
511+ ],
512+ "criteria": {
513+ "tags": [
514+ "elopio"
515+ ]
516+ }
517 }
518 ]

Subscribers

People subscribed via source and target branches