aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Elkins <melkins@tislabs.com>2013-02-21 18:37:01 +0000
committerMichael Elkins <melkins@tislabs.com>2013-02-21 18:37:01 +0000
commit2ccd83627db9c376ad285c0bcea697cbb21b0e09 (patch)
tree47e6fb242f7074cbea6a872a6c5db2e9205f8330
parentd03ec2d3721d2b9b640fd44a0e7c9775494f5729 (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.html4
-rw-r--r--rpkid/rpki/gui/app/templatetags/bootstrap_pager.py39
-rw-r--r--rpkid/rpki/gui/app/views.py8
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>&laquo;</a></li>')
+ else:
+ r.append('<li><a href="%s?page=%d">&laquo;</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">&raquo;</a></li>' % (request.path, pager_object.number + 1))
+ else:
+ r.append('<li class="disabled"><a>&raquo;</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):