From f864c83a19c6a30d975eb4b67c79e1901dd7c6dd Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Feb 09 2018 09:51:21 +0000 Subject: [PATCH 1/4] 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) From baaf54506b1c9929e88e819a44cf0cc0c91530e6 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Feb 09 2018 09:51:21 +0000 Subject: [PATCH 2/4] Fix unit-tests - Fix for the new settings that were added - Fix flake8 error Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/lib/tasks_services.py b/pagure/lib/tasks_services.py index 0098f87..df974ad 100644 --- a/pagure/lib/tasks_services.py +++ b/pagure/lib/tasks_services.py @@ -18,8 +18,6 @@ import os.path import time import uuid - -import pygit2 import requests import six diff --git a/tests/test_pagure_flask_api_group.py b/tests/test_pagure_flask_api_group.py index 870347b..972955e 100644 --- a/tests/test_pagure_flask_api_group.py +++ b/tests/test_pagure_flask_api_group.py @@ -1,10 +1,11 @@ # -*- coding: utf-8 -*- """ - (c) 2017 - Copyright Red Hat Inc + (c) 2017-2018 - Copyright Red Hat Inc Authors: Matt Prahl + Pierre-Yves Chibon """ @@ -319,6 +320,8 @@ class PagureFlaskApiGroupTests(tests.SimplePagureTest): "fedmsg_notifications": True, "issue_tracker": True, "issues_default_to_private": False, + "notify_on_commit_flag": False, + "notify_on_pull-request_flag": False, "project_documentation": False, "pull_request_access_only": False, "pull_requests": True, @@ -410,6 +413,8 @@ class PagureFlaskApiGroupTests(tests.SimplePagureTest): "fedmsg_notifications": True, "issue_tracker": True, "issues_default_to_private": False, + "notify_on_commit_flag": False, + "notify_on_pull-request_flag": False, "project_documentation": False, "pull_request_access_only": False, "pull_requests": True, @@ -497,6 +502,8 @@ class PagureFlaskApiGroupTests(tests.SimplePagureTest): "fedmsg_notifications": True, "issue_tracker": True, "issues_default_to_private": False, + "notify_on_commit_flag": False, + "notify_on_pull-request_flag": False, "project_documentation": False, "pull_request_access_only": False, "pull_requests": True, diff --git a/tests/test_pagure_flask_api_user.py b/tests/test_pagure_flask_api_user.py index fedca67..1651151 100644 --- a/tests/test_pagure_flask_api_user.py +++ b/tests/test_pagure_flask_api_user.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015-2016 - Copyright Red Hat Inc + (c) 2015-2018 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -131,6 +131,8 @@ class PagureFlaskApiUSertests(tests.Modeltests): "fedmsg_notifications": True, "issue_tracker": True, "issues_default_to_private": False, + "notify_on_commit_flag": False, + "notify_on_pull-request_flag": False, "pull_request_access_only": False, "project_documentation": False, "pull_requests": True, @@ -181,6 +183,8 @@ class PagureFlaskApiUSertests(tests.Modeltests): "fedmsg_notifications": True, "issue_tracker": True, "issues_default_to_private": False, + "notify_on_commit_flag": False, + "notify_on_pull-request_flag": False, "pull_request_access_only": False, "project_documentation": False, "pull_requests": True, @@ -230,6 +234,8 @@ class PagureFlaskApiUSertests(tests.Modeltests): "fedmsg_notifications": True, "issue_tracker": True, "issues_default_to_private": False, + "notify_on_commit_flag": False, + "notify_on_pull-request_flag": False, "project_documentation": False, "pull_request_access_only": False, "pull_requests": True, diff --git a/tests/test_pagure_lib.py b/tests/test_pagure_lib.py index 7f6ea3a..654b1ef 100644 --- a/tests/test_pagure_lib.py +++ b/tests/test_pagure_lib.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015-2017 - Copyright Red Hat Inc + (c) 2015-2018 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -932,7 +932,7 @@ class PagureLibtests(tests.Modeltests): folder=None) self.session.commit() self.assertEqual(msg, 'Comment updated') - self.assertEqual(mock_redis.publish.call_count, 2) + self.assertEqual(mock_redis.publish.call_count, 1) # After issue = pagure.lib.search_issues(self.session, repo, issueid=1) @@ -989,7 +989,7 @@ class PagureLibtests(tests.Modeltests): self.assertFalse(issue.project.private) args = mock_redis.publish.call_args_list - self.assertEqual(len(args), 8) + self.assertEqual(len(args), 4) # Add a tag to the issue msg = pagure.lib.add_tag_obj( @@ -1002,7 +1002,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(msg, 'Issue tagged with: tag1') args = mock_redis.publish.call_args_list - self.assertEqual(len(args), 10) + self.assertEqual(len(args), 5) # Get the arguments of the last call and get the second of these # arguments (the first one changing for each test run) self.assertEqual( @@ -2550,7 +2550,7 @@ class PagureLibtests(tests.Modeltests): mock_redis.return_value = True self.test_new_pull_request() - self.assertEqual(mock_redis.publish.call_count, 3) + self.assertEqual(mock_redis.publish.call_count, 1) # Let's pretend we turned on the CI hook for the project project = pagure.lib._get_project(self.session, 'test') @@ -2582,7 +2582,7 @@ class PagureLibtests(tests.Modeltests): self.assertEqual(len(request.discussion), 0) self.assertEqual(len(request.comments), 1) self.assertEqual(request.score, 0) - self.assertEqual(mock_redis.publish.call_count, 7) + self.assertEqual(mock_redis.publish.call_count, 4) @patch('pagure.lib.notify.send_email') def test_add_pull_request_flag(self, mockemail): @@ -5676,7 +5676,7 @@ foo bar self.assertEqual( msg, 'Custom field tested reset (from true)') - self.assertEqual(mock_redis.publish.call_count, 3) + self.assertEqual(mock_redis.publish.call_count, 2) @patch('pagure.lib.REDIS') def test_set_custom_key_value_boolean_private_issue(self, mock_redis): @@ -5798,7 +5798,7 @@ foo bar self.assertEqual( msg, 'Custom field tested adjusted to Done (was: In progress)') - self.assertEqual(mock_redis.publish.call_count, 3) + self.assertEqual(mock_redis.publish.call_count, 2) def test_log_action_invalid(self): """ Test the log_action function of pagure.lib. """ diff --git a/tests/test_pagure_lib_git.py b/tests/test_pagure_lib_git.py index c3c1706..3202651 100644 --- a/tests/test_pagure_lib_git.py +++ b/tests/test_pagure_lib_git.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2015-2017 - Copyright Red Hat Inc + (c) 2015-2018 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -1844,7 +1844,7 @@ new file mode 100644 index 0000000..60f7480 --- /dev/null +++ b/456 -@@ -0,0 +1,133 @@ +@@ -0,0 +1,137 @@ +{ + "assignee": null, + "branch": "master", @@ -1894,6 +1894,8 @@ index 0000000..60f7480 + "fedmsg_notifications": true, + "issue_tracker": true, + "issues_default_to_private": false, ++ "notify_on_commit_flag": false, ++ "notify_on_pull-request_flag": false, + "project_documentation": false, + "pull_request_access_only": false, + "pull_requests": true, @@ -1947,6 +1949,8 @@ index 0000000..60f7480 + "fedmsg_notifications": true, + "issue_tracker": true, + "issues_default_to_private": false, ++ "notify_on_commit_flag": false, ++ "notify_on_pull-request_flag": false, + "project_documentation": false, + "pull_request_access_only": false, + "pull_requests": true, From b7c63bd3eaa538282f49cbf541323c89ef53540e Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Feb 09 2018 15:07:38 +0000 Subject: [PATCH 3/4] Do not try to get the avatar if the author has no email Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/ui/filters.py b/pagure/ui/filters.py index 81c802e..45c8378 100644 --- a/pagure/ui/filters.py +++ b/pagure/ui/filters.py @@ -1,7 +1,7 @@ # -*- coding: utf-8 -*- """ - (c) 2014-2017 - Copyright Red Hat Inc + (c) 2014-2018 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon @@ -478,6 +478,8 @@ def author_to_user(author, size=16, cssclass=None, with_name=True): def author_to_avatar(author, size=32): """ Template filter transforming a pygit2 Author object into an avatar. """ + if not author.email: + return '' user = pagure.lib.search_user(flask.g.session, email=author.email) output = user.default_email if user else author.email return avatar(output.encode('utf-8'), size) From dc350a7a4628bff7909c0030d80d1004eb170a85 Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Feb 09 2018 15:07:43 +0000 Subject: [PATCH 4/4] Remove left over print statements Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/ui/issues.py b/pagure/ui/issues.py index 2925f9c..e8a6924 100644 --- a/pagure/ui/issues.py +++ b/pagure/ui/issues.py @@ -849,9 +849,6 @@ def view_roadmap(repo, username=None, namespace=None): if k2 in milestone_issues: del milestone_issues[k2] - print milestones_list - print all_stones - return flask.render_template( 'roadmap.html', select='issues', diff --git a/tests/test_pagure_flask_ui_roadmap.py b/tests/test_pagure_flask_ui_roadmap.py index 47c3586..d7e9cb1 100644 --- a/tests/test_pagure_flask_ui_roadmap.py +++ b/tests/test_pagure_flask_ui_roadmap.py @@ -525,7 +525,6 @@ 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