diff options
author | Paul Eggleton <paul.eggleton@linux.intel.com> | 2013-02-19 15:08:03 +0000 |
---|---|---|
committer | Paul Eggleton <paul.eggleton@linux.intel.com> | 2013-02-19 18:28:48 +0000 |
commit | 02f7ca3b2dea36c21341fec2986177bdd6402d06 (patch) | |
tree | 4a8c6cdfa65b06ea39c184af470e996519a536cc /layerindex/templatetags | |
parent | 430ae4f90e8953a0f1c91842bb2eb291ab9b92df (diff) | |
download | openembedded-core-contrib-02f7ca3b2dea36c21341fec2986177bdd6402d06.tar.gz |
Improve pagination for recipe list
Use a Django snippet to make pagination display a bit nicer (compressed
form instead of showing all page numbers). In order to interact properly
with GET requests, an additional snippet was required to add parameters
to the URL (why doesn't Django provide this out of the box?).
Signed-off-by: Paul Eggleton <paul.eggleton@linux.intel.com>
Diffstat (limited to 'layerindex/templatetags')
-rw-r--r-- | layerindex/templatetags/__init__.py | 0 | ||||
-rw-r--r-- | layerindex/templatetags/addurlparameter.py | 29 | ||||
-rw-r--r-- | layerindex/templatetags/pagination.py | 52 |
3 files changed, 81 insertions, 0 deletions
diff --git a/layerindex/templatetags/__init__.py b/layerindex/templatetags/__init__.py new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/layerindex/templatetags/__init__.py diff --git a/layerindex/templatetags/addurlparameter.py b/layerindex/templatetags/addurlparameter.py new file mode 100644 index 0000000000..58a454a754 --- /dev/null +++ b/layerindex/templatetags/addurlparameter.py @@ -0,0 +1,29 @@ +# Borrowed from http://djangosnippets.org/snippets/361/ +# Original author: johan de taeye +# With modifications from Ludwik Trammer +# +# Adds GET parameters to the current URL + +from django.template import Library, Node, resolve_variable, TemplateSyntaxError, Variable + +register = Library() + +class AddParameter(Node): + def __init__(self, varname, value): + self.varname = Variable(varname) + self.value = Variable(value) + + def render(self, context): + req = Variable('request').resolve(context) + params = req.GET.copy() + params[self.varname.resolve(context)] = self.value.resolve(context) + return '%s?%s' % (req.path, params.urlencode()) + +def addurlparameter(parser, token): + from re import split + bits = split(r'\s+', token.contents, 2) + if len(bits) < 2: + raise TemplateSyntaxError, "'%s' tag requires two arguments" % bits[0] + return AddParameter(bits[1],bits[2]) + +register.tag('addurlparameter', addurlparameter) diff --git a/layerindex/templatetags/pagination.py b/layerindex/templatetags/pagination.py new file mode 100644 index 0000000000..aa3175fca3 --- /dev/null +++ b/layerindex/templatetags/pagination.py @@ -0,0 +1,52 @@ +# Borrowed from http://djangosnippets.org/snippets/2199/ +# +# Digg-like page numbering using inclusion tag + +from django import template + +register = template.Library() + +@register.inclusion_tag('pagination.html', takes_context=True) +def pagination(context, page, begin_pages=2, end_pages=2, before_current_pages=4, after_current_pages=4): + # Digg-like pages + before = max(page.number - before_current_pages - 1, 0) + after = page.number + after_current_pages + + begin = page.paginator.page_range[:begin_pages] + middle = page.paginator.page_range[before:after] + end = page.paginator.page_range[-end_pages:] + last_page_number = end[-1] + + def collides(firstlist, secondlist): + """ Returns true if lists collides (have same entries) + + >>> collides([1,2,3,4],[3,4,5,6,7]) + True + >>> collides([1,2,3,4],[5,6,7]) + False + """ + return any(item in secondlist for item in firstlist) + + # If middle and end has same entries, then end is what we want + if collides(middle, end): + end = range(max(page.number-before_current_pages, 1), last_page_number+1) + + middle = [] + + # If begin and middle ranges has same entries, then begin is what we want + if collides(begin, middle): + begin = range(1, min(page.number + after_current_pages, last_page_number)+1) + + middle = [] + + # If begin and end has same entries then begin is what we want + if collides(begin, end): + begin = range(1, last_page_number+1) + end = [] + + context.update({'page' : page, + 'begin' : begin, + 'middle' : middle, + 'end' : end}) + + return context |