30 # The fact that you are presently reading this means that you have had |
30 # The fact that you are presently reading this means that you have had |
31 # knowledge of the CeCILL-B license and that you accept its terms. |
31 # knowledge of the CeCILL-B license and that you accept its terms. |
32 # |
32 # |
33 |
33 |
34 import codecs |
34 import codecs |
|
35 import hashlib |
35 import logging |
36 import logging |
36 import math |
37 import math |
37 import hashlib |
|
38 import sys |
38 import sys |
39 import unicodedata |
39 import unicodedata |
40 |
40 |
41 from django.conf import settings |
41 from django.conf import settings |
|
42 from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, Page |
42 from django.core.validators import URLValidator |
43 from django.core.validators import URLValidator |
43 from django.utils.http import urlquote_plus |
44 from django.utils.http import urlquote_plus |
44 import requests |
45 import requests |
45 |
46 |
46 |
47 |
244 return value |
245 return value |
245 |
246 |
246 return hashlib.md5(value).hexdigest() |
247 return hashlib.md5(value).hexdigest() |
247 |
248 |
248 |
249 |
249 |
250 class P4lPaginator(Paginator): |
|
251 |
|
252 def validate_number(self, number): |
|
253 "Validates the given 1-based page number." |
|
254 try: |
|
255 number = int(number) |
|
256 except (TypeError, ValueError): |
|
257 raise PageNotAnInteger('That page number is not an integer') |
|
258 if number < 1: |
|
259 return 1 |
|
260 if number > self.num_pages: |
|
261 if number == 1 and self.allow_empty_first_page: |
|
262 return 1 |
|
263 elif self.num_pages > 0: |
|
264 return self.num_pages |
|
265 else: |
|
266 raise EmptyPage('That page contains no results') |
|
267 return number |
|
268 |
|
269 |
|
270 def page(self, number): |
|
271 page = super(P4lPaginator, self).page(number) |
|
272 return P4lPage(page.object_list, page.number, self) |
|
273 |
|
274 |
|
275 class P4lPage(Page): |
|
276 |
|
277 visible_range = getattr(settings, 'PAGINATOR_VISIBLE_RANGE', 5) |
|
278 start_range = getattr(settings, 'PAGINATOR_START_RANGE', visible_range/2) |
|
279 |
|
280 def __get_start_range(self): |
|
281 return max(1,self.number-self.visible_range/2) |
|
282 |
|
283 def __get_end_range(self): |
|
284 return min(self.paginator.num_pages, self.number+self.visible_range/2) + 1 |
|
285 |
|
286 def visible_page_range(self): |
|
287 start = self.__get_start_range() |
|
288 end = self.__get_end_range() |
|
289 |
|
290 ranges = set(range(1,self.start_range+1)) | set(range(start , end)) | set(range(self.paginator.num_pages - self.start_range +1, self.paginator.num_pages+1)) |
|
291 prev = None |
|
292 res = [] |
|
293 for i in sorted(ranges): |
|
294 if 1 <= i <= self.paginator.num_pages: |
|
295 if prev and i-prev > 1: |
|
296 res.append(0) |
|
297 res.append(i) |
|
298 prev = i |
|
299 return res |
|
300 |
|
301 |