From ae4b757e0c8f5f0ca4a7390b3cda73f09eda1c3f Mon Sep 17 00:00:00 2001 From: Pierre-Yves Chibon Date: Oct 21 2020 11:20:07 +0000 Subject: Rework the "My PR" page so it does not pull so many info at once This also adds pagination too, also to reduce the amount of data retrieved from the DB and thus lower the amount of HTML to generate and send back. Fixes https://pagure.io/fedora-infrastructure/issue/9165 (hopefully) Signed-off-by: Pierre-Yves Chibon --- diff --git a/pagure/templates/userprofile_pullrequests.html b/pagure/templates/userprofile_pullrequests.html index 046d43b..86606e3 100644 --- a/pagure/templates/userprofile_pullrequests.html +++ b/pagure/templates/userprofile_pullrequests.html @@ -11,54 +11,49 @@

Pull Requests for {{ username | avatar(20) | safe }} {{ username }}

+ +
+ {% if pr_type == "filed" %}
Pull Requests Created
+ {% else %} +
Pull Requests {{username}} can act on
+ {% endif %} PRs
- {% for request in requests|selectattr("user.username", "equalto", username) %} - {% if request.status|lower != "open" %} - {% set hidden = "hidden "%} - {% else %} - {% set hidden = "" %} - {% endif %} - {% set htmlclass = hidden+"pr-created pr-status pr-status-"+request.status|lower%} + {% for request in requests %} + {% set htmlclass = "pr-created pr-status pr-status-"+request.status|lower%} {{render_pullrequest_row(request, request.project, username, class=htmlclass, showproject=True)}} {% endfor %} + {% if total_pages > 1 %} + {{ pagination_link('page', page, total_pages) }} + {% endif %} -
-
Pull Requests {{username}} can act on
- - PRs - -
- - {% for request in requests|rejectattr("user.username", "equalto", username) %} - {% if request.status|lower != "open" %} - {% set hidden = "hidden "%} - {% else %} - {% set hidden = "" %} - {% endif %} - {% set htmlclass = hidden+"pr-assigned pr-status pr-status-"+request.status|lower%} - {{render_pullrequest_row(request, request.project, username, class=htmlclass, showproject=True)}} - {% endfor %} @@ -69,31 +64,6 @@ {% endblock %} diff --git a/pagure/ui/app.py b/pagure/ui/app.py index d8ab761..a7eec73 100644 --- a/pagure/ui/app.py +++ b/pagure/ui/app.py @@ -898,9 +898,59 @@ def view_user_requests(username): """ user = _get_user(username=username) + pr_type = flask.request.args.get("type", "filed").lower() + if pr_type not in ["filed", "actionable"]: + flask.flash("Invalid list of PR selected", "error") + pr_type = "filed" + + pr_status = flask.request.args.get("status", "open").lower() + if pr_status not in ["open", "merged", "cancelled", "all"]: + flask.flash("Invalid PR status provided", "error") + pr_status = "open" + + page = flask.request.args.get("page", 1) + try: + page = int(page) + if page < 1: + page = 1 + except ValueError: + page = 1 + + limit = pagure_config["ITEM_PER_PAGE"] + start = limit * (page - 1) + + filed = actionable = None + if pr_type == "filed": + filed = user.user + else: + actionable = user.user + + status = None + if pr_status == "open": + status = "Open" + elif pr_status == "merged": + status = "Merged" + elif pr_status == "cancelled": + status = "Closed" + requests = pagure.lib.query.get_pull_request_of_user( - flask.g.session, username=username + flask.g.session, + username=username, + filed=filed, + actionable=actionable, + status=status, + offset=start, + limit=limit, + ) + requests_length = pagure.lib.query.get_pull_request_of_user( + flask.g.session, + username=username, + filed=filed, + actionable=actionable, + status=status, + count=True, ) + total_pages = int(ceil(requests_length / float(limit))) userprofile_common = get_userprofile_common(user) @@ -910,6 +960,9 @@ def view_user_requests(username): user=user, requests=requests, select="requests", + pr_type=pr_type, + pr_status=pr_status, + total_pages=total_pages, repos_length=userprofile_common["repos_length"], forks_length=userprofile_common["forks_length"], ) diff --git a/tests/test_pagure_flask_ui_app.py b/tests/test_pagure_flask_ui_app.py index b0fb0d6..4d8ecab 100644 --- a/tests/test_pagure_flask_ui_app.py +++ b/tests/test_pagure_flask_ui_app.py @@ -1544,12 +1544,19 @@ class PagureFlaskApptests(tests.Modeltests): self.assertEqual(req.title, "test pull-request #2") # Check pingou's PR list - output = self.app.get("/user/pingou/requests") + output = self.app.get("/user/pingou/requests?type=filed") self.assertEqual(output.status_code, 200) output_text = output.get_data(as_text=True) self.assertIn("test pull-request #1", output_text) + self.assertNotIn("test pull-request #2", output_text) + self.assertEqual(output_text.count('pr-status pr-status-open"'), 1) + + output = self.app.get("/user/pingou/requests?type=actionable") + self.assertEqual(output.status_code, 200) + output_text = output.get_data(as_text=True) + self.assertNotIn("test pull-request #1", output_text) self.assertIn("test pull-request #2", output_text) - self.assertEqual(output_text.count('pr-status pr-status-open"'), 2) + self.assertEqual(output_text.count('pr-status pr-status-open"'), 1) # Check foo's PR list output = self.app.get("/user/foo/requests")