##// END OF EJS Templates
Compute divided range only once, do not expose it outsided of paginator
neko259 -
r2063:5d000252 default
parent child Browse files
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 self.get_divided_range():
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 dividers = self.get_dividers()
94 divided_range = self._get_divided_range()
95 for page in self.get_divided_range():
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