1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

85 lines
2.6 KiB
Python
Raw Normal View History

2016-03-01 11:23:03 -05:00
from django.core.paginator import Paginator, Page
2021-10-26 11:39:39 -04:00
from netbox.config import Config
2016-03-01 11:23:03 -05:00
class EnhancedPaginator(Paginator):
2021-10-26 11:39:39 -04:00
default_page_lengths = (
25, 50, 100, 250, 500, 1000
)
2016-03-01 11:23:03 -05:00
def __init__(self, object_list, per_page, orphans=None, **kwargs):
# Determine the page size
try:
per_page = int(per_page)
if per_page < 1:
2021-10-26 11:39:39 -04:00
per_page = Config().PAGINATE_COUNT
except ValueError:
2021-10-26 11:39:39 -04:00
per_page = Config().PAGINATE_COUNT
# Set orphans count based on page size
if orphans is None and per_page <= 50:
orphans = 5
elif orphans is None:
orphans = 10
super().__init__(object_list, per_page, orphans=orphans, **kwargs)
2016-03-01 11:23:03 -05:00
def _get_page(self, *args, **kwargs):
return EnhancedPage(*args, **kwargs)
2021-10-26 11:39:39 -04:00
def get_page_lengths(self):
if self.per_page not in self.default_page_lengths:
return sorted([*self.default_page_lengths, self.per_page])
return self.default_page_lengths
2016-03-01 11:23:03 -05:00
class EnhancedPage(Page):
def smart_pages(self):
# When dealing with five or fewer pages, simply return the whole list.
if self.paginator.num_pages <= 5:
return self.paginator.page_range
2016-05-03 09:39:51 -04:00
# Show first page, last page, next/previous two pages, and current page
n = self.number
pages_wanted = [1, n - 2, n - 1, n, n + 1, n + 2, self.paginator.num_pages]
page_list = sorted(set(self.paginator.page_range).intersection(pages_wanted))
2016-03-01 11:23:03 -05:00
# Insert skip markers
2016-05-03 09:39:51 -04:00
skip_pages = [x[1] for x in zip(page_list[:-1], page_list[1:]) if (x[1] - x[0] != 1)]
2016-03-01 11:23:03 -05:00
for i in skip_pages:
2016-05-03 09:39:51 -04:00
page_list.insert(page_list.index(i), False)
2016-03-01 11:23:03 -05:00
2016-05-03 09:39:51 -04:00
return page_list
def get_paginate_count(request):
"""
Determine the desired length of a page, using the following in order:
1. per_page URL query parameter
2. Saved user preference
3. PAGINATE_COUNT global setting.
Return the lesser of the calculated value and MAX_PAGE_SIZE.
"""
2021-10-26 11:39:39 -04:00
config = Config()
if 'per_page' in request.GET:
try:
per_page = int(request.GET.get('per_page'))
if request.user.is_authenticated:
request.user.config.set('pagination.per_page', per_page, commit=True)
2021-10-26 11:39:39 -04:00
return min(per_page, config.MAX_PAGE_SIZE)
except ValueError:
pass
if request.user.is_authenticated:
2021-10-26 11:39:39 -04:00
per_page = request.user.config.get('pagination.per_page', config.PAGINATE_COUNT)
return min(per_page, config.MAX_PAGE_SIZE)
2021-10-26 11:39:39 -04:00
return min(config.PAGINATE_COUNT, config.MAX_PAGE_SIZE)