aboutsummaryrefslogtreecommitdiffstats
path: root/layerindex/templatetags
diff options
context:
space:
mode:
authorPaul Eggleton <paul.eggleton@linux.intel.com>2013-02-19 15:08:03 +0000
committerPaul Eggleton <paul.eggleton@linux.intel.com>2013-02-19 18:28:48 +0000
commit02f7ca3b2dea36c21341fec2986177bdd6402d06 (patch)
tree4a8c6cdfa65b06ea39c184af470e996519a536cc /layerindex/templatetags
parent430ae4f90e8953a0f1c91842bb2eb291ab9b92df (diff)
downloadopenembedded-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__.py0
-rw-r--r--layerindex/templatetags/addurlparameter.py29
-rw-r--r--layerindex/templatetags/pagination.py52
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