diff -r 470ea7806537 -r 216b3f9582aa src/p4l/utils.py --- 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