summaryrefslogtreecommitdiffstats
path: root/hyperkitty/lib
diff options
context:
space:
mode:
authorAurélien Bompard <aurelien@bompard.org>2013-06-06 20:07:06 +0200
committerAurélien Bompard <aurelien@bompard.org>2013-06-06 20:07:06 +0200
commit28ebf918ca25ba170bb8ad0ac3e2c740d34f9301 (patch)
tree6808590c2f6ba39b1e48a789a9d790e9b0968d5c /hyperkitty/lib
parentc0047ae6ec63a5ed745f733efca51ce332a296da (diff)
downloadhyperkitty-28ebf918ca25ba170bb8ad0ac3e2c740d34f9301.tar.gz
hyperkitty-28ebf918ca25ba170bb8ad0ac3e2c740d34f9301.tar.xz
hyperkitty-28ebf918ca25ba170bb8ad0ac3e2c740d34f9301.zip
Greatly improve the pager
Diffstat (limited to 'hyperkitty/lib')
-rw-r--r--hyperkitty/lib/__init__.py36
1 files changed, 36 insertions, 0 deletions
diff --git a/hyperkitty/lib/__init__.py b/hyperkitty/lib/__init__.py
index 40b065f..e5d35a4 100644
--- a/hyperkitty/lib/__init__.py
+++ b/hyperkitty/lib/__init__.py
@@ -25,6 +25,7 @@ import datetime
from django.core.exceptions import SuspiciousOperation
from django.core.mail import EmailMessage
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from mailmanclient import MailmanConnectionError
from hyperkitty.lib import mailman
@@ -126,3 +127,38 @@ def post_to_list(request, mlist, subject, message, headers={}):
headers=headers,
)
msg.send()
+
+
+def paginate(objects, page_num, max_page_range=10, paginator=None):
+ if paginator is None:
+ paginator = Paginator(objects, 10) # else use the provided instance
+ try:
+ objects = paginator.page(page_num)
+ except PageNotAnInteger:
+ # If page is not an integer, deliver first page.
+ objects = paginator.page(1)
+ except EmptyPage:
+ # If page is out of range (e.g. 9999), deliver last page of results.
+ objects = paginator.page(paginator.num_pages)
+ # Calculate the displayed page range
+ if paginator.num_pages > max_page_range:
+ objects.page_range = [ 1 ]
+ subrange_lower = page_num - (max_page_range / 2 - 2)
+ if subrange_lower > 3:
+ objects.page_range.append("...")
+ else:
+ subrange_lower = 2
+ objects.page_range.extend(range(subrange_lower, page_num))
+ if page_num != 1 and page_num != 100:
+ objects.page_range.append(page_num)
+ subrange_upper = page_num + (max_page_range / 2 - 2)
+ if subrange_upper >= paginator.num_pages - 2:
+ subrange_upper = paginator.num_pages - 1
+ objects.page_range.extend(range(page_num+1, subrange_upper+1))
+ if subrange_upper < paginator.num_pages - 2:
+ objects.page_range.append("...")
+ objects.page_range.append(paginator.num_pages)
+ else:
+ objects.page_range = [ p+1 for p in range(paginator.num_pages) ]
+ return objects
+