diff options
author | Michael Elkins <melkins@tislabs.com> | 2013-02-21 18:37:01 +0000 |
---|---|---|
committer | Michael Elkins <melkins@tislabs.com> | 2013-02-21 18:37:01 +0000 |
commit | 2ccd83627db9c376ad285c0bcea697cbb21b0e09 (patch) | |
tree | 47e6fb242f7074cbea6a872a6c5db2e9205f8330 | |
parent | d03ec2d3721d2b9b640fd44a0e7c9775494f5729 (diff) |
add support for breaking the route view into multiple pages
svn path=/trunk/; revision=5053
-rw-r--r-- | rpkid/rpki/gui/app/templates/app/routes_view.html | 4 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/templatetags/bootstrap_pager.py | 39 | ||||
-rw-r--r-- | rpkid/rpki/gui/app/views.py | 8 |
3 files changed, 50 insertions, 1 deletions
diff --git a/rpkid/rpki/gui/app/templates/app/routes_view.html b/rpkid/rpki/gui/app/templates/app/routes_view.html index a1406398..f9b0ffad 100644 --- a/rpkid/rpki/gui/app/templates/app/routes_view.html +++ b/rpkid/rpki/gui/app/templates/app/routes_view.html @@ -1,5 +1,7 @@ {% extends "app/app_base.html" %} +{% load bootstrap_pager %} + {% block sidebar_extra %} <p> BGP data updated<br> @@ -38,4 +40,6 @@ This view shows currently advertised routes for the prefixes listed in resource {% endfor %} </table> +{% bootstrap_pager request routes %} + {% endblock %} diff --git a/rpkid/rpki/gui/app/templatetags/bootstrap_pager.py b/rpkid/rpki/gui/app/templatetags/bootstrap_pager.py new file mode 100644 index 00000000..be7d7ca3 --- /dev/null +++ b/rpkid/rpki/gui/app/templatetags/bootstrap_pager.py @@ -0,0 +1,39 @@ +from django import template + +register = template.Library() + + +class BootstrapPagerNode(template.Node): + def __init__(self, request, pager_object): + self.request = template.Variable(request) + self.pager_object = template.Variable(pager_object) + + def render(self, context): + request = self.request.resolve(context) + pager_object = self.pager_object.resolve(context) + r = ['<div class="pagination"><ul>'] + if pager_object.number == 1: + r.append('<li class="disabled"><a>«</a></li>') + else: + r.append('<li><a href="%s?page=%d">«</a></li>' % (request.path, pager_object.number - 1)) + + for i in pager_object.paginator.page_range: + r.append('<li %s><a href="%s?page=%d">%d</a></li>' % ('' if i != pager_object.number else 'class="active"', request.path, i, i)) + + + if pager_object.number < pager_object.paginator.num_pages: + r.append('<li><a href="%s?page=%d">»</a></li>' % (request.path, pager_object.number + 1)) + else: + r.append('<li class="disabled"><a>»</a></li>') + + r.append('</ul></div>') + return '\n'.join(r) + + +@register.tag +def bootstrap_pager(parser, token): + try: + tag_name, request, pager_object = token.split_contents() + except ValueError: + raise template.TemplateSyntaxError("%r tag requires two arguments" % token.contents.split()[0]) + return BootstrapPagerNode(request, pager_object) diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py index 08e43605..de4ea488 100644 --- a/rpkid/rpki/gui/app/views.py +++ b/rpkid/rpki/gui/app/views.py @@ -32,6 +32,7 @@ from django import http from django.core.urlresolvers import reverse from django.contrib.auth.models import User from django.views.generic import DetailView +from django.core.paginator import Paginator from rpki.irdb import Zookeeper, ChildASN, ChildNet from rpki.gui.app import models, forms, glue, range_list @@ -716,6 +717,8 @@ def route_view(request): """ conf = request.session['handle'] log = request.META['wsgi.errors'] + count = request.GET.get('count', 25) + page = request.GET.get('page', 1) routes = [] for p in models.ResourceRangeAddressV4.objects.filter(cert__conf=conf): @@ -727,9 +730,12 @@ def route_view(request): print >>log, 'querying for routes matching %s' % r routes.extend([validate_route(*x) for x in roa_match(r)]) + paginator = Paginator(routes, count) + content = paginator.page(page) + ts = dict((attr['name'], attr['ts']) for attr in models.Timestamp.objects.values()) return render(request, 'app/routes_view.html', - {'routes': routes, 'timestamp': ts}) + {'routes': content, 'timestamp': ts}) def route_detail(request, pk): |