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