From 6b24f45e97061a7bafa9af1a7efd21311892bcc4 Mon Sep 17 00:00:00 2001 From: Michael Elkins Date: Sun, 25 Nov 2012 04:21:51 +0000 Subject: do not display part of the vcard that are disallowed by RFC add new roa detail view, displaying covered routes use {% url %} to get the url instead of hardcoding it in templates add some missing title params to buttons remove edit button from generic object detail modify labels for validation statuses to use the label- suffix required by bootstrap 2.2.x don't use object_detail for the repository_detail view remove stub get_absolute_url() methods where they were previously used as placeholders svn path=/branches/tk329/; revision=4900 --- rpkid/portal-gui/settings.py.in | 3 -- rpkid/rpki/gui/app/forms.py | 18 +------ rpkid/rpki/gui/app/models.py | 8 +-- rpkid/rpki/gui/app/templates/app/child_detail.html | 3 +- .../rpki/gui/app/templates/app/client_detail.html | 24 ++++----- rpkid/rpki/gui/app/templates/app/dashboard.html | 11 ++-- .../templates/app/ghostbusterrequest_detail.html | 7 ++- .../app/templates/app/object_confirm_delete.html | 4 +- .../rpki/gui/app/templates/app/object_detail.html | 3 +- .../rpki/gui/app/templates/app/parent_detail.html | 2 +- rpkid/rpki/gui/app/templates/app/roa_detail.html | 25 +++++++++ rpkid/rpki/gui/app/templates/app/user_list.html | 10 ++-- rpkid/rpki/gui/app/urls.py | 3 +- rpkid/rpki/gui/app/views.py | 61 ++++++++++------------ 14 files changed, 92 insertions(+), 90 deletions(-) create mode 100644 rpkid/rpki/gui/app/templates/app/roa_detail.html diff --git a/rpkid/portal-gui/settings.py.in b/rpkid/portal-gui/settings.py.in index 2b87629f..0c939c28 100644 --- a/rpkid/portal-gui/settings.py.in +++ b/rpkid/portal-gui/settings.py.in @@ -107,6 +107,3 @@ TEMPLATE_CONTEXT_PROCESSORS = ( ) STATIC_URL = '/static/' - -# whether or not to force rpkid to run its cron job immediately after a change -RPKID_RUN = False diff --git a/rpkid/rpki/gui/app/forms.py b/rpkid/rpki/gui/app/forms.py index 74874d49..1057ee01 100644 --- a/rpkid/rpki/gui/app/forms.py +++ b/rpkid/rpki/gui/app/forms.py @@ -58,11 +58,6 @@ class GhostbusterRequestForm(forms.ModelForm): parent = forms.ModelChoiceField(queryset=None, required=False, help_text='Specify specific parent, or none for all parents') - # override full_name. it is required in the db schema, but we allow the - # user to skip it and default from family+given name - full_name = forms.CharField(max_length=40, required=False, - help_text='automatically generated from family and given names if left blank') - #override issuer = forms.ModelChoiceField(queryset=None, widget=forms.HiddenInput) @@ -77,14 +72,10 @@ class GhostbusterRequestForm(forms.ModelForm): class Meta: model = models.GhostbusterRequest - exclude = ('vcard') + exclude = ('vcard', 'given_name', 'family_name', 'additional_name', + 'honorific_prefix', 'honorific_suffix') def clean(self): - family_name = self.cleaned_data.get('family_name') - given_name = self.cleaned_data.get('given_name') - if not all([family_name, given_name]): - raise forms.ValidationError('Family and Given names must be specified') - email = self.cleaned_data.get('email_address') postal = self.cleaned_data.get('postal_address') telephone = self.cleaned_data.get('telephone') @@ -92,11 +83,6 @@ class GhostbusterRequestForm(forms.ModelForm): raise forms.ValidationError( 'One of telephone, email or postal address must be specified') - # if the full name is not specified, default to given+family - fn = self.cleaned_data.get('full_name') - if not fn: - self.cleaned_data['full_name'] = '%s %s' % (given_name, family_name) - return self.cleaned_data diff --git a/rpkid/rpki/gui/app/models.py b/rpkid/rpki/gui/app/models.py index 0ed01aa8..2975aa0a 100644 --- a/rpkid/rpki/gui/app/models.py +++ b/rpkid/rpki/gui/app/models.py @@ -119,10 +119,6 @@ class Conf(rpki.irdb.models.ResourceHolderCA): def roas(self): return ROARequest.objects.filter(issuer=self) - @models.permalink - def get_absolute_url(self): - return ('rpki.gui.app.views.user_detail', [str(self.pk)]) - class Meta: proxy = True @@ -184,11 +180,9 @@ class ROARequest(rpki.irdb.models.ROARequest): class ROARequestPrefix(rpki.irdb.models.ROARequestPrefix): class Meta: proxy = True - verbose_name = 'ROA' def __unicode__(self): - return u'ROA request prefix %s for asn %d' % (str(self.as_roa_prefix()), - self.roa_request.asn) + return u'ROA Request Prefix %s' % str(self.as_roa_prefix()) class GhostbusterRequest(rpki.irdb.models.GhostbusterRequest): diff --git a/rpkid/rpki/gui/app/templates/app/child_detail.html b/rpkid/rpki/gui/app/templates/app/child_detail.html index 8d62a278..0c6a4922 100644 --- a/rpkid/rpki/gui/app/templates/app/child_detail.html +++ b/rpkid/rpki/gui/app/templates/app/child_detail.html @@ -47,8 +47,9 @@ {% endblock object_display %} {% block action %} -{{ block.super }} + Edit AS Prefix Export +{{ block.super }} {% endblock action %} diff --git a/rpkid/rpki/gui/app/templates/app/client_detail.html b/rpkid/rpki/gui/app/templates/app/client_detail.html index 0638e05b..bb9ea212 100644 --- a/rpkid/rpki/gui/app/templates/app/client_detail.html +++ b/rpkid/rpki/gui/app/templates/app/client_detail.html @@ -2,19 +2,17 @@ {% block object_display %}
-
-

