From: Adam Jackson Date: Mon, 30 Nov 2015 19:59:45 +0000 (-0500) Subject: xmlrpc: Treat negative max_count as meaning "return last N results" X-Git-Tag: v1.1.0~46 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=16ff40d48afaa041046617a2faf7b3150c3126eb;p=thirdparty%2Fpatchwork.git xmlrpc: Treat negative max_count as meaning "return last N results" This is most useful when listing patches, as it lets you get the most recent results instead of the oldest. v2: Resolve "Negative indexing is not supported." issue and include unit tests to ensure this doesn't regress. Bump API version to 1.2 Signed-off-by: Adam Jackson Signed-off-by: Stephen Finucane --- diff --git a/patchwork/bin/pwclient b/patchwork/bin/pwclient index 58f23387..a271132c 100755 --- a/patchwork/bin/pwclient +++ b/patchwork/bin/pwclient @@ -408,7 +408,12 @@ def main(): filter_parser.add_argument( '-n', metavar='MAX#', type=int, - help='''Restrict number of results''' + help='''Return first n results''' + ) + filter_parser.add_argument( + '-N', metavar='MAX#', + type=int, + help='''Return last N results''' ) filter_parser.add_argument( '-m', metavar='MESSAGEID', @@ -556,6 +561,12 @@ def main(): except: action_parser.error("Invalid maximum count '%s'" % args.get('n')) + if args.get('N') is not None: + try: + filt.add("max_count", 0 - args.get('N')) + except: + action_parser.error("Invalid maximum count '%s'" % args.get('N')) + do_signoff = args.get('signoff') # grab settings from config files diff --git a/patchwork/tests/test_xmlrpc.py b/patchwork/tests/test_xmlrpc.py index c69062ef..bbb7dfbb 100644 --- a/patchwork/tests/test_xmlrpc.py +++ b/patchwork/tests/test_xmlrpc.py @@ -76,3 +76,9 @@ class XMLRPCTest(LiveServerTestCase): patches = self.rpc.patch_list({'max_count': 2}) self.assertEqual(len(patches), 2) self.assertEqual(patches[0]['id'], patch_objs[0].id) + + def testListNegativeMaxCount(self): + patch_objs = self._createPatches(5) + patches = self.rpc.patch_list({'max_count': -1}) + self.assertEqual(len(patches), 1) + self.assertEqual(patches[0]['id'], patch_objs[-1].id) diff --git a/patchwork/views/xmlrpc.py b/patchwork/views/xmlrpc.py index 86abd6db..2881afba 100644 --- a/patchwork/views/xmlrpc.py +++ b/patchwork/views/xmlrpc.py @@ -379,7 +379,7 @@ def pw_rpc_version(): Returns: Version of the API. """ - return (1, 1, 0) + return (1, 2, 0) @xmlrpc_method() @@ -407,6 +407,9 @@ def project_list(search_str=None, max_count=0): if max_count > 0: return list(map(project_to_dict, projects[:max_count])) + elif max_count < 0: + return list(map(project_to_dict, + projects[len(projects) + max_count:])) else: return list(map(project_to_dict, projects)) except Project.DoesNotExist: @@ -459,6 +462,8 @@ def person_list(search_str=None, max_count=0): if max_count > 0: return list(map(person_to_dict, people[:max_count])) + elif max_count < 0: + return list(map(person_to_dict, people[len(people) + max_count:])) else: return list(map(person_to_dict, people)) except Person.DoesNotExist: @@ -602,6 +607,9 @@ def patch_list(filt=None): if max_count > 0: return list(map(patch_to_dict, patches[:max_count])) + elif max_count < 0: + return list(map(patch_to_dict, + patches[len(patches) + max_count:])) else: return list(map(patch_to_dict, patches)) except Patch.DoesNotExist: @@ -795,6 +803,8 @@ def state_list(search_str=None, max_count=0): if max_count > 0: return list(map(state_to_dict, states[:max_count])) + elif max_count < 0: + return list(map(state_to_dict, states[len(states) + max_count:])) else: return list(map(state_to_dict, states)) except State.DoesNotExist: