2016-05-23 12:55:03 -04:00
|
|
|
from django.conf import settings
|
2016-03-01 11:23:03 -05:00
|
|
|
from django.core.paginator import Paginator, Page
|
|
|
|
|
|
|
|
|
|
|
|
class EnhancedPaginator(Paginator):
|
|
|
|
|
2016-05-23 12:55:03 -04:00
|
|
|
def __init__(self, object_list, per_page, **kwargs):
|
2019-03-11 12:51:03 -04:00
|
|
|
try:
|
|
|
|
per_page = int(per_page)
|
|
|
|
if per_page < 1:
|
|
|
|
per_page = settings.PAGINATE_COUNT
|
|
|
|
except ValueError:
|
|
|
|
per_page = settings.PAGINATE_COUNT
|
|
|
|
|
2018-11-27 10:52:24 -05:00
|
|
|
super().__init__(object_list, per_page, **kwargs)
|
2016-05-23 12:55:03 -04:00
|
|
|
|
2016-03-01 11:23:03 -05:00
|
|
|
def _get_page(self, *args, **kwargs):
|
|
|
|
return EnhancedPage(*args, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
class EnhancedPage(Page):
|
|
|
|
|
|
|
|
def smart_pages(self):
|
|
|
|
|
2016-12-26 15:43:48 -05:00
|
|
|
# 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
|