[buildinfo.debian.net] 14/35: Add paginator utility

Chris Lamb chris at chris-lamb.co.uk
Thu Nov 3 19:02:24 UTC 2016


This is an automated email from the git hooks/post-receive script.

lamby pushed a commit to branch master
in repository buildinfo.debian.net.

commit bc9f5c4e925445aedd79b6cf6669aed035cb4919
Author: Chris Lamb <lamby at debian.org>
Date:   Sun Oct 23 20:48:02 2016 +0200

    Add paginator utility
    
    Signed-off-by: Chris Lamb <lamby at debian.org>
---
 bidb/settings/defaults/__init__.py    |  2 ++
 bidb/utils/paginator.py               | 30 +++++++++++++++++++++++++++++
 bidb/utils/templatetags/__init__.py   |  0
 bidb/utils/templatetags/pagination.py | 36 +++++++++++++++++++++++++++++++++++
 templates/includes/pagination.html    | 21 ++++++++++++++++++++
 5 files changed, 89 insertions(+)

diff --git a/bidb/settings/defaults/__init__.py b/bidb/settings/defaults/__init__.py
index a4fd21d..78d8366 100644
--- a/bidb/settings/defaults/__init__.py
+++ b/bidb/settings/defaults/__init__.py
@@ -69,6 +69,8 @@ TEMPLATES = [
             'builtins': [
                 'django.contrib.humanize.templatetags.humanize',
                 'django.contrib.staticfiles.templatetags.staticfiles',
+
+                'bidb.utils.templatetags.pagination',
             ],
         },
     },
diff --git a/bidb/utils/paginator.py b/bidb/utils/paginator.py
new file mode 100644
index 0000000..307e72f
--- /dev/null
+++ b/bidb/utils/paginator.py
@@ -0,0 +1,30 @@
+from django.core.paginator import Paginator, EmptyPage, Page
+
+class AutoPaginator(Paginator):
+    def __init__(self, request, *args, **kwargs):
+        self.request = request
+        self.default = kwargs.pop('default', 1)
+        super(AutoPaginator, self).__init__(*args, **kwargs)
+
+    def current_page(self):
+        try:
+            page = int(self.request.GET['page'])
+
+            if page <= 0:
+                raise ValueError()
+        except (ValueError, KeyError):
+            page = self.default
+
+        try:
+            return self.page(page)
+        except EmptyPage:
+            return Page([], page, self)
+
+    def validate_number(self, number):
+        """
+        Our version ignores EmptyPage.
+        """
+        try:
+            return max(1, int(number))
+        except (TypeError, ValueError):
+            return 1
diff --git a/bidb/utils/templatetags/__init__.py b/bidb/utils/templatetags/__init__.py
new file mode 100644
index 0000000..e69de29
diff --git a/bidb/utils/templatetags/pagination.py b/bidb/utils/templatetags/pagination.py
new file mode 100644
index 0000000..ec7de6e
--- /dev/null
+++ b/bidb/utils/templatetags/pagination.py
@@ -0,0 +1,36 @@
+from django import template
+
+register = template.Library()
+
+ at register.filter
+def paginator(querydict, page_number):
+    querydict = querydict.copy()
+    querydict['page'] = page_number
+
+    if page_number == 1:
+        querydict.pop('page')
+
+    return querydict.urlencode()
+
+class PaginationNode(template.Node):
+    def __init__(self, page_var, template_file):
+        self.page_var = template.Variable(page_var)
+        self.template_name = template_file
+
+    def render(self, context):
+        # page_var should always be a variable
+        page = self.page_var.resolve(context)
+
+        if not getattr(self, 'nodelist_page', False):
+            t = template.loader.get_template(self.template_name)
+            self.nodelist_page = t.nodelist
+
+        context.push()
+
+        context['page'] = page
+        context['_page_url_maker'] = page.paginator.page_linker
+
+        output = self.nodelist_page.render(context)
+        context.pop()
+
+        return output
diff --git a/templates/includes/pagination.html b/templates/includes/pagination.html
new file mode 100644
index 0000000..9a6df2b
--- /dev/null
+++ b/templates/includes/pagination.html
@@ -0,0 +1,21 @@
+{% if page.has_previous or page.has_next %}
+<ul class="pagination pagination-sm">
+  {% if page.has_previous %}
+    <li><a href="?{{ request.GET|paginator:page.previous_page_number }}">«</a></li>
+  {% else %}
+    <li class="disabled"><a href="#">«</a></li>
+  {% endif %}
+
+  {% for number in page.paginator.page_range %}
+  <li class="{% if page.number == number %}active{% endif %}">
+    <a href="?{{ request.GET|paginator:number }}">{{ number }}</a>
+  </li>
+  {% endfor %}
+
+  {% if page.has_next %}
+    <li><a href="?{{ request.GET|paginator:page.next_page_number }}">»</a></li>
+  {% else %}
+    <li class="disabled"><a href="#">»</a></li>
+  {% endif %}
+</ul>
+{% endif %}

-- 
Alioth's /usr/local/bin/git-commit-notice on /srv/git.debian.org/git/reproducible/buildinfo.debian.net.git



More information about the Reproducible-commits mailing list