From 81c3a2b18d3a3f16a79de14de070a42611f1294c Mon Sep 17 00:00:00 2001 From: Ryan Lerch Date: Jun 19 2018 01:57:31 +0000 Subject: Restyle the pull requests list page This changes the list of pull requests to match the recently re-done issues list. It only implements the filters and sorting that was in the old pull-requests page. (which has fewer options than the issues page) Fixes #3341 Signed-off-by: Ryan Lerch --- diff --git a/pagure/templates/_render_pullrequests.html b/pagure/templates/_render_pullrequests.html new file mode 100644 index 0000000..483f755 --- /dev/null +++ b/pagure/templates/_render_pullrequests.html @@ -0,0 +1,99 @@ +{% macro render_pullrequest_row(request, repo, username) %} + {% if request.status|lower == 'open' %} + {% set status_color = "success" %} + {% elif request.status|lower == 'merged' %} + {% set status_color = "info" %} + {% else %} + {% set status_color = "danger" %} + {% endif %} + +
+
+ +
+
+ #{{request.id}} + + + {{request.title}} + + + +
+
+ {% if request.status|lower == 'merged'%} + + Merged + {{ request.closed_at | humanize}}. + + Opened {{ request.date_created | humanize}} by {{ request.user.user }}. + + + {% elif request.status|lower == 'closed' %} + + Cancelled + {{ request.closed_at | humanize}}. + Opened {{ request.date_created | humanize}} by {{ request.user.user }}. + + {% else %} + + Opened + {{ request.date_created | humanize}} by {{ request.user.user }}. + Modified {{ request.last_updated | humanize}} + + {% endif %} +
+
+ {% for tag in request.tags %} + + {{ tag.tag }} + + {% endfor %} +
+
+ + + {% if request.assignee %} + + + {{ request.assignee.username | avatar(size=20) | safe}} + + {% endif %} + + + + {{request.branch}} + + + + + {{request.user_comments|count}} + + + +
+
+{% endmacro%} diff --git a/pagure/templates/requests.html b/pagure/templates/requests.html index 170017a..2dabb87 100644 --- a/pagure/templates/requests.html +++ b/pagure/templates/requests.html @@ -1,202 +1,363 @@ {% extends "repo_master.html" %} {% from "_render_repo.html" import pagination_link %} +{% from "_render_pullrequests.html" import render_pullrequest_row %} + {% block title %}Pull requests - {{ repo.namespace + '/' if repo.namespace }}{{ repo.name }}{% endblock %} {% set tag = "home" %} +{% block header %} + +{% endblock %} {% block repo %} -
-

- {{ requests|count }} {%- - if status and status|lower != 'open' and status|lower != 'false' - %} {{ status }} {%- - elif status|lower in ['closed', 'false'] - %} Closed/Merged {%- endif - %} Pull Requests (of {{ requests_cnt }}) -

- -
- - Open - Closed - All - - Reset Filters -
-
-
- - - - - - - - - - {% if status|lower not in ['open', 'true'] %} - - {% endif %} - - {% if status|lower == 'open' %} - - {% endif %} - - - - - - {% for request in requests %} - - - - - - {% if status|lower not in ['open', 'true'] %} - - {% endif %} - - {% if status|lower in ['open', 'true'] %} - - {% endif %} - - {% else %} - - - - {% endfor %} - -
Pull RequestToOpened - {{ 'date_created' | table_sort_arrow(order_key, order) | safe }}Modified - {{ 'last_updated' | table_sort_arrow(order_key, order) | safe }}Closed - Reporter(reset) - - Assignee(reset) -
- - PR#{{ request.id }} - {% if status|lower not in ['open', 'true'] %}{{request.status}}{% - endif %} {{ request.title | noJS("img") | safe }} - - {% if request.user_comments|count > 0 %} -    - - - {{ request.user_comments|count }} - - {% endif %} - - {{ request.branch }} - - {{ - request.date_created | humanize}} - - {{ - request.updated_on | humanize}} - - {{ - request.closed_at | humanize - if request.closed_at }} - - - {{ request.user.default_email | avatar(16) | safe }} - {{ request.user.user }} - - - {% if request.assignee %} - - {{ request.assignee.default_email | avatar(16) | safe }} - {{ request.assignee.user }} - - {% else %} - unassigned - {% endif %} -
No Pull Requests found
+

+ + Pull Requests + +

+
+
+
+
+
+
+
+ +
+ + +
+
+ +
+ +
+ {% set filters_list = [ + {"key": "date_created", "display_string": "Open Date", "sort_icon_prefix": "fa-sort-numeric-", "icon":"fa-calendar"}, + {"key": "last_updated", "display_string": "Last Modified Date", "sort_icon_prefix": "fa-sort-numeric-", "icon":"fa-calendar"}, + ] %} + + +
+
+
+
+
+ + {% if requests %} + {% for request in requests %} + {{render_pullrequest_row(request, repo, username)}} + {% endfor %} + {% else %} +
+
+
+

