summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--hyperkitty/lib/paginator.py101
-rw-r--r--hyperkitty/lib/view_helpers.py39
-rw-r--r--hyperkitty/tests/test_lib.py3
-rw-r--r--hyperkitty/views/accounts.py3
-rw-r--r--hyperkitty/views/list.py3
-rw-r--r--hyperkitty/views/search.py2
6 files changed, 108 insertions, 43 deletions
diff --git a/hyperkitty/lib/paginator.py b/hyperkitty/lib/paginator.py
new file mode 100644
index 0000000..301649d
--- /dev/null
+++ b/hyperkitty/lib/paginator.py
@@ -0,0 +1,101 @@
+#-*- coding: utf-8 -*-
+# Copyright (C) 1998-2012 by the Free Software Foundation, Inc.
+#
+# This file is part of HyperKitty.
+#
+# HyperKitty is free software: you can redistribute it and/or modify it under
+# the terms of the GNU General Public License as published by the Free
+# Software Foundation, either version 3 of the License, or (at your option)
+# any later version.
+#
+# HyperKitty is distributed in the hope that it will be useful, but WITHOUT
+# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+# FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
+# more details.
+#
+# You should have received a copy of the GNU General Public License along with
+# HyperKitty. If not, see <http://www.gnu.org/licenses/>.
+#
+# Author: Aurelien Bompard <abompard@fedoraproject.org>
+#
+
+
+from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger, Page
+from django.utils import six
+from storm.store import ResultSet
+
+
+class StormPaginator(Paginator):
+
+ def page(self, number):
+ "Returns a Page object for the given 1-based page number."
+ number = self.validate_number(number)
+ bottom = (number - 1) * self.per_page
+ top = bottom + self.per_page
+ if top + self.orphans >= self.count:
+ top = self.count
+ #return StormPage(self.object_list[bottom:top], number, self)
+ return Page(list(self.object_list[bottom:top]), number, self)
+
+class StormPage(Page):
+
+ def __len__(self):
+ return self.paginator.per_page
+
+ def __getitem__(self, index):
+ if not isinstance(index, (slice,) + six.integer_types):
+ raise TypeError
+ # The object_list is converted to a list so that if it was a QuerySet
+ # it won't be a database hit per __getitem__.
+ return list(self.object_list)[index]
+ #return self.object_list[index]
+
+ def __iter__(self):
+ for obj in self.object_list:
+ yield obj
+
+ def __contains__(self, item):
+ return self.object_list.__contains__(item)
+
+
+def paginate(objects, page_num, max_page_range=10, paginator=None):
+ try:
+ page_num = int(page_num)
+ except (TypeError, ValueError):
+ page_num = 1
+ if paginator is None:
+ # else use the provided instance
+ if isinstance(objects, ResultSet):
+ paginator = StormPaginator(objects, 10)
+ else:
+ paginator = Paginator(objects, 10)
+ 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
+
diff --git a/hyperkitty/lib/view_helpers.py b/hyperkitty/lib/view_helpers.py
index 1352c27..fb8e897 100644
--- a/hyperkitty/lib/view_helpers.py
+++ b/hyperkitty/lib/view_helpers.py
@@ -22,7 +22,6 @@
import datetime
-from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
from django.utils.timezone import utc
from hyperkitty.models import ThreadCategory, LastView
@@ -80,44 +79,6 @@ def daterange(start_date, end_date):
yield start_date + datetime.timedelta(n)
-def paginate(objects, page_num, max_page_range=10, paginator=None):
- try:
- page_num = int(page_num)
- except (TypeError, ValueError):
- page_num = 1
- 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
-
-
def get_category_widget(request=None, current_category=None):
"""
Returns the category form and the applicable category object (or None if no
diff --git a/hyperkitty/tests/test_lib.py b/hyperkitty/tests/test_lib.py
index 0f31fe1..289a590 100644
--- a/hyperkitty/tests/test_lib.py
+++ b/hyperkitty/tests/test_lib.py
@@ -25,8 +25,9 @@ from django.contrib.auth.models import User, AnonymousUser
from django.core.cache import cache
from hyperkitty.models import Rating
-from hyperkitty.lib.view_helpers import get_display_dates, paginate
+from hyperkitty.lib.view_helpers import get_display_dates
from hyperkitty.lib.voting import set_thread_votes
+from hyperkitty.lib.paginator import paginate
from hyperkitty.tests.utils import TestCase
diff --git a/hyperkitty/views/accounts.py b/hyperkitty/views/accounts.py
index aa95ece..836d524 100644
--- a/hyperkitty/views/accounts.py
+++ b/hyperkitty/views/accounts.py
@@ -41,7 +41,8 @@ import mailmanclient
from hyperkitty.models import UserProfile, Rating, Favorite, LastView
from hyperkitty.views.forms import RegistrationForm, UserProfileForm
from hyperkitty.lib import get_store
-from hyperkitty.lib.view_helpers import FLASH_MESSAGES, paginate
+from hyperkitty.lib.view_helpers import FLASH_MESSAGES
+from hyperkitty.lib.paginator import paginate
from hyperkitty.lib.mailman import get_subscriptions, is_mlist_authorized
from hyperkitty.lib.voting import set_message_votes
diff --git a/hyperkitty/views/list.py b/hyperkitty/views/list.py
index d994ba1..b04e757 100644
--- a/hyperkitty/views/list.py
+++ b/hyperkitty/views/list.py
@@ -34,9 +34,10 @@ from django.http import Http404, HttpResponse
from hyperkitty.models import Tag, Favorite
from hyperkitty.lib import get_store
-from hyperkitty.lib.view_helpers import FLASH_MESSAGES, paginate, \
+from hyperkitty.lib.view_helpers import FLASH_MESSAGES, \
get_category_widget, get_months, get_display_dates, daterange, \
is_thread_unread, get_recent_list_activity
+from hyperkitty.lib.paginator import paginate
from hyperkitty.lib.voting import set_message_votes, set_thread_votes
from hyperkitty.lib.mailman import check_mlist_private
diff --git a/hyperkitty/views/search.py b/hyperkitty/views/search.py
index 300a047..64530a3 100644
--- a/hyperkitty/views/search.py
+++ b/hyperkitty/views/search.py
@@ -26,7 +26,7 @@ from django.http import Http404
from hyperkitty.models import Tag
from hyperkitty.lib import get_store
-from hyperkitty.lib.view_helpers import paginate
+from hyperkitty.lib.paginator import paginate
from hyperkitty.lib.voting import set_message_votes
from hyperkitty.views.list import _thread_list