aboutsummaryrefslogtreecommitdiff
path: root/rpkid/rpki/gui/app/views.py
diff options
context:
space:
mode:
Diffstat (limited to 'rpkid/rpki/gui/app/views.py')
-rw-r--r--rpkid/rpki/gui/app/views.py121
1 files changed, 70 insertions, 51 deletions
diff --git a/rpkid/rpki/gui/app/views.py b/rpkid/rpki/gui/app/views.py
index 02f145b3..02830dd0 100644
--- a/rpkid/rpki/gui/app/views.py
+++ b/rpkid/rpki/gui/app/views.py
@@ -31,15 +31,14 @@ from django.utils.http import urlquote
from django.template import RequestContext
from django import http
from django.views.generic.list_detail import object_list, object_detail
-from django.views.generic.create_update import delete_object
from django.core.urlresolvers import reverse
from django.contrib.auth.models import User
+from django.contrib.formtools.preview import FormPreview
from rpki.irdb import Zookeeper, ChildASN, ChildNet
from rpki.gui.app import models, forms, glue, range_list
from rpki.resource_set import (resource_range_as, resource_range_ipv4,
resource_range_ipv6, roa_prefix_ipv4)
-from rpki.exceptions import BadIPResource
from rpki import sundial
from rpki.gui.cacheview.models import ROAPrefixV4, ROAPrefixV6, ROA
@@ -339,61 +338,81 @@ def child_list(request):
'create_label': 'Import'})
-@handle_required
-def child_add_resource(request, pk, form_class, unused_list, callback,
- template_name='app/child_add_resource_form.html'):
- conf = request.session['handle']
- child = models.Child.objects.get(issuer=conf, pk=pk)
- log = request.META['wsgi.errors']
- if request.method == 'POST':
- form = form_class(request.POST, request.FILES)
- if form.is_valid():
- callback(child, form)
- Zookeeper(handle=conf.handle, logstream=log).run_rpkid_now()
- return http.HttpResponseRedirect(child.get_absolute_url())
- else:
- form = form_class()
-
- return render(request, template_name,
- {'object': child, 'form': form, 'unused': unused_list})
-
-
-def add_asn_callback(child, form):
- asns = form.cleaned_data.get('asns')
- r = resource_range_as.parse_str(asns)
- child.asns.create(start_as=r.min, end_as=r.max)
-
-
-def child_add_asn(request, pk):
- conf = request.session['handle']
- get_object_or_404(models.Child, issuer=conf, pk=pk)
- qs = models.ResourceRangeAS.objects.filter(cert__conf=conf)
- return child_add_resource(request, pk, forms.AddASNForm(qs), [],
- add_asn_callback)
-
+class ChildAddResourcePreview(FormPreview):
+ """
+ Base class for handling preview of AS/Prefix additions to a child.
+ Subclasses implement the 'done' method to perform actual work on IRDB.
-def add_address_callback(child, form):
- address_range = form.cleaned_data.get('address_range')
- if ':' in address_range:
- r = resource_range_ipv6.parse_str(address_range)
- version = 'IPv6'
- else:
- r = resource_range_ipv4.parse_str(address_range)
- version = 'IPv4'
- child.address_ranges.create(start_ip=str(r.min), end_ip=str(r.max),
- version=version)
+ """
+ form_template = 'app/child_detail.html'
+ preview_template = 'app/child_detail.html'
+
+ def __init__(self, *args, **kwargs):
+ """
+ The docstring for FormPreview says we should not redefine this method, but
+ I don't see how we can set extra information in this class otherwise.
+
+ """
+ self.child = kwargs.pop('child')
+ self.logstream = kwargs.pop('logstream')
+ super(ChildAddResourcePreview, self).__init__(*args, **kwargs)
+
+ def get_context(self, *args, **kwargs):
+ """"
+ Override the superclass method to add context variables needed by the
+ form template.
+
+ """
+ d = super(ChildAddResourcePreview, self).get_context(*args, **kwargs)
+ d['object'] = self.child
+ d['form_label'] = 'Add Resource'
+ return d
+
+ def process_preview(self, request, form, context):
+ # set a boolean flag so that the template knows this is a preview
+ context['is_preview'] = True
+
+
+class ChildAddPrefixPreview(ChildAddResourcePreview):
+ def done(self, request, cleaned_data):
+ address_range = cleaned_data.get('address_range')
+ if ':' in address_range:
+ r = resource_range_ipv6.parse_str(address_range)
+ version = 'IPv6'
+ else:
+ r = resource_range_ipv4.parse_str(address_range)
+ version = 'IPv4'
+ self.child.address_ranges.create(start_ip=str(r.min), end_ip=str(r.max),
+ version=version)
+ Zookeeper(handle=self.child.issuer.handle, logstream=self.logstream).run_rpkid_now()
+ return http.HttpResponseRedirect(self.child.get_absolute_url())
+@handle_required
def child_add_address(request, pk):
+ logstream = request.META['wsgi.errors']
conf = request.session['handle']
- get_object_or_404(models.Child, issuer=conf, pk=pk)
- qsv4 = models.ResourceRangeAddressV4.objects.filter(cert__conf=conf)
- qsv6 = models.ResourceRangeAddressV6.objects.filter(cert__conf=conf)
- return child_add_resource(request, pk,
- forms.AddNetForm(qsv4, qsv6),
- [],
- callback=add_address_callback)
+ child = get_object_or_404(models.Child, issuer=conf, pk=pk)
+ form = forms.AddNetForm(child)
+ preview = ChildAddPrefixPreview(form, child=child, logstream=logstream)
+ return preview(request)
+
+class ChildAddASNPreview(ChildAddResourcePreview):
+ def done(self, request, cleaned_data):
+ asns = cleaned_data.get('asns')
+ r = resource_range_as.parse_str(asns)
+ self.child.asns.create(start_as=r.min, end_as=r.max)
+ Zookeeper(handle=self.child.issuer.handle, logstream=self.logstream).run_rpkid_now()
+ return http.HttpResponseRedirect(self.child.get_absolute_url())
+@handle_required
+def child_add_asn(request, pk):
+ logstream = request.META['wsgi.errors']
+ conf = request.session['handle']
+ child = get_object_or_404(models.Child, issuer=conf, pk=pk)
+ form = forms.AddASNForm(child)
+ preview = ChildAddASNPreview(form, child=child, logstream=logstream)
+ return preview(request)
@handle_required
def child_view(request, pk):