mirror of
https://github.com/django/django.git
synced 2025-08-04 10:59:45 +00:00
Fixed #25513 -- Extracted admin pagination to Paginator.get_elided_page_range().
This commit is contained in:
parent
f35840c196
commit
0a306f7da6
6 changed files with 215 additions and 54 deletions
|
@ -1,3 +1,5 @@
|
|||
import collections.abc
|
||||
import unittest.mock
|
||||
import warnings
|
||||
from datetime import datetime
|
||||
|
||||
|
@ -304,6 +306,125 @@ class PaginationTests(SimpleTestCase):
|
|||
with self.subTest(page=page):
|
||||
self.assertEqual(expected, list(next(page_iterator)))
|
||||
|
||||
def test_get_elided_page_range(self):
|
||||
# Paginator.validate_number() must be called:
|
||||
paginator = Paginator([1, 2, 3], 2)
|
||||
with unittest.mock.patch.object(paginator, 'validate_number') as mock:
|
||||
mock.assert_not_called()
|
||||
list(paginator.get_elided_page_range(2))
|
||||
mock.assert_called_with(2)
|
||||
|
||||
ELLIPSIS = Paginator.ELLIPSIS
|
||||
|
||||
# Range is not elided if not enough pages when using default arguments:
|
||||
paginator = Paginator(range(10 * 100), 100)
|
||||
page_range = paginator.get_elided_page_range(1)
|
||||
self.assertIsInstance(page_range, collections.abc.Generator)
|
||||
self.assertNotIn(ELLIPSIS, page_range)
|
||||
paginator = Paginator(range(10 * 100 + 1), 100)
|
||||
self.assertIsInstance(page_range, collections.abc.Generator)
|
||||
page_range = paginator.get_elided_page_range(1)
|
||||
self.assertIn(ELLIPSIS, page_range)
|
||||
|
||||
# Range should be elided if enough pages when using default arguments:
|
||||
tests = [
|
||||
# on_each_side=3, on_ends=2
|
||||
(1, [1, 2, 3, 4, ELLIPSIS, 49, 50]),
|
||||
(6, [1, 2, 3, 4, 5, 6, 7, 8, 9, ELLIPSIS, 49, 50]),
|
||||
(7, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ELLIPSIS, 49, 50]),
|
||||
(8, [1, 2, ELLIPSIS, 5, 6, 7, 8, 9, 10, 11, ELLIPSIS, 49, 50]),
|
||||
(43, [1, 2, ELLIPSIS, 40, 41, 42, 43, 44, 45, 46, ELLIPSIS, 49, 50]),
|
||||
(44, [1, 2, ELLIPSIS, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]),
|
||||
(45, [1, 2, ELLIPSIS, 42, 43, 44, 45, 46, 47, 48, 49, 50]),
|
||||
(50, [1, 2, ELLIPSIS, 47, 48, 49, 50]),
|
||||
]
|
||||
paginator = Paginator(range(5000), 100)
|
||||
for number, expected in tests:
|
||||
with self.subTest(number=number):
|
||||
page_range = paginator.get_elided_page_range(number)
|
||||
self.assertIsInstance(page_range, collections.abc.Generator)
|
||||
self.assertEqual(list(page_range), expected)
|
||||
|
||||
# Range is not elided if not enough pages when using custom arguments:
|
||||
tests = [
|
||||
(6, 2, 1, 1), (8, 1, 3, 1), (8, 4, 0, 1), (4, 1, 1, 1),
|
||||
# When on_each_side and on_ends are both <= 1 but not both == 1 it
|
||||
# is a special case where the range is not elided until an extra
|
||||
# page is added.
|
||||
(2, 0, 1, 2), (2, 1, 0, 2), (1, 0, 0, 2),
|
||||
]
|
||||
for pages, on_each_side, on_ends, elided_after in tests:
|
||||
for offset in range(elided_after + 1):
|
||||
with self.subTest(pages=pages, offset=elided_after, on_each_side=on_each_side, on_ends=on_ends):
|
||||
paginator = Paginator(range((pages + offset) * 100), 100)
|
||||
page_range = paginator.get_elided_page_range(
|
||||
1,
|
||||
on_each_side=on_each_side,
|
||||
on_ends=on_ends,
|
||||
)
|
||||
self.assertIsInstance(page_range, collections.abc.Generator)
|
||||
if offset < elided_after:
|
||||
self.assertNotIn(ELLIPSIS, page_range)
|
||||
else:
|
||||
self.assertIn(ELLIPSIS, page_range)
|
||||
|
||||
# Range should be elided if enough pages when using custom arguments:
|
||||
tests = [
|
||||
# on_each_side=2, on_ends=1
|
||||
(1, 2, 1, [1, 2, 3, ELLIPSIS, 50]),
|
||||
(4, 2, 1, [1, 2, 3, 4, 5, 6, ELLIPSIS, 50]),
|
||||
(5, 2, 1, [1, 2, 3, 4, 5, 6, 7, ELLIPSIS, 50]),
|
||||
(6, 2, 1, [1, ELLIPSIS, 4, 5, 6, 7, 8, ELLIPSIS, 50]),
|
||||
(45, 2, 1, [1, ELLIPSIS, 43, 44, 45, 46, 47, ELLIPSIS, 50]),
|
||||
(46, 2, 1, [1, ELLIPSIS, 44, 45, 46, 47, 48, 49, 50]),
|
||||
(47, 2, 1, [1, ELLIPSIS, 45, 46, 47, 48, 49, 50]),
|
||||
(50, 2, 1, [1, ELLIPSIS, 48, 49, 50]),
|
||||
# on_each_side=1, on_ends=3
|
||||
(1, 1, 3, [1, 2, ELLIPSIS, 48, 49, 50]),
|
||||
(5, 1, 3, [1, 2, 3, 4, 5, 6, ELLIPSIS, 48, 49, 50]),
|
||||
(6, 1, 3, [1, 2, 3, 4, 5, 6, 7, ELLIPSIS, 48, 49, 50]),
|
||||
(7, 1, 3, [1, 2, 3, ELLIPSIS, 6, 7, 8, ELLIPSIS, 48, 49, 50]),
|
||||
(44, 1, 3, [1, 2, 3, ELLIPSIS, 43, 44, 45, ELLIPSIS, 48, 49, 50]),
|
||||
(45, 1, 3, [1, 2, 3, ELLIPSIS, 44, 45, 46, 47, 48, 49, 50]),
|
||||
(46, 1, 3, [1, 2, 3, ELLIPSIS, 45, 46, 47, 48, 49, 50]),
|
||||
(50, 1, 3, [1, 2, 3, ELLIPSIS, 49, 50]),
|
||||
# on_each_side=4, on_ends=0
|
||||
(1, 4, 0, [1, 2, 3, 4, 5, ELLIPSIS]),
|
||||
(5, 4, 0, [1, 2, 3, 4, 5, 6, 7, 8, 9, ELLIPSIS]),
|
||||
(6, 4, 0, [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, ELLIPSIS]),
|
||||
(7, 4, 0, [ELLIPSIS, 3, 4, 5, 6, 7, 8, 9, 10, 11, ELLIPSIS]),
|
||||
(44, 4, 0, [ELLIPSIS, 40, 41, 42, 43, 44, 45, 46, 47, 48, ELLIPSIS]),
|
||||
(45, 4, 0, [ELLIPSIS, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50]),
|
||||
(46, 4, 0, [ELLIPSIS, 42, 43, 44, 45, 46, 47, 48, 49, 50]),
|
||||
(50, 4, 0, [ELLIPSIS, 46, 47, 48, 49, 50]),
|
||||
# on_each_side=0, on_ends=1
|
||||
(1, 0, 1, [1, ELLIPSIS, 50]),
|
||||
(2, 0, 1, [1, 2, ELLIPSIS, 50]),
|
||||
(3, 0, 1, [1, 2, 3, ELLIPSIS, 50]),
|
||||
(4, 0, 1, [1, ELLIPSIS, 4, ELLIPSIS, 50]),
|
||||
(47, 0, 1, [1, ELLIPSIS, 47, ELLIPSIS, 50]),
|
||||
(48, 0, 1, [1, ELLIPSIS, 48, 49, 50]),
|
||||
(49, 0, 1, [1, ELLIPSIS, 49, 50]),
|
||||
(50, 0, 1, [1, ELLIPSIS, 50]),
|
||||
# on_each_side=0, on_ends=0
|
||||
(1, 0, 0, [1, ELLIPSIS]),
|
||||
(2, 0, 0, [1, 2, ELLIPSIS]),
|
||||
(3, 0, 0, [ELLIPSIS, 3, ELLIPSIS]),
|
||||
(48, 0, 0, [ELLIPSIS, 48, ELLIPSIS]),
|
||||
(49, 0, 0, [ELLIPSIS, 49, 50]),
|
||||
(50, 0, 0, [ELLIPSIS, 50]),
|
||||
]
|
||||
paginator = Paginator(range(5000), 100)
|
||||
for number, on_each_side, on_ends, expected in tests:
|
||||
with self.subTest(number=number, on_each_side=on_each_side, on_ends=on_ends):
|
||||
page_range = paginator.get_elided_page_range(
|
||||
number,
|
||||
on_each_side=on_each_side,
|
||||
on_ends=on_ends,
|
||||
)
|
||||
self.assertIsInstance(page_range, collections.abc.Generator)
|
||||
self.assertEqual(list(page_range), expected)
|
||||
|
||||
|
||||
class ModelPaginationTests(TestCase):
|
||||
"""
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue