diff --git a/pillar/web/utils/__init__.py b/pillar/web/utils/__init__.py index 6af25fe5..db5d2766 100644 --- a/pillar/web/utils/__init__.py +++ b/pillar/web/utils/__init__.py @@ -205,3 +205,24 @@ def is_valid_id(some_id): return True return False + + +def last_page_index(meta_info): + """Eve pagination; returns the index of the last page. + + :param meta_info: Eve's '_meta' response. + :returns: Eve page number (base-1) of the last page. + :rtype: int + """ + + total = meta_info['total'] + if total == 0: + return 1 + + per_page = meta_info['max_results'] + + pages = total // per_page + if total % per_page == 0: + return pages + + return pages + 1 diff --git a/tests/test_web/test_utils.py b/tests/test_web/test_utils.py index a6a1ab54..542c222e 100644 --- a/tests/test_web/test_utils.py +++ b/tests/test_web/test_utils.py @@ -108,3 +108,17 @@ class PrettyDateTest(unittest.TestCase): self.assertEqual('in 2 weeks at 11:46', pd(days=14)) self.assertEqual('08 Dec at 11:46', pd(days=30)) self.assertEqual('08 Dec 2017 at 11:46', pd(days=30 + 365)) + + +class EvePaginationTest(unittest.TestCase): + def test_last_page_index(self): + from pillar.web.utils import last_page_index as lpi + + self.assertEqual(1, lpi({'total': 0, 'max_results': 313})) + self.assertEqual(1, lpi({'total': 5, 'max_results': 10})) + self.assertEqual(1, lpi({'total': 5, 'max_results': 5})) + self.assertEqual(2, lpi({'total': 6, 'max_results': 5})) + self.assertEqual(2, lpi({'total': 9, 'max_results': 5})) + self.assertEqual(2, lpi({'total': 10, 'max_results': 5})) + self.assertEqual(3, lpi({'total': 11, 'max_results': 5})) + self.assertEqual(404129352, lpi({'total': 2828905463, 'max_results': 7}))