Coverage for utilities/paginator.py: 16%

50 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1from django.core.paginator import Page, Paginator 

2 

3from netbox.config import get_config 

4 

5__all__ = ( 

6 'EnhancedPage', 

7 'EnhancedPaginator', 

8 'get_paginate_count', 

9) 

10 

11 

12class EnhancedPaginator(Paginator): 

13 default_page_lengths = ( 

14 25, 50, 100, 250, 500, 1000 

15 ) 

16 

17 def __init__(self, object_list, per_page, orphans=None, **kwargs): 

18 

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 

26 

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 

32 

33 super().__init__(object_list, per_page, orphans=orphans, **kwargs) 

34 

35 def _get_page(self, *args, **kwargs): 

36 return EnhancedPage(*args, **kwargs) 

37 

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 

42 

43 

44class EnhancedPage(Page): 

45 

46 def smart_pages(self): 

47 

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 

51 

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)) 

56 

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) 

61 

62 return page_list 

63 

64 

65def get_paginate_count(request): 

66 """ 

67 Determine the desired length of a page, using the following in order: 

68 

69 1. per_page URL query parameter 

70 2. Saved user preference 

71 3. PAGINATE_COUNT global setting. 

72 

73 Return the lesser of the calculated value and MAX_PAGE_SIZE. 

74 """ 

75 config = get_config() 

76 

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 

81 

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 

88 

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) 

92 

93 return _max_allowed(config.PAGINATE_COUNT)