src/p4l/utils.py
changeset 161 216b3f9582aa
parent 145 7c6fe1dab213
--- a/src/p4l/utils.py	Tue Dec 03 13:54:30 2013 +0100
+++ b/src/p4l/utils.py	Tue Dec 03 20:55:04 2013 +0100
@@ -32,13 +32,14 @@
 #
 
 import codecs
+import hashlib
 import logging
 import math
-import hashlib
 import sys
 import unicodedata
 
 from django.conf import settings
+from django.core.paginator import Paginator, PageNotAnInteger, EmptyPage, Page
 from django.core.validators import URLValidator
 from django.utils.http import urlquote_plus
 import requests
@@ -246,4 +247,55 @@
     return hashlib.md5(value).hexdigest()
 
 
+class P4lPaginator(Paginator):
+
+    def validate_number(self, number):
+        "Validates the given 1-based page number."
+        try:
+            number = int(number)
+        except (TypeError, ValueError):
+            raise PageNotAnInteger('That page number is not an integer')
+        if number < 1:
+            return 1
+        if number > self.num_pages:
+            if number == 1 and self.allow_empty_first_page:
+                return 1
+            elif self.num_pages > 0: 
+                return self.num_pages
+            else:
+                raise EmptyPage('That page contains no results')
+        return number
+
+    
+    def page(self, number):        
+        page = super(P4lPaginator, self).page(number)
+        return P4lPage(page.object_list, page.number, self)
+
+
+class P4lPage(Page):
+    
+    visible_range = getattr(settings, 'PAGINATOR_VISIBLE_RANGE', 5)
+    start_range = getattr(settings, 'PAGINATOR_START_RANGE', visible_range/2)
+        
+    def __get_start_range(self):
+        return max(1,self.number-self.visible_range/2)
+    
+    def __get_end_range(self):
+        return min(self.paginator.num_pages, self.number+self.visible_range/2) + 1
+    
+    def visible_page_range(self):        
+        start = self.__get_start_range()
+        end = self.__get_end_range()
+                
+        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))
+        prev = None
+        res = []
+        for i in sorted(ranges):
+            if 1 <= i <= self.paginator.num_pages:
+                if prev and i-prev > 1:
+                    res.append(0)
+                res.append(i)
+                prev = i
+        return res
+
     
\ No newline at end of file