paginator.py
93 lines
| 2.6 KiB
| text/x-python
|
PythonLexer
neko259
|
r2035 | from boards.abstracts.constants import PARAM_PAGE | ||
neko259
|
r722 | __author__ = 'neko259' | ||
neko259
|
r596 | |||
neko259
|
r722 | from django.core.paginator import Paginator | ||
neko259
|
r596 | |||
neko259
|
r1199 | PAGINATOR_LOOKAROUND_SIZE = 2 | ||
neko259
|
r596 | |||
def get_paginator(*args, **kwargs): | ||||
return DividedPaginator(*args, **kwargs) | ||||
class DividedPaginator(Paginator): | ||||
lookaround_size = PAGINATOR_LOOKAROUND_SIZE | ||||
neko259
|
r1419 | |||
def __init__(self, object_list, per_page, orphans=0, | ||||
allow_empty_first_page=True, current_page=1): | ||||
super().__init__(object_list, per_page, orphans, allow_empty_first_page) | ||||
self.link = None | ||||
self.params = None | ||||
self.current_page = current_page | ||||
neko259
|
r596 | |||
neko259
|
r1200 | def _left_range(self): | ||
neko259
|
r1199 | return self.page_range[:self.lookaround_size] | ||
neko259
|
r1200 | def _right_range(self): | ||
neko259
|
r1199 | pages = self.num_pages-self.lookaround_size | ||
if pages <= 0: | ||||
return [] | ||||
else: | ||||
return self.page_range[pages:] | ||||
neko259
|
r1200 | def _center_range(self): | ||
neko259
|
r596 | index = self.page_range.index(self.current_page) | ||
neko259
|
r1199 | start = max(self.lookaround_size, index - self.lookaround_size) | ||
end = min(self.num_pages - self.lookaround_size, index + self.lookaround_size + 1) | ||||
return self.page_range[start:end] | ||||
neko259
|
r1200 | def get_divided_range(self): | ||
neko259
|
r1199 | dr = list() | ||
neko259
|
r1200 | dr += self._left_range() | ||
dr += self._center_range() | ||||
dr += self._right_range() | ||||
neko259
|
r1199 | |||
# Remove duplicates | ||||
dr = list(set(dr)) | ||||
dr.sort() | ||||
return dr | ||||
neko259
|
r1200 | def get_dividers(self): | ||
dividers = [] | ||||
prev_page = 1 | ||||
for page in self.get_divided_range(): | ||||
if page - prev_page > 1: | ||||
dividers.append(page) | ||||
neko259
|
r1199 | |||
neko259
|
r1200 | # There can be no more than 2 dividers, so don't bother going | ||
# further | ||||
if len(dividers) > 2: | ||||
break | ||||
prev_page = page | ||||
neko259
|
r1199 | |||
neko259
|
r1200 | return dividers | ||
neko259
|
r1377 | |||
def set_url(self, link, params): | ||||
self.link = link | ||||
self.params = params | ||||
def get_page_url(self, page): | ||||
neko259
|
r2035 | self.params[PARAM_PAGE] = page | ||
url_params = '&'.join(['{}={}'.format(key, self.params[key]) | ||||
for key in self.params.keys()]) | ||||
return '{}?{}'.format(self.link, url_params) | ||||
neko259
|
r1377 | |||
neko259
|
r1379 | def supports_urls(self): | ||
return self.link is not None and self.params is not None | ||||
neko259
|
r1419 | |||
def get_next_page_url(self): | ||||
current = self.page(self.current_page) | ||||
if current.has_next(): | ||||
return self.get_page_url(current.next_page_number()) | ||||
def get_prev_page_url(self): | ||||
current = self.page(self.current_page) | ||||
if current.has_previous(): | ||||
neko259
|
r2035 | return self.get_page_url(current.previous_page_number()) | ||