##// 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 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 self.get_divided_range():
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 dividers = self.get_dividers()
95 for page in self.get_divided_range():
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