Show More
@@ -1,106 +1,107 b'' | |||
|
1 | 1 | from django.core.paginator import Paginator |
|
2 | 2 | from boards.abstracts.constants import PARAM_PAGE |
|
3 | 3 | |
|
4 | 4 | __author__ = 'neko259' |
|
5 | 5 | |
|
6 | 6 | PATTERN_PAGE_URL = '<a {} href="{}">{}</a>' |
|
7 | 7 | PAGINATOR_LOOKAROUND_SIZE = 2 |
|
8 | 8 | |
|
9 | 9 | |
|
10 | 10 | def get_paginator(*args, **kwargs): |
|
11 | 11 | return DividedPaginator(*args, **kwargs) |
|
12 | 12 | |
|
13 | 13 | |
|
14 | 14 | class DividedPaginator(Paginator): |
|
15 | 15 | |
|
16 | 16 | lookaround_size = PAGINATOR_LOOKAROUND_SIZE |
|
17 | 17 | |
|
18 | 18 | def __init__(self, object_list, per_page, orphans=0, |
|
19 | 19 | allow_empty_first_page=True, current_page=1, link=None, params=None): |
|
20 | 20 | super().__init__(object_list, per_page, orphans, allow_empty_first_page) |
|
21 | 21 | |
|
22 | 22 | self.link = link |
|
23 | 23 | self.params = params |
|
24 | 24 | self.current_page = current_page |
|
25 | 25 | |
|
26 | 26 | def _left_range(self): |
|
27 | 27 | return self.page_range[:self.lookaround_size] |
|
28 | 28 | |
|
29 | 29 | def _right_range(self): |
|
30 | 30 | pages = self.num_pages-self.lookaround_size |
|
31 | 31 | if pages <= 0: |
|
32 | 32 | return [] |
|
33 | 33 | else: |
|
34 | 34 | return self.page_range[pages:] |
|
35 | 35 | |
|
36 | 36 | def _center_range(self): |
|
37 | 37 | index = self.page_range.index(self.current_page) |
|
38 | 38 | |
|
39 | 39 | start = max(self.lookaround_size, index - self.lookaround_size) |
|
40 | 40 | end = min(self.num_pages - self.lookaround_size, index + self.lookaround_size + 1) |
|
41 | 41 | return self.page_range[start:end] |
|
42 | 42 | |
|
43 | def get_divided_range(self): | |
|
43 | def _get_divided_range(self): | |
|
44 | 44 | dr = list() |
|
45 | 45 | |
|
46 | 46 | dr += self._left_range() |
|
47 | 47 | dr += self._center_range() |
|
48 | 48 | dr += self._right_range() |
|
49 | 49 | |
|
50 | 50 | # Remove duplicates |
|
51 | 51 | dr = list(set(dr)) |
|
52 | 52 | dr.sort() |
|
53 | 53 | |
|
54 | 54 | return dr |
|
55 | 55 | |
|
56 | def get_dividers(self): | |
|
56 | def get_dividers(self, divided_range): | |
|
57 | 57 | dividers = [] |
|
58 | 58 | |
|
59 | 59 | prev_page = 1 |
|
60 |
for page in |
|
|
60 | for page in divided_range: | |
|
61 | 61 | if page - prev_page > 1: |
|
62 | 62 | dividers.append(page) |
|
63 | 63 | |
|
64 | 64 | # There can be no more than 2 dividers, so don't bother going |
|
65 | 65 | # further |
|
66 | 66 | if len(dividers) > 2: |
|
67 | 67 | break |
|
68 | 68 | prev_page = page |
|
69 | 69 | |
|
70 | 70 | return dividers |
|
71 | 71 | |
|
72 | 72 | def get_page_url(self, page): |
|
73 | 73 | self.params[PARAM_PAGE] = page |
|
74 | 74 | url_params = '&'.join(['{}={}'.format(key, self.params[key]) |
|
75 | 75 | for key in self.params.keys()]) |
|
76 | 76 | return '{}?{}'.format(self.link, url_params) |
|
77 | 77 | |
|
78 | 78 | def supports_urls(self): |
|
79 | 79 | return self.link is not None and self.params is not None |
|
80 | 80 | |
|
81 | 81 | def get_next_page_url(self): |
|
82 | 82 | current = self.page(self.current_page) |
|
83 | 83 | if current.has_next(): |
|
84 | 84 | return self.get_page_url(current.next_page_number()) |
|
85 | 85 | |
|
86 | 86 | def get_prev_page_url(self): |
|
87 | 87 | current = self.page(self.current_page) |
|
88 | 88 | if current.has_previous(): |
|
89 | 89 | return self.get_page_url(current.previous_page_number()) |
|
90 | 90 | |
|
91 | 91 | def get_page_url_list(self): |
|
92 | 92 | output = [] |
|
93 | 93 | |
|
94 |
divide |
|
|
95 |
|
|
|
94 | divided_range = self._get_divided_range() | |
|
95 | dividers = self.get_dividers(divided_range) | |
|
96 | for page in divided_range: | |
|
96 | 97 | if page in dividers: |
|
97 | 98 | output.append('...') |
|
98 | 99 | |
|
99 | 100 | if page == self.current_page: |
|
100 | 101 | cls = 'class="current_page"' |
|
101 | 102 | else: |
|
102 | 103 | cls = '' |
|
103 | 104 | output.append(PATTERN_PAGE_URL.format(cls, self.get_page_url(page), |
|
104 | 105 | page)) |
|
105 | 106 | |
|
106 | 107 | return ', '.join(output) |
General Comments 0
You need to be logged in to leave comments.
Login now