Paginate after filtering query

Apply the pagination code after the filtering so
that results still show when filtering the list
of stories

Change-Id: If2e12f72b8224e10a1df69a42d99a50b9b880420
This commit is contained in:
Mike Heald
2014-10-21 20:33:19 +01:00
parent 5d6886d960
commit e1fe1060d4
2 changed files with 28 additions and 14 deletions

View File

@@ -57,20 +57,6 @@ def story_get_all(title=None, description=None, status=None, assignee_id=None,
project_group_id=project_group_id,
project_id=project_id)
# paginate the query
try:
subquery = api_base.paginate_query(query=subquery,
model=models.Story,
limit=limit,
sort_keys=[sort_field],
marker=marker,
sort_dir=sort_dir)
except InvalidSortKey:
raise ClientSideError("Invalid sort_field [%s]" % (sort_field,),
status_code=400)
except ValueError as ve:
raise ClientSideError("%s" % (ve,), status_code=400)
# Turn the whole shebang into a subquery.
subquery = subquery.subquery('filtered_stories')
@@ -82,6 +68,20 @@ def story_get_all(title=None, description=None, status=None, assignee_id=None,
if status:
query = query.filter(models.StorySummary.status.in_(status))
# paginate the query
try:
query = api_base.paginate_query(query=query,
model=models.StorySummary,
limit=limit,
sort_keys=[sort_field],
marker=marker,
sort_dir=sort_dir)
except InvalidSortKey:
raise ClientSideError("Invalid sort_field [%s]" % (sort_field,),
status_code=400)
except ValueError as ve:
raise ClientSideError("%s" % (ve,), status_code=400)
return query.all()

View File

@@ -265,3 +265,17 @@ class TestStorySearch(base.FunctionalTest):
self.assertEqual(4, result['id'])
result = results.json[4]
self.assertEqual(5, result['id'])
def test_filter_paged_status(self):
url = self.build_search_url({
'limit': '2',
'sort_field': 'id',
'status': 'invalid'
})
results = self.get_json(url)
self.assertEqual(2, len(results))
result = results[0]
self.assertEqual(3, result['id'])
result = results[1]
self.assertEqual(4, result['id'])