src/p4l/utils.py
changeset 161 216b3f9582aa
parent 145 7c6fe1dab213
equal deleted inserted replaced
160:470ea7806537 161:216b3f9582aa
    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