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(
'