+ {% if status_filter == 'Open'%} + no open pull requests found + {% if merged_cnt %} +
+ + + {{merged_cnt}} merged pull requests + + match this filter + +
+ {% else %} +
no merged pull requests match this filter either
+ {% endif %} + {% elif status_filter == 'Merged'%} + no merged pull requests found + {% if open_cnt %} +
+ + + {{open_cnt}} open pull requests + + match this filter + +
+ {% else %} +
no open pull requests match this filter either
+ {% endif %} + {% else %} + no pull requests found + {% endif %} +

+
+
+
+ {% endif %} +
+
+{% if total_page > 1 %} {{ pagination_link('page', g.page, total_page) }} +{% endif %} +{% endblock %} + +{% block jscripts %} +{{ super() }} + + + {% endblock %} diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 4d3a865..38ab14e 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -78,61 +78,90 @@ def request_pulls(repo, username=None, namespace=None): if not repo.settings.get('pull_requests', True): flask.abort(404, 'No pull-requests found for this project') - if is_true(status, ['false', '0']): - status = False - elif is_true(status, ['all']): - status = None - - if is_true(status, ['true', '1', 'open']): + total_open = pagure.lib.search_pull_requests( + flask.g.session, + project_id=repo.id, + status=True, + count=True) + + total_merged = pagure.lib.search_pull_requests( + flask.g.session, + project_id=repo.id, + status='Merged', + count=True) + + if status.lower() == 'merged' or is_true(status, ['false', '0']): + status_filter = 'Merged' requests = pagure.lib.search_pull_requests( flask.g.session, project_id=repo.id, - status=True, + status='Merged', order=order, order_key=order_key, assignee=assignee, author=author, offset=flask.g.offset, limit=flask.g.limit) - requests_cnt = pagure.lib.search_pull_requests( + elif is_true(status, ['true', '1', 'open']): + status_filter = 'Open' + requests = pagure.lib.search_pull_requests( flask.g.session, project_id=repo.id, - status=True, + status='Open', + order=order, + order_key=order_key, assignee=assignee, author=author, - count=True) - oth_requests = pagure.lib.search_pull_requests( + offset=flask.g.offset, + limit=flask.g.limit) + elif status.lower() == 'closed': + status_filter = 'Closed' + requests = pagure.lib.search_pull_requests( flask.g.session, project_id=repo.id, - status=False, + status='Closed', + order=order, + order_key=order_key, assignee=assignee, author=author, - count=True) + offset=flask.g.offset, + limit=flask.g.limit) else: + status_filter = None requests = pagure.lib.search_pull_requests( flask.g.session, project_id=repo.id, + status=None, order=order, order_key=order_key, assignee=assignee, author=author, - status=status, offset=flask.g.offset, limit=flask.g.limit) - requests_cnt = pagure.lib.search_pull_requests( - flask.g.session, - project_id=repo.id, - assignee=assignee, - author=author, - status=status, - count=True) - oth_requests = pagure.lib.search_pull_requests( - flask.g.session, - project_id=repo.id, - status=True, - assignee=assignee, - author=author, - count=True) + + open_cnt = pagure.lib.search_pull_requests( + flask.g.session, + project_id=repo.id, + status='Open', + assignee=assignee, + author=author, + count=True) + + merged_cnt = pagure.lib.search_pull_requests( + flask.g.session, + project_id=repo.id, + status='Merged', + assignee=assignee, + author=author, + count=True) + + closed_cnt = pagure.lib.search_pull_requests( + flask.g.session, + project_id=repo.id, + status='Closed', + assignee=assignee, + author=author, + count=True) repo_obj = flask.g.repo_obj if not repo_obj.is_empty and not repo_obj.head_is_unborn: @@ -141,8 +170,8 @@ def request_pulls(repo, username=None, namespace=None): head = 'master' total_page = 1 - if requests_cnt: - total_page = int(ceil(requests_cnt / float(flask.g.limit))) + if len(requests): + total_page = int(ceil(len(requests) / float(flask.g.limit))) return flask.render_template( 'requests.html', @@ -150,15 +179,19 @@ def request_pulls(repo, username=None, namespace=None): repo=repo, username=username, requests=requests, - requests_cnt=requests_cnt, - oth_requests=oth_requests, + open_cnt=open_cnt, + merged_cnt=merged_cnt, + closed_cnt=closed_cnt, order=order, order_key=order_key, status=status, + status_filter=status_filter, assignee=assignee, author=author, head=head, total_page=total_page, + total_open=total_open, + total_merged=total_merged, ) diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 386ba37..bce6766 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -924,16 +924,12 @@ class PagureFlaskForktests(tests.Modeltests): # sort by last_updated output = self.app.get('/test/pull-requests?order_key=last_updated') output_text = output.get_data(as_text=True) - tr_elements = re.findall('(.*?)', output_text, re.M | re.S) + tr_elements = re.findall('
(.*?)
', output_text, re.M | re.S) self.assertEqual(output.status_code, 200) - arrowed_th = ('Modified\n ') - # First table row is the header - self.assertIn(arrowed_th, tr_elements[0]) # Make sure that issue four is first since it was modified last - self.assertIn('href="/test/pull-request/4"', tr_elements[1]) - self.assertIn('href="/test/pull-request/2"', tr_elements[2]) - self.assertIn('href="/test/pull-request/1"', tr_elements[3]) + self.assertIn('href="/test/pull-request/4"', tr_elements[0]) + self.assertIn('href="/test/pull-request/2"', tr_elements[1]) + self.assertIn('href="/test/pull-request/1"', tr_elements[2]) pr_one = pagure.lib.search_pull_requests( self.session, project_id=1, requestid=1) @@ -944,27 +940,24 @@ class PagureFlaskForktests(tests.Modeltests): # sort by last_updated output = self.app.get('/test/pull-requests?order_key=last_updated') output_text = output.get_data(as_text=True) - tr_elements = re.findall(r'(.*?)', output_text, re.M | re.S) + tr_elements = re.findall('
(.*?)
', output_text, re.M | re.S) self.assertEqual(output.status_code, 200) # Make sure that PR four is first since it was modified last - self.assertIn('href="/test/pull-request/1"', tr_elements[1]) + self.assertIn('href="/test/pull-request/1"', tr_elements[0]) # Make sure that PR two is second since it was modified second - self.assertIn('href="/test/pull-request/4"', tr_elements[2]) + self.assertIn('href="/test/pull-request/4"', tr_elements[1]) # Make sure that PR one is last since it was modified first - self.assertIn('href="/test/pull-request/2"', tr_elements[3]) + self.assertIn('href="/test/pull-request/2"', tr_elements[2]) # Now query so that the results are ascending output = self.app.get('/test/pull-requests?' 'order_key=last_updated&order=asc') output_text = output.get_data(as_text=True) - tr_elements = re.findall(r'(.*?)', output_text, re.M | re.S) - arrowed_th = ('Modified\n ') - self.assertIn(arrowed_th, tr_elements[0]) - self.assertIn('href="/test/pull-request/2"', tr_elements[1]) - self.assertIn('href="/test/pull-request/4"', tr_elements[2]) - self.assertIn('href="/test/pull-request/1"', tr_elements[3]) + tr_elements = re.findall('
(.*?)
', output_text, re.M | re.S) + self.assertIn('href="/test/pull-request/2"', tr_elements[0]) + self.assertIn('href="/test/pull-request/4"', tr_elements[1]) + self.assertIn('href="/test/pull-request/1"', tr_elements[2]) @patch('pagure.lib.notify.send_email') def test_request_pulls(self, send_email): @@ -983,15 +976,8 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertIn( - '

