diff --git a/pagure/lib/__init__.py b/pagure/lib/__init__.py index 74608db..bab85f0 100644 --- a/pagure/lib/__init__.py +++ b/pagure/lib/__init__.py @@ -2752,15 +2752,18 @@ def get_colored_tag(session, tag, project_id): def search_pull_requests( session, requestid=None, project_id=None, project_id_from=None, status=None, author=None, assignee=None, count=False, - offset=None, limit=None, updated_after=None, branch_from=None): - ''' Retrieve the specified issue + offset=None, limit=None, updated_after=None, branch_from=None, + order='desc', order_key=None): + ''' Retrieve the specified pull-requests. ''' - query = session.query( - model.PullRequest - ).order_by( - model.PullRequest.id.desc() - ) + query = session.query(model.PullRequest) + + # by default sort request by date_created. + column = model.PullRequest.date_created + + if order_key == 'last_updated': + column = model.PullRequest.last_updated if requestid: query = query.filter( @@ -2841,6 +2844,12 @@ def search_pull_requests( model.PullRequest.branch_from == branch_from ) + # Depending on the order, the query is sorted(default is desc) + if order == 'asc': + query = query.order_by(asc(column)) + else: + query = query.order_by(desc(column)) + if requestid: output = query.first() elif count: diff --git a/pagure/templates/requests.html b/pagure/templates/requests.html index 75802f7..a49e971 100644 --- a/pagure/templates/requests.html +++ b/pagure/templates/requests.html @@ -90,8 +90,20 @@ Pull Request To - Opened - Modified + Opened + {{ 'date_created' | table_sort_arrow(order_key, order) | safe }} + + Modified + {{ 'last_updated' | table_sort_arrow(order_key, order) | safe }} + {% if status|lower not in ['open', 'true'] %} Closed {% endif %} diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index df4cd57..6975fc8 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -65,11 +65,13 @@ def _get_parent_request_repo_path(repo): @UI_NS.route('/fork////pull-requests/') @UI_NS.route('/fork////pull-requests') def request_pulls(repo, username=None, namespace=None): - """ Create a pull request with the changes from the fork into the project. + """ List all Pull-requests associated to a repo """ status = flask.request.args.get('status', 'Open') assignee = flask.request.args.get('assignee', None) author = flask.request.args.get('author', None) + order = flask.request.args.get('order', 'desc') + order_key = flask.request.args.get('order_key', 'date_created') repo = flask.g.repo @@ -86,6 +88,8 @@ def request_pulls(repo, username=None, namespace=None): flask.g.session, project_id=repo.id, status=True, + order=order, + order_key=order_key, assignee=assignee, author=author, offset=flask.g.offset, @@ -108,6 +112,8 @@ def request_pulls(repo, username=None, namespace=None): requests = pagure.lib.search_pull_requests( flask.g.session, project_id=repo.id, + order=order, + order_key=order_key, assignee=assignee, author=author, status=status, @@ -146,6 +152,8 @@ def request_pulls(repo, username=None, namespace=None): requests=requests, requests_cnt=requests_cnt, oth_requests=oth_requests, + order=order, + order_key=order_key, status=status, assignee=assignee, author=author, diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 98d1eea..f9841e8 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -20,11 +20,13 @@ import sys import tempfile import time import os +import re import pygit2 import six from mock import patch, MagicMock from bs4 import BeautifulSoup +from datetime import datetime, timedelta sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) @@ -837,6 +839,138 @@ class PagureFlaskForktests(tests.Modeltests): shutil.rmtree(newpath) @patch('pagure.lib.notify.send_email') + def test_request_pulls_order(self, send_email): + """Test the request_pulls + + i.e Make sure that the results are displayed + in the order required by the user""" + send_email.return_value = True + + #Initially no project + output = self.app.get('/test/pull-requests') + self.assertEqual(output.status_code, 404) + + tests.create_projects(self.session) + tests.create_projects_git( + os.path.join(self.path, 'repos'), bare=True) + + repo = pagure.lib.get_authorized_project(self.session, 'test') + item = pagure.lib.model.Project( + user_id=2, + name='test', + description='test project #1', + hook_token='aaabbb', + is_fork=True, + parent_id=1, + ) + self.session.add(item) + self.session.commit() + + # create PR's to play with + # PR-1 + req = pagure.lib.new_pull_request( + session=self.session, + repo_to=repo, + repo_from=item, + branch_from='feature', + branch_to='master', + title='PR from the feature branch', + user='pingou', + status='Open', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.id, 1) + self.assertEqual(req.title, 'PR from the feature branch') + + # PR-2 + req = pagure.lib.new_pull_request( + session=self.session, + repo_to=repo, + branch_to='master', + branch_from='feature', + repo_from=item, + title='test PR', + user='pingou', + status='Open', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.title, 'test PR') + + # PR-3 + req = pagure.lib.new_pull_request( + session=self.session, + repo_to=repo, + branch_from='feature', + branch_to='master', + repo_from=item, + title='test Invalid PR', + user='pingou', + status='Closed', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.title, 'test Invalid PR') + + # PR-4 + req = pagure.lib.new_pull_request( + session=self.session, + repo_to=repo, + branch_from='feature', + title='test PR for sort', + repo_from=item, + user='pingou', + branch_to='master', + status='Open', + requestfolder=None, + ) + self.session.commit() + self.assertEqual(req.title, 'test PR for sort') + + # sort by last_updated + output = self.app.get('/test/pull-requests?order_key=last_updated') + tr_elements = re.findall(r'(.*?)', output.data, 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]) + + pr_one = pagure.lib.search_pull_requests( + self.session, project_id=1, requestid=1) + pr_one.last_updated = datetime.utcnow() + timedelta(seconds=2) + self.session.add(pr_one) + self.session.commit() + + # sort by last_updated + output = self.app.get('/test/pull-requests?order_key=last_updated') + tr_elements = re.findall(r'(.*?)', output.data, 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]) + # Make sure that PR two is second since it was modified second + self.assertIn('href="/test/pull-request/4"', tr_elements[2]) + # Make sure that PR one is last since it was modified first + self.assertIn('href="/test/pull-request/2"', tr_elements[3]) + + + # Now query so that the results are ascending + output = self.app.get('/test/pull-requests?' + 'order_key=last_updated&order=asc') + tr_elements = re.findall(r'(.*?)', output.data, 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]) + + @patch('pagure.lib.notify.send_email') def test_request_pulls(self, send_email): """ Test the request_pulls endpoint. """ send_email.return_value = True @@ -899,6 +1033,7 @@ class PagureFlaskForktests(tests.Modeltests): self.assertIn( '

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

', output_text) + # Close is primary self.assertIn( '