aboutsummaryrefslogtreecommitdiffstats
path: root/mediagoblin/util.py
diff options
context:
space:
mode:
authorChristopher Allan Webber <cwebber@dustycloud.org>2011-05-19 22:34:57 -0500
committerChristopher Allan Webber <cwebber@dustycloud.org>2011-05-19 22:34:57 -0500
commitaf4d0b5cb0de2cbc9dd78a791fd77dab3dbddaa5 (patch)
tree3d5399b6d7c036c4cd78db6645eb72ed35123b39 /mediagoblin/util.py
parenta67fec8177c09c4e74ce7f4301b88f4e7ea6e658 (diff)
parent3eb6fc4f2f2b0a41677ab88bdd941b79e3e87b39 (diff)
downloadmediagoblin-af4d0b5cb0de2cbc9dd78a791fd77dab3dbddaa5.tar.lz
mediagoblin-af4d0b5cb0de2cbc9dd78a791fd77dab3dbddaa5.tar.xz
mediagoblin-af4d0b5cb0de2cbc9dd78a791fd77dab3dbddaa5.zip
Merge remote branch 'remotes/hanaku/pagination'
Conflicts: mediagoblin/user_pages/views.py
Diffstat (limited to 'mediagoblin/util.py')
-rw-r--r--mediagoblin/util.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/mediagoblin/util.py b/mediagoblin/util.py
index 680ff62e..b05aad1d 100644
--- a/mediagoblin/util.py
+++ b/mediagoblin/util.py
@@ -26,6 +26,11 @@ import translitcodec
from mediagoblin import globals as mgoblin_globals
+import urllib
+from math import ceil
+import copy
+import decorators
+from webob import exc
TESTS_ENABLED = False
def _activate_testing():
@@ -290,3 +295,66 @@ def setup_gettext(locale):
mgoblin_globals.setup_globals(
translations=this_gettext)
+
+
+class Pagination(object):
+ """
+ Pagination class,
+ initialization through __init__(self, cursor, page=1, per_page=2):
+ get actual data slice through __call__()
+ """
+
+ def __init__(self, page, cursor, per_page=2):
+ """
+ initializes Pagination
+ -- page, requested page
+ -- per_page, number of objects per page
+ -- cursor, db cursor
+ """
+ self.page = page
+ self.per_page = per_page
+ self.cursor = cursor
+ self.total_count = self.cursor.count()
+
+ def __call__(self):
+ """
+ returns slice of objects for the requested page
+ """
+ return self.cursor.skip((self.page-1)*self.per_page) \
+ .limit(self.per_page)
+
+ @property
+ def pages(self):
+ return int(ceil(self.total_count / float(self.per_page)))
+
+ @property
+ def has_prev(self):
+ return self.page > 1
+
+ @property
+ def has_next(self):
+ return self.page < self.pages
+
+ def iter_pages(self, left_edge=2, left_current=2,
+ right_current=5, right_edge=2):
+ last = 0
+ for num in xrange(1, self.pages + 1):
+ if num <= left_edge or \
+ (num > self.page - left_current - 1 and \
+ num < self.page + right_current) or \
+ num > self.pages - right_edge:
+ if last + 1 != num:
+ yield None
+ yield num
+ last = num
+
+ def get_page_url(self, path_info, page_no, get_params=None):
+ """
+ Get a new page based of the path_info, the new page number,
+ and existing get parameters.
+ """
+ new_get_params = copy.copy(get_params or {})
+ new_get_params['page'] = page_no
+ return "%s?%s" % (
+ path_info, urllib.urlencode(new_get_params))
+