#2503 Add the ability to order issues by ascending in the API
Merged 6 years ago by pingou. Opened 6 years ago by mprahl.
Unknown source sort-issues  into  master

file modified
+9
@@ -345,6 +345,11 @@

      |               |         |              |   provided as an unix date|

      |               |         |              |   or in the format Y-M-D  |

      +---------------+---------+--------------+---------------------------+

+     | ``order``     | string  | Optional     | | Set the ordering of the |

+     |               |         |              |   issues. This can be     |

+     |               |         |              |   ``asc`` or ``desc``.    |

+     |               |         |              |   Default: ``desc``       |

+     +---------------+---------+--------------+---------------------------+

  

      Sample response

      ^^^^^^^^^^^^^^^
@@ -357,6 +362,7 @@

              "author": null,

              'milestones': [],

              'no_stones': null,

+             'order': null,

              'priority': null,

              "since": null,

              "status": "Closed",
@@ -404,6 +410,7 @@

              no_stones = False

      priority = flask.request.args.get('priority', None)

      since = flask.request.args.get('since', None)

+     order = flask.request.args.get('order', None)

      status = flask.request.args.get('status', None)

      tags = flask.request.args.getlist('tags')

      tags = [tag.strip() for tag in tags if tag.strip()]
@@ -443,6 +450,7 @@

          'private': private,

          'milestones': milestone,

          'priority': priority_key,

+         'order': order,

          'no_milestones': no_stones,

      }

  
@@ -484,6 +492,7 @@

              'author': author,

              'milestones': milestone,

              'no_stones': no_stones,

+             'order': order,

              'priority': priority,

              'since': since,

              'status': status,

file modified
+11 -4
@@ -2055,7 +2055,7 @@

          closed=False, tags=None, assignee=None, author=None, private=None,

          priority=None, milestones=None, count=False, offset=None,

          limit=None, search_pattern=None, custom_search=None,

-         updated_after=None, no_milestones=None):

