paginator.py
90 lines
| 2.5 KiB
| text/x-python
|
PythonLexer
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): | |||
self.params['page'] = page | |||
url_params = '?' + '&'.join(['{}={}'.format(key, self.params[key]) | |||
neko259
|
r1419 | for key in self.params.keys()]) | |
neko259
|
r1377 | return self.link + url_params | |
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(): | |||
return self.get_page_url(current.previous_page_number()) |