diff options
author | Aurélien Bompard <aurelien@bompard.org> | 2013-06-06 20:07:06 +0200 |
---|---|---|
committer | Aurélien Bompard <aurelien@bompard.org> | 2013-06-06 20:07:06 +0200 |
commit | 28ebf918ca25ba170bb8ad0ac3e2c740d34f9301 (patch) | |
tree | 6808590c2f6ba39b1e48a789a9d790e9b0968d5c /hyperkitty/lib | |
parent | c0047ae6ec63a5ed745f733efca51ce332a296da (diff) | |
download | hyperkitty-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__.py | 36 |
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 + |