+         updated_after=None, no_milestones=None, order='desc'):

      ''' Retrieve one or more issues associated to a project with the given

      criterias.

  
@@ -2112,6 +2112,8 @@

      :type updated_after: str or None

      :kwarg no_milestones: Request issues that do not have a milestone set yet

      :type None, True, or False

+     :kwarg order: Order issues in 'asc' or 'desc' order.

+     :type order: None, str

  

      :return: A single Issue object if issueid is specified, a list of Project

          objects otherwise.
@@ -2328,9 +2330,14 @@

              model.Issue.title.ilike('%' + str(search_pattern) + '%')

          )

  

-     query = query.order_by(

-         model.Issue.date_created.desc()

-     )

+     if order == 'asc':

+         query = query.order_by(

+             model.Issue.date_created.asc()

+         )

+     else:

+         query = query.order_by(

+             model.Issue.date_created.desc()

+         )

  

      if issueid is not None or issueuid is not None:

          output = query.first()

@@ -286,6 +286,9 @@

  

  class PagureFlaskApiIssuetests(tests.Modeltests):

      """ Tests for the flask API of pagure for issue """

+ 

+     maxDiff = None

+ 

      def setUp(self):

          """ Set up the environnment, ran before every tests. """

          super(PagureFlaskApiIssuetests, self).setUp()
@@ -827,6 +830,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -868,6 +872,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -910,6 +915,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -938,6 +944,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -980,6 +987,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1007,6 +1015,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1031,6 +1040,7 @@

                  "author": None,

                  "milestones": [],

                  "no_stones": None,

+                 'order': None,

                  "priority": None,

                  "since": None,

                  "status": "Closed",
@@ -1053,6 +1063,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": "Invalid",
@@ -1078,6 +1089,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": "All",
@@ -1088,6 +1100,39 @@

              }

          )

  

+     def test_api_view_issues_reversed(self):

+         """ Test the api_view_issues method of the flask api. in reversed

+         order.

+ 

+         """

+         self.test_api_new_issue()

+ 

+         headers = {'Authorization': 'token aaabbbcccddd'}

+ 

+         # List issues in reverse order

+         output = self.app.get('/api/0/test/issues?order=asc', headers=headers)

+         self.assertEqual(output.status_code, 200)

+         data = json.loads(output.data)

+         for idx in range(len(data['issues'])):

+             data['issues'][idx]['last_updated'] = '1431414800'

+             data['issues'][idx]['date_created'] = '1431414800'

+         expected = {

+             "args": {

+                 "assignee": None,

+                 "author": None,

+                 'milestones': [],

+                 'no_stones': None,

+                 'order': 'asc',

+                 'priority': None,

+                 "since": None,

+                 "status": None,

+                 "tags": []

+             },

+             "issues": FULL_ISSUE_LIST[1:][::-1],

+             "total_issues": 8

+         }

+         self.assertDictEqual(data, expected)

+ 

      def test_api_view_issues_milestone(self):

          """ Test the api_view_issues method of the flask api when filtering

          for a milestone.
@@ -1144,6 +1189,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1169,6 +1215,7 @@

                  "author": None,

                  'milestones': ['v1.0'],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1240,6 +1287,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1265,6 +1313,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': 'high',

                  "since": None,

                  "status": None,
@@ -1289,6 +1338,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': '1',

                  "since": None,

                  "status": None,
@@ -1377,6 +1427,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1402,6 +1453,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': True,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1427,6 +1479,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': False,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1521,6 +1574,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": None,

                  "status": None,
@@ -1549,6 +1603,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": start,

                  "status": None,
@@ -1574,6 +1629,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": middle,

                  "status": None,
@@ -1599,6 +1655,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": final,

                  "status": None,
@@ -1627,6 +1684,7 @@

                  "author": None,

                  'milestones': [],

                  'no_stones': None,

+                 'order': None,

                  'priority': None,

                  "since": final,

                  "status": None,

@@ -2088,7 +2088,7 @@

              }

          )

  

-     def test_api_priavte_repo_view_issues(self):

+     def test_api_private_repo_view_issues(self):

          """ Test the api_view_issues method of the flask api. """

          self.test_api_private_repo_new_issue()

  
@@ -2120,6 +2120,7 @@

                          "author": None,

                          "milestones": [],

                          "no_stones": None,

+                         "order": None,

                          "priority": None,

                          "since": None,

                          "status": None,
@@ -2188,6 +2189,7 @@

                          "author": None,

                          "milestones": [],

                          "no_stones": None,

+                         "order": None,

                          "priority": None,

                          "status": None,

                          "since": None,
@@ -2269,6 +2271,7 @@

                      "author": None,

                      "milestones": [],

                      "no_stones": None,

+                     "order": None,

                      "priority": None,

                      "status": None,

                      "since": None,
@@ -2340,6 +2343,7 @@

                      "author": None,

                      "milestones": [],

                      "no_stones": None,

+                     "order": None,

                      "priority": None,

                      "status": "Closed",

                      "since": None,
@@ -2363,6 +2367,7 @@

                      "author": None,

                      "milestones": [],

                      "no_stones": None,

+                     "order": None,

                      "priority": None,

                      "status": "Invalid",

                      "since": None,
@@ -2390,6 +2395,7 @@

                      "author": None,

                      "milestones": [],

                      "no_stones": None,

+                     "order": None,

                      "priority": None,

                      "since": None,

                      "status": "All",

This adds the ability to order the issues by ascending in the API. This would be nice to have in order to avoid doing the sorting in the code that uses the API content.

Since the rearchitecture to using celery, I've had trouble running the tests successfully in Vagrant, so I may have missed some of the tests that were affected by this change.

rebased

6 years ago

Looks good, but I did not run the full tests.

rebased

6 years ago

test_pagure_flask_api_ui_private_repo.py", line 2150, in test_api_priavte_repo_view_issues seems to be failing in this branch.

rebased

6 years ago

@pingou fixed the test you mentioned and rebased. Please review again when you can but this has much lower priority than the other two PRs I made.

This test is actually not working :)

Fixing it

rebased

6 years ago

Alright, tests fixed and PR rebased, doing a final run of the tests and merging :)

Pull-Request has been merged by pingou

6 years ago