\n 0 Pull Requests (of 0)\n

', + ' 0 Open PRs\n', output_text) - # Open is primary - self.assertIn( - 'Open', output_text) - self.assertIn( - 'Closed', output_text) self.set_up_git_repo(new_project=None, branch_from='feature') @@ -999,44 +985,44 @@ class PagureFlaskForktests(tests.Modeltests): self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertIn( - '

\n 1 Pull Requests (of 1)\n

', + ' 1 Open PRs\n', output_text) - # Open is primary - self.assertIn( - 'Open', output_text) - self.assertIn( - 'Closed', output_text) - output = self.app.get('/test/pull-requests?status=Closed') + output = self.app.get('/test/pull-requests?status=1') self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertIn( - '

\n 0 Closed Pull Requests (of 0)\n

', + ' 1 Open PRs\n', output_text) - # Close is primary + + output = self.app.get('/test/pull-requests?status=true') + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) self.assertIn( - 'Open', output_text) + ' 1 Open PRs\n', + output_text) + + output = self.app.get('/test/pull-requests?status=Merged') + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) self.assertIn( - 'Closed', output_text) + ' 0 Merged PRs\n', + output_text) output = self.app.get('/test/pull-requests?status=0') self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertIn( - '

\n 0 Closed/Merged Pull Requests (of 0)\n

', + ' 0 Merged PRs\n', output_text) - # Close is primary - self.assertIn( - 'Open', output_text) + output = self.app.get('/test/pull-requests?status=Closed') + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) self.assertIn( - 'Closed', output_text) + ' 0 Cancelled PRs\n', + output_text) + # Project w/o pull-request repo = pagure.lib.get_authorized_project(self.session, 'test')