Name -

-
-

{{ object.handle }} -

-
-
-
-

SIA -

-
-

{{ object.sia_base }} +

+ + + + + + + + + +
Name{{ object.handle }}
SIA{{ object.sia_base }}
{% endblock object_display %} diff --git a/rpkid/rpki/gui/app/templates/app/dashboard.html b/rpkid/rpki/gui/app/templates/app/dashboard.html index 71398115..d7a660c4 100644 --- a/rpkid/rpki/gui/app/templates/app/dashboard.html +++ b/rpkid/rpki/gui/app/templates/app/dashboard.html @@ -105,6 +105,7 @@ {{ roa.prefixes.all.0.max_prefixlen }} {{ roa.asn }} + @@ -126,6 +127,7 @@ {{ gbr.email_address }} {{ gbr.telephone }} + @@ -142,11 +144,12 @@

Children

+ {% for child in conf.children %} {% endfor %} @@ -163,7 +166,7 @@ {% endfor %} @@ -183,7 +186,7 @@ {% endfor %} @@ -201,7 +204,7 @@ {% endfor %} diff --git a/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html index f4cb3c0f..abaa7560 100644 --- a/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html +++ b/rpkid/rpki/gui/app/templates/app/ghostbusterrequest_detail.html @@ -2,7 +2,7 @@ {% block object_display %}
Handle
{{ child.handle }} - +
{{ parent.handle }} - +
{{ repo.handle }} - +
{{ client.handle }} - +
- + {% if object.honorific_prefix %} @@ -50,3 +50,8 @@
Full Name{{ object.full_name }}
Full Name{{ object.full_name }}
Honorific Prefix{{ object.honorific_prefix }}
{% endblock object_display %} + +{% block action %} +{{ block.super }} + Edit +{% endblock %} diff --git a/rpkid/rpki/gui/app/templates/app/object_confirm_delete.html b/rpkid/rpki/gui/app/templates/app/object_confirm_delete.html index da60409e..821b70b5 100644 --- a/rpkid/rpki/gui/app/templates/app/object_confirm_delete.html +++ b/rpkid/rpki/gui/app/templates/app/object_confirm_delete.html @@ -16,7 +16,7 @@ string specifying the concrete template to inherit from.
{% csrf_token %} - - Cancel + + Cancel
{% endblock %} diff --git a/rpkid/rpki/gui/app/templates/app/object_detail.html b/rpkid/rpki/gui/app/templates/app/object_detail.html index 131e24cc..81fdbdf0 100644 --- a/rpkid/rpki/gui/app/templates/app/object_detail.html +++ b/rpkid/rpki/gui/app/templates/app/object_detail.html @@ -12,8 +12,7 @@ {% endblock object_display %} {% block action %} - Edit - Delete + Delete {% endblock action %} {% endblock content %} diff --git a/rpkid/rpki/gui/app/templates/app/parent_detail.html b/rpkid/rpki/gui/app/templates/app/parent_detail.html index 591de843..c50d37e5 100644 --- a/rpkid/rpki/gui/app/templates/app/parent_detail.html +++ b/rpkid/rpki/gui/app/templates/app/parent_detail.html @@ -59,5 +59,5 @@ {% block action %} {{ block.super }} -Export + Export {% endblock action %} diff --git a/rpkid/rpki/gui/app/templates/app/roa_detail.html b/rpkid/rpki/gui/app/templates/app/roa_detail.html new file mode 100644 index 00000000..5500941f --- /dev/null +++ b/rpkid/rpki/gui/app/templates/app/roa_detail.html @@ -0,0 +1,25 @@ +{% extends "app/object_detail.html" %} + +{% block object_display %} +
+
+ + + + + + + +
PrefixMax LengthAS
{{ object.prefixes.all.0.as_roa_prefix }}{{ object.prefixes.all.0.max_prefixlen }}{{ object.asn }}
+
+
+

Covered Routes

+ + + {% for r in routes %} + + {% endfor %} +
PrefixAS
{{ r.as_resource_range }}{{ r.asn }}
+
+
+{% endblock %} diff --git a/rpkid/rpki/gui/app/templates/app/user_list.html b/rpkid/rpki/gui/app/templates/app/user_list.html index 607e5a9c..fed943f0 100644 --- a/rpkid/rpki/gui/app/templates/app/user_list.html +++ b/rpkid/rpki/gui/app/templates/app/user_list.html @@ -9,21 +9,19 @@ Username Email - Action + {% for u in users %} {{ u.0.handle }} {{ u.1.email }} - Edit - Delete + + {% endfor %} -
- Create -
+Create {% endblock content %} diff --git a/rpkid/rpki/gui/app/urls.py b/rpkid/rpki/gui/app/urls.py index 99e0c7dc..c8dfaf1f 100644 --- a/rpkid/rpki/gui/app/urls.py +++ b/rpkid/rpki/gui/app/urls.py @@ -49,15 +49,14 @@ urlpatterns = patterns( (r'^repo/import$', views.repository_import), (r'^repo/(?P\d+)/$', views.repository_detail), (r'^repo/(?P\d+)/delete$', views.repository_delete), + (r'^roa/(?P\d+)/$', views.roa_detail), (r'^roa/create$', views.roa_create), (r'^roa/confirm$', views.roa_create_confirm), (r'^roa/(?P\d+)/delete$', views.roa_delete), (r'^route/$', views.route_view), - (r'^route/(?P\d+)/$', views.route_detail), (r'^route/(?P\d+)/roa/$', views.route_roa_list), (r'^user/$', views.user_list), (r'^user/create$', views.user_create), - (r'^user/(?P\d+)/$', views.user_detail), (r'^user/(?P\d+)/delete$', views.user_delete), (r'^user/(?P\d+)/edit$', views.user_edit), ) diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py index 05d6380b..1a8be108 100644 --- a/rpkid/rpki/gui/app/views.py +++ b/rpkid/rpki/gui/app/views.py @@ -29,11 +29,9 @@ from django.contrib.auth.decorators import login_required from django.shortcuts import get_object_or_404, render from django.utils.http import urlquote from django import http -from django.views.generic.list_detail import object_detail from django.core.urlresolvers import reverse, reverse_lazy from django.contrib.auth.models import User from django.views.generic import DetailView, CreateView, UpdateView, DeleteView -from django.conf import settings from rpki.irdb import Zookeeper, ChildASN, ChildNet from rpki.gui.app import models, forms, glue, range_list @@ -41,7 +39,8 @@ from rpki.resource_set import (resource_range_as, resource_range_ipv4, resource_range_ipv6, roa_prefix_ipv4) from rpki import sundial -from rpki.gui.cacheview.models import ROAPrefixV4, ROAPrefixV6, ROA +from rpki.gui.cacheview.models import ROAPrefixV4, ROA +from rpki.gui.routeview.models import RouteOrigin def superuser_required(f): @@ -321,9 +320,7 @@ def child_add_prefix(request, pk): version = 'IPv4' child.address_ranges.create(start_ip=str(r.min), end_ip=str(r.max), version=version) - z = Zookeeper(handle=conf.handle, logstream=logstream) - if settings.RPKID_RUN: - z.run_rpkid_now() + Zookeeper(handle=conf.handle, logstream=logstream).run_rpkid_now() return http.HttpResponseRedirect(child.get_absolute_url()) else: form = forms.AddNetForm(child=child) @@ -342,9 +339,7 @@ def child_add_asn(request, pk): asns = form.cleaned_data.get('asns') r = resource_range_as.parse_str(asns) child.asns.create(start_as=r.min, end_as=r.max) - if settings.RPKID_RUN: - z = Zookeeper(handle=conf.handle, logstream=logstream) - z.run_rpkid_now() + Zookeeper(handle=conf.handle, logstream=logstream).run_rpkid_now() return http.HttpResponseRedirect(child.get_absolute_url()) else: form = forms.AddASNForm(child=child) @@ -373,8 +368,7 @@ def child_edit(request, pk): # remove AS & prefixes that are not selected in the form models.ChildASN.objects.filter(child=child).exclude(pk__in=form.cleaned_data.get('as_ranges')).delete() models.ChildNet.objects.filter(child=child).exclude(pk__in=form.cleaned_data.get('address_ranges')).delete() - if settings.RPKID_RUN: - Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now() + Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now() return http.HttpResponseRedirect(child.get_absolute_url()) else: form = form_class(initial={ @@ -424,6 +418,19 @@ def child_delete(request, pk): }) +@handle_required +def roa_detail(request, pk): + conf = request.session['handle'] + obj = get_object_or_404(conf.roas, pk=pk) + pfx = obj.prefixes.all()[0].as_resource_range() + routes = RouteOrigin.objects.filter(prefix_min__gte=pfx.min, + prefix_max__lte=pfx.max) + return render(request, 'app/roa_detail.html', { + 'object': obj, + 'routes': routes, + }) + + @handle_required def roa_create(request): """Present the user with a form to create a ROA. @@ -507,8 +514,7 @@ def roa_create_confirm(request): roa.prefixes.create(version=v, prefix=str(rng.min), prefixlen=rng.prefixlen(), max_prefixlen=max_prefixlen) - if settings.RPKID_RUN: - Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now() + Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now() return http.HttpResponseRedirect(reverse(dashboard)) # What should happen when the submission form isn't valid? For now # just fall through and redirect back to the ROA creation form @@ -528,8 +534,7 @@ def roa_delete(request, pk): roa = get_object_or_404(conf.roas, pk=pk) if request.method == 'POST': roa.delete() - if settings.RPKID_RUN: - Zookeeper(handle=conf.handle).run_rpkid_now() + Zookeeper(handle=conf.handle).run_rpkid_now() return http.HttpResponseRedirect(reverse(dashboard)) ### Process GET ### @@ -620,7 +625,9 @@ def roa_match(rng): pfx = 'prefixes' rv = [] - for obj in route_manager.filter(prefix_min__gte=rng.min, prefix_max__lte=rng.max): + # return a max of 50 routes + for obj in route_manager.filter(prefix_min__gte=rng.min, + prefix_max__lte=rng.max)[:50]: # This is a bit of a gross hack, since the foreign keys for v4 and v6 # prefixes have different names. args = {'%s__prefix_min__lte' % pfx: obj.prefix_min, @@ -646,17 +653,17 @@ def validate_route(route, roas): # 2. if the candidate ROA set is empty, end with unknown if not roas.exists(): route.status = 'unknown' - route.status_label = 'warning' + route.status_label = 'label-warning' # 3. if any candidate roa matches the origin AS and max_length, end with # valid # # AS0 is always invalid. elif route.asn != 0 and roas.filter(**args).exists(): - route.status_label = 'success' + route.status_label = 'label-success' route.status = 'valid' # 4. otherwise the route is invalid else: - route.status_label = 'important' + route.status_label = 'label-important' route.status = 'invalid' return route @@ -687,10 +694,6 @@ def route_view(request): {'routes': routes, 'timestamp': ts}) -def route_detail(request, pk): - pass - - def route_roa_list(request, pk): """Show a list of ROAs that match a given route.""" object = get_object_or_404(models.RouteOrigin, pk=pk) @@ -703,9 +706,9 @@ def route_roa_list(request, pk): @handle_required def repository_detail(request, pk): conf = request.session['handle'] - qs = models.Repository.objects.filter(issuer=conf) - return object_detail(request, queryset=qs, object_id=pk, - template_name='app/repository_detail.html') + return render(request, + 'app/repository_detail.html', + {'object': get_object_or_404(conf.repositories, pk=pk)}) @handle_required @@ -797,12 +800,6 @@ def user_list(request): return render(request, 'app/user_list.html', {'users': users}) -@superuser_required -def user_detail(request): - """Placeholder for Conf.get_absolute_url().""" - pass - - @superuser_required def user_delete(request, pk): conf = models.Conf.objects.get(pk=pk) -- cgit v1.2.3