Coverage for utilities/paginator.py: 16%
50 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1from django.core.paginator import Page, Paginator
3from netbox.config import get_config
5__all__ = (
6 'EnhancedPage',
7 'EnhancedPaginator',
8 'get_paginate_count',
9)
12class EnhancedPaginator(Paginator):
13 default_page_lengths = (
14 25, 50, 100, 250, 500, 1000
15 )
17 def __init__(self, object_list, per_page, orphans=None, **kwargs):
19 # Determine the page size
20 try:
21 per_page = int(per_page)
22 if per_page < 1:
23 per_page = get_config().PAGINATE_COUNT
24 except ValueError:
25 per_page = get_config().PAGINATE_COUNT
27 # Set orphans count based on page size
28 if orphans is None and per_page <= 50:
29 orphans = 5
30 elif orphans is None:
31 orphans = 10
33 super().__init__(object_list, per_page, orphans=orphans, **kwargs)
35 def _get_page(self, *args, **kwargs):
36 return EnhancedPage(*args, **kwargs)
38 def get_page_lengths(self):
39 if self.per_page not in self.default_page_lengths:
40 return sorted([*self.default_page_lengths, self.per_page])
41 return self.default_page_lengths
44class EnhancedPage(Page):
46 def smart_pages(self):
48 # When dealing with five or fewer pages, simply return the whole list.
49 if self.paginator.num_pages <= 5:
50 return self.paginator.page_range
52 # Show first page, last page, next/previous two pages, and current page
53 n = self.number
54 pages_wanted = [1, n - 2, n - 1, n, n + 1, n + 2, self.paginator.num_pages]
55 page_list = sorted(set(self.paginator.page_range).intersection(pages_wanted))
57 # Insert skip markers
58 skip_pages = [x[1] for x in zip(page_list[:-1], page_list[1:]) if (x[1] - x[0] != 1)]
59 for i in skip_pages:
60 page_list.insert(page_list.index(i), False)
62 return page_list
65def get_paginate_count(request):
66 """
67 Determine the desired length of a page, using the following in order:
69 1. per_page URL query parameter
70 2. Saved user preference
71 3. PAGINATE_COUNT global setting.
73 Return the lesser of the calculated value and MAX_PAGE_SIZE.
74 """
75 config = get_config()
77 def _max_allowed(page_size):
78 if config.MAX_PAGE_SIZE:
79 return min(page_size, config.MAX_PAGE_SIZE)
80 return page_size
82 if 'per_page' in request.GET:
83 try:
84 per_page = int(request.GET.get('per_page'))
85 return _max_allowed(per_page)
86 except ValueError:
87 pass
89 if request.user.is_authenticated:
90 per_page = request.user.config.get('pagination.per_page') or config.PAGINATE_COUNT
91 return _max_allowed(per_page)
93 return _max_allowed(config.PAGINATE_COUNT)