From f864c83a19c6a30d975eb4b67c79e1901dd7c6dd Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Feb 09 2018 09:51:21 +0000 Subject: Include a count of the number of tickets shown vs recorded for each milestone On the roadmap page there is now a count diplayed of the number of tickets shown vs the number of ticket recorded for this milestone. Fixes https://pagure.io/pagure/issue/2689 Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/templates/roadmap.html b/pagure/templates/roadmap.html index a7ed9b9..16b84eb 100644 --- a/pagure/templates/roadmap.html +++ b/pagure/templates/roadmap.html @@ -6,17 +6,19 @@ {% block repo %} -{% macro render_issue_list(issues, title, id, milestone) %} +{% macro render_issue_list(issues, title, id, milestone, total) %}
{% if status and status|lower == 'closed' %} @@ -268,10 +270,11 @@ {% endif %} {% for milestone in milestones %} - {% if issues[milestone] %} + {% if not milestone.endswith('_total') %} {{ render_issue_list( issues[milestone], title=milestone, - id=loop.index, milestone=milestone) }} + id=loop.index, milestone=milestone, + total=issues[milestone + '_total']) }} {% endif %} {% endfor %} {% endblock %} diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index e1eb86e..2925f9c 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -767,17 +767,22 @@ def view_roadmap(repo, username=None, namespace=None): for tag in pagure.lib.get_tags_of_project(flask.g.session, repo) ] - all_milestones = sorted(list(repo.milestones.keys())) - active_milestones = pagure.lib.get_active_milestones(flask.g.session, repo) - - milestones_list = active_milestones if all_stones: - milestones_list = all_milestones + milestones_list = sorted([ + k + for k in repo.milestones + ]) + else: + milestones_list = sorted([ + k + for k in repo.milestones + if repo.milestones[k]['active'] + ]) - if 'unplanned' in all_milestones: - index = all_milestones.index('unplanned') - cnt = len(all_milestones) - all_milestones.insert(cnt, all_milestones.pop(index)) + if 'unplanned' in milestones_list: + index = milestones_list.index('unplanned') + cnt = len(milestones_list) + milestones_list.insert(cnt, milestones_list.pop(index)) if no_stones: # Return only issues that do not have a milestone set @@ -806,26 +811,33 @@ def view_roadmap(repo, username=None, namespace=None): issues = pagure.lib.search_issues( flask.g.session, repo, - milestones=milestones or all_milestones, + milestones=milestones or milestones_list, tags=tags, private=private, - status=status if status.lower() != 'all' else None, + status=None, ) # Change from a list of issues to a dict of milestone/issues milestone_issues = defaultdict(list) for issue in issues: saved = False - for mlstone in sorted(milestones or all_milestones): + for mlstone in sorted(milestones or milestones_list): if mlstone == issue.milestone: - milestone_issues[mlstone].append(issue) - saved = True - break + milestone_issues['%s_total' % mlstone] = \ + milestone_issues.get('%s_total' % mlstone, 0) + 1 + if status.lower() == 'all' or ( + status.lower() != 'all' + and status.lower() == issue.status.lower()): + milestone_issues[mlstone].append(issue) + saved = True + break if saved: continue if status and status.lower() != 'all': - for key in milestone_issues.keys(): + for key in milestone_issues: + if key.endswith('_total'): + continue active = False for issue in milestone_issues[key]: if issue.status == status: @@ -833,6 +845,12 @@ def view_roadmap(repo, username=None, namespace=None): break if not active: del milestone_issues[key] + k2 = '%s_total' % key + if k2 in milestone_issues: + del milestone_issues[k2] + + print milestones_list + print all_stones return flask.render_template( 'roadmap.html', diff --git a/pagure/ui/repo.py b/pagure/ui/repo.py index 8db2a44..f2bc84d 100644 --- a/pagure/ui/repo.py +++ b/pagure/ui/repo.py @@ -1332,8 +1332,8 @@ def update_milestones(repo, username=None, namespace=None): if not error: miles = {} for cnt in range(len(milestones)): - active = flask.request.form.get( - 'active_milestone_%s' % (cnt + 1), False) + active = True if flask.request.form.get( + 'active_milestone_%s' % (cnt + 1)) else False date = flask.request.form.get( 'milestone_date_%s' % (cnt + 1), None) diff --git a/tests/test_pagure_flask_ui_roadmap.py b/tests/test_pagure_flask_ui_roadmap.py index 4cf796a..47c3586 100644 --- a/tests/test_pagure_flask_ui_roadmap.py +++ b/tests/test_pagure_flask_ui_roadmap.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2016 - Copyright Red Hat Inc + (c) 2016-2018 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -407,6 +407,9 @@ class PagureFlaskRoadmaptests(tests.Modeltests): 'milestone_date_1': 'Tomorrow', 'milestone_date_2': '', 'milestone_date_3': '', + 'active_milestone_1': True, + 'active_milestone_2': True, + 'active_milestone_3': True, 'csrf_token': csrf_token, } output = self.app.post( @@ -423,9 +426,9 @@ class PagureFlaskRoadmaptests(tests.Modeltests): self.assertEqual( repo.milestones, { - u'unplanned': {u'active': False, u'date': None}, - u'v1.0': {u'active': False, u'date': u'Tomorrow'}, - u'v2.0': {u'active': False, u'date': None} + u'unplanned': {u'active': True, u'date': None}, + u'v1.0': {u'active': True, u'date': u'Tomorrow'}, + u'v2.0': {u'active': True, u'date': None} } ) @@ -522,6 +525,7 @@ class PagureFlaskRoadmaptests(tests.Modeltests): # test the roadmap view for a specific milestone - open output = self.app.get('/test/roadmap?milestone=v1.0') self.assertEqual(output.status_code, 200) + print output.data self.assertIn(u'No issues found', output.data) self.assertEqual( output.data.count(u'#'), 0)
{{ title }} - {% if milestone and repo.milestones[milestone]['date'] %} -   (Due: {{ - repo.milestones[milestone]['date'] }}) - {% endif %} + + {% if milestone and milestone in repo.milestones and repo.milestones[milestone]['date'] %} + (Due: {{ + repo.milestones[milestone]['date'] }}) + {% endif %} ({{ issues | length }} {% + if total %}of {{ total }}{% endif %}) Opened