Converted IPAM VRF, Aggregate add/edit/delete views to CBVs

This commit is contained in:
Jeremy Stretch 2016-05-09 12:20:46 -04:00
parent 606255e1ab
commit 60daaee204
6 changed files with 62 additions and 157 deletions

View File

@ -4,22 +4,22 @@ from . import views
urlpatterns = [ urlpatterns = [
url(r'^vrfs/$', views.VRFListView.as_view(), name='vrf_list'), url(r'^vrfs/$', views.VRFListView.as_view(), name='vrf_list'),
url(r'^vrfs/add/$', views.vrf_add, name='vrf_add'), url(r'^vrfs/add/$', views.VRFAddView.as_view(), name='vrf_add'),
url(r'^vrfs/import/$', views.VRFBulkImportView.as_view(), name='vrf_import'), url(r'^vrfs/import/$', views.VRFBulkImportView.as_view(), name='vrf_import'),
url(r'^vrfs/edit/$', views.VRFBulkEditView.as_view(), name='vrf_bulk_edit'), url(r'^vrfs/edit/$', views.VRFBulkEditView.as_view(), name='vrf_bulk_edit'),
url(r'^vrfs/delete/$', views.VRFBulkDeleteView.as_view(), name='vrf_bulk_delete'), url(r'^vrfs/delete/$', views.VRFBulkDeleteView.as_view(), name='vrf_bulk_delete'),
url(r'^vrfs/(?P<pk>\d+)/$', views.vrf, name='vrf'), url(r'^vrfs/(?P<pk>\d+)/$', views.vrf, name='vrf'),
url(r'^vrfs/(?P<pk>\d+)/edit/$', views.vrf_edit, name='vrf_edit'), url(r'^vrfs/(?P<pk>\d+)/edit/$', views.VRFEditView.as_view(), name='vrf_edit'),
url(r'^vrfs/(?P<pk>\d+)/delete/$', views.vrf_delete, name='vrf_delete'), url(r'^vrfs/(?P<pk>\d+)/delete/$', views.VRFDeleteView.as_view(), name='vrf_delete'),
url(r'^aggregates/$', views.AggregateListView.as_view(), name='aggregate_list'), url(r'^aggregates/$', views.AggregateListView.as_view(), name='aggregate_list'),
url(r'^aggregates/add/$', views.aggregate_add, name='aggregate_add'), url(r'^aggregates/add/$', views.AggregateAddView.as_view(), name='aggregate_add'),
url(r'^aggregates/import/$', views.AggregateBulkImportView.as_view(), name='aggregate_import'), url(r'^aggregates/import/$', views.AggregateBulkImportView.as_view(), name='aggregate_import'),
url(r'^aggregates/edit/$', views.AggregateBulkEditView.as_view(), name='aggregate_bulk_edit'), url(r'^aggregates/edit/$', views.AggregateBulkEditView.as_view(), name='aggregate_bulk_edit'),
url(r'^aggregates/delete/$', views.AggregateBulkDeleteView.as_view(), name='aggregate_bulk_delete'), url(r'^aggregates/delete/$', views.AggregateBulkDeleteView.as_view(), name='aggregate_bulk_delete'),
url(r'^aggregates/(?P<pk>\d+)/$', views.aggregate, name='aggregate'), url(r'^aggregates/(?P<pk>\d+)/$', views.aggregate, name='aggregate'),
url(r'^aggregates/(?P<pk>\d+)/edit/$', views.aggregate_edit, name='aggregate_edit'), url(r'^aggregates/(?P<pk>\d+)/edit/$', views.AggregateEditView.as_view(), name='aggregate_edit'),
url(r'^aggregates/(?P<pk>\d+)/delete/$', views.aggregate_delete, name='aggregate_delete'), url(r'^aggregates/(?P<pk>\d+)/delete/$', views.AggregateDeleteView.as_view(), name='aggregate_delete'),
url(r'^prefixes/$', views.PrefixListView.as_view(), name='prefix_list'), url(r'^prefixes/$', views.PrefixListView.as_view(), name='prefix_list'),
url(r'^prefixes/add/$', views.prefix_add, name='prefix_add'), url(r'^prefixes/add/$', views.prefix_add, name='prefix_add'),

View File

@ -15,17 +15,18 @@ from dcim.models import Device
from utilities.error_handlers import handle_protectederror from utilities.error_handlers import handle_protectederror
from utilities.forms import ConfirmationForm from utilities.forms import ConfirmationForm
from utilities.paginator import EnhancedPaginator from utilities.paginator import EnhancedPaginator
from utilities.views import BulkImportView, BulkEditView, BulkDeleteView, ObjectListView from utilities.views import BulkImportView, BulkEditView, BulkDeleteView, ObjectListView, ObjectAddView,\
ObjectEditView, ObjectDeleteView
from .filters import AggregateFilter, PrefixFilter, IPAddressFilter, VLANFilter, VRFFilter from .filters import AggregateFilter, PrefixFilter, IPAddressFilter, VLANFilter, VRFFilter
from .forms import AggregateForm, AggregateImportForm, AggregateBulkEditForm, AggregateBulkDeleteForm, \ from .forms import AggregateForm, AggregateImportForm, AggregateBulkEditForm, AggregateBulkDeleteForm,\
AggregateFilterForm, PrefixForm, PrefixImportForm, PrefixBulkEditForm, PrefixBulkDeleteForm, PrefixFilterForm, \ AggregateFilterForm, PrefixForm, PrefixImportForm, PrefixBulkEditForm, PrefixBulkDeleteForm, PrefixFilterForm,\
IPAddressForm, IPAddressImportForm, IPAddressBulkEditForm, IPAddressBulkDeleteForm, IPAddressFilterForm, VLANForm, \ IPAddressForm, IPAddressImportForm, IPAddressBulkEditForm, IPAddressBulkDeleteForm, IPAddressFilterForm, VLANForm,\
VLANImportForm, VLANBulkEditForm, VLANBulkDeleteForm, VRFForm, VRFImportForm, VRFBulkEditForm, VRFBulkDeleteForm, \ VLANImportForm, VLANBulkEditForm, VLANBulkDeleteForm, VRFForm, VRFImportForm, VRFBulkEditForm, VRFBulkDeleteForm,\
VLANFilterForm VLANFilterForm
from .models import VRF, Aggregate, Prefix, VLAN from .models import VRF, Aggregate, Prefix, VLAN
from .tables import AggregateTable, AggregateBulkEditTable, PrefixTable, PrefixBriefTable, PrefixBulkEditTable, \ from .tables import AggregateTable, AggregateBulkEditTable, PrefixTable, PrefixBriefTable, PrefixBulkEditTable,\
IPAddress, IPAddressBriefTable, IPAddressTable, IPAddressBulkEditTable, VLANTable, VLANBulkEditTable, VRFTable, \ IPAddress, IPAddressBriefTable, IPAddressTable, IPAddressBulkEditTable, VLANTable, VLANBulkEditTable, VRFTable,\
VRFBulkEditTable VRFBulkEditTable
@ -69,74 +70,26 @@ def vrf(request, pk):
}) })
@permission_required('ipam.add_vrf') class VRFAddView(PermissionRequiredMixin, ObjectAddView):
def vrf_add(request): permission_required = 'ipam.add_vrf'
model = VRF
if request.method == 'POST': form_class = VRFForm
form = VRFForm(request.POST) template_name = 'ipam/vrf_edit.html'
if form.is_valid(): cancel_url = 'ipam:vrf_list'
vrf = form.save()
messages.success(request, "Added new VRF: {0}".format(vrf))
if '_addanother' in request.POST:
return redirect('ipam:vrf_add')
else:
return redirect('ipam:vrf', pk=vrf.pk)
else:
form = VRFForm()
return render(request, 'ipam/vrf_edit.html', {
'form': form,
'cancel_url': reverse('ipam:vrf_list'),
})
@permission_required('ipam.change_vrf') class VRFEditView(PermissionRequiredMixin, ObjectEditView):
def vrf_edit(request, pk): permission_required = 'ipam.change_vrf'
model = VRF
vrf = get_object_or_404(VRF, pk=pk) form_class = VRFForm
template_name = 'ipam/vrf_edit.html'
if request.method == 'POST':
form = VRFForm(request.POST, instance=vrf)
if form.is_valid():
vrf = form.save()
messages.success(request, "Modified VRF {0}".format(vrf))
return redirect('ipam:vrf', pk=vrf.pk)
else:
form = VRFForm(instance=vrf)
return render(request, 'ipam/vrf_edit.html', {
'vrf': vrf,
'form': form,
'cancel_url': reverse('ipam:vrf', kwargs={'pk': vrf.pk}),
})
@permission_required('ipam.delete_vrf') class VRFDeleteView(PermissionRequiredMixin, ObjectDeleteView):
def vrf_delete(request, pk): permission_required = 'ipam.delete_vrf'
model = VRF
vrf = get_object_or_404(VRF, pk=pk) template_name = 'ipam/vrf_delete.html'
redirect_url = 'ipam:vrf_list'
if request.method == 'POST':
form = ConfirmationForm(request.POST)
if form.is_valid():
try:
vrf.delete()
messages.success(request, "VRF {0} has been deleted".format(vrf))
return redirect('ipam:vrf_list')
except ProtectedError, e:
handle_protectederror(vrf, request, e)
return redirect('ipam:vrf', pk=vrf.pk)
else:
form = ConfirmationForm()
return render(request, 'ipam/vrf_delete.html', {
'vrf': vrf,
'form': form,
'cancel_url': reverse('ipam:vrf', kwargs={'pk': vrf.pk})
})
class VRFBulkImportView(PermissionRequiredMixin, BulkImportView): class VRFBulkImportView(PermissionRequiredMixin, BulkImportView):
@ -211,74 +164,26 @@ def aggregate(request, pk):
}) })
@permission_required('ipam.add_aggregate') class AggregateAddView(PermissionRequiredMixin, ObjectAddView):
def aggregate_add(request): permission_required = 'ipam.add_aggregate'
model = Aggregate
if request.method == 'POST': form_class = AggregateForm
form = AggregateForm(request.POST) template_name = 'ipam/aggregate_edit.html'
if form.is_valid(): cancel_url = 'ipam:aggregate_list'
aggregate = form.save()
messages.success(request, "Added new aggregate: {0}".format(aggregate.prefix))
if '_addanother' in request.POST:
return redirect('ipam:aggregate_add')
else:
return redirect('ipam:aggregate', pk=aggregate.pk)
else:
form = AggregateForm()
return render(request, 'ipam/aggregate_edit.html', {
'form': form,
'cancel_url': reverse('ipam:aggregate_list'),
})
@permission_required('ipam.change_aggregate') class AggregateEditView(PermissionRequiredMixin, ObjectEditView):
def aggregate_edit(request, pk): permission_required = 'ipam.change_aggregate'
model = Aggregate
aggregate = get_object_or_404(Aggregate, pk=pk) form_class = AggregateForm
template_name = 'ipam/aggregate_edit.html'
if request.method == 'POST':
form = AggregateForm(request.POST, instance=aggregate)
if form.is_valid():
aggregate = form.save()
messages.success(request, "Modified aggregate {0}".format(aggregate.prefix))
return redirect('ipam:aggregate', pk=aggregate.pk)
else:
form = AggregateForm(instance=aggregate)
return render(request, 'ipam/aggregate_edit.html', {
'aggregate': aggregate,
'form': form,
'cancel_url': reverse('ipam:aggregate', kwargs={'pk': aggregate.pk}),
})
@permission_required('ipam.delete_aggregate') class AggregateDeleteView(PermissionRequiredMixin, ObjectDeleteView):
def aggregate_delete(request, pk): permission_required = 'ipam.delete_aggregate'
model = Aggregate
aggregate = get_object_or_404(Aggregate, pk=pk) template_name = 'ipam/aggregate_delete.html'
redirect_url = 'ipam:aggregate_list'
if request.method == 'POST':
form = ConfirmationForm(request.POST)
if form.is_valid():
try:
aggregate.delete()
messages.success(request, "Aggregate {0} has been deleted".format(aggregate))
return redirect('ipam:aggregate_list')
except ProtectedError, e:
handle_protectederror(aggregate, request, e)
return redirect('ipam:aggregate', pk=aggregate.pk)
else:
form = ConfirmationForm()
return render(request, 'ipam/aggregate_delete.html', {
'aggregate': aggregate,
'form': form,
'cancel_url': reverse('ipam:aggregate', kwargs={'pk': aggregate.pk})
})
class AggregateBulkImportView(PermissionRequiredMixin, BulkImportView): class AggregateBulkImportView(PermissionRequiredMixin, BulkImportView):

View File

@ -1,8 +1,8 @@
{% extends 'utilities/confirmation_form.html' %} {% extends 'utilities/confirmation_form.html' %}
{% load form_helpers %} {% load form_helpers %}
{% block title %}Delete aggregate {{ aggregate }}?{% endblock %} {% block title %}Delete aggregate {{ obj }}?{% endblock %}
{% block message %} {% block message %}
<p>Are you sure you want to delete this aggregate?</p> <p>Are you sure you want to delete {{ obj }}?</p>
{% endblock %} {% endblock %}

View File

@ -1,11 +1,11 @@
{% extends '_base.html' %} {% extends '_base.html' %}
{% load form_helpers %} {% load form_helpers %}
{% block title %}Editing aggregate {{ aggregate }}{% endblock %} {% block title %}{% if obj %}Editing aggregate {{ obj }}{% else %}Add a new aggregate{% endif %}{% endblock %}
{% block content %} {% block content %}
{% if aggregate %} {% if obj %}
<h1>{{ aggregate }}</h1> <h1>{{ obj }}</h1>
{% else %} {% else %}
<h1>Add an Aggregate</h1> <h1>Add an Aggregate</h1>
{% endif %} {% endif %}
@ -32,9 +32,9 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
{% if aggregate %} {% if obj %}
<button type="submit" name="_update" class="btn btn-primary">Update</button> <button type="submit" name="_update" class="btn btn-primary">Update</button>
<a href="{% url 'ipam:aggregate' pk=aggregate.pk %}" class="btn btn-default">Cancel</a> <a href="{% url 'ipam:aggregate' pk=obj.pk %}" class="btn btn-default">Cancel</a>
{% else %} {% else %}
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
<button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button> <button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button>

View File

@ -1,20 +1,20 @@
{% extends 'utilities/confirmation_form.html' %} {% extends 'utilities/confirmation_form.html' %}
{% load form_helpers %} {% load form_helpers %}
{% block title %}Delete VRF {{ vrf }}?{% endblock %} {% block title %}Delete VRF {{ obj }}?{% endblock %}
{% block message %} {% block message %}
<p> <p>
Are you sure you want to delete this VRF? Are you sure you want to delete this VRF?
{% if vrf.prefix_set.count %} {% if obj.prefix_set.count %}
The following prefixes will also be deleted: The following prefixes will also be deleted:
{% else %} {% else %}
(There are no prefixes associated with this VRF.) (There are no prefixes associated with this VRF.)
{% endif %} {% endif %}
</p> </p>
{% if vrf.prefix_set.count %} {% if obj.prefix_set.count %}
<ul> <ul>
{% for p in vrf.prefix_set.all %} {% for p in obj.prefix_set.all %}
<li><a href="{% url 'ipam:prefix' pk=p.pk %}">{{ p }}</a></li> <li><a href="{% url 'ipam:prefix' pk=p.pk %}">{{ p }}</a></li>
{% endfor %} {% endfor %}
</ul> </ul>

View File

@ -1,11 +1,11 @@
{% extends '_base.html' %} {% extends '_base.html' %}
{% load form_helpers %} {% load form_helpers %}
{% block title %}{% if vrf %}Editing VRF {{ vrf }}{% else %}Add a VRF{% endif %}{% endblock %} {% block title %}{% if obj %}Editing VRF {{ obj }}{% else %}Add a VRF{% endif %}{% endblock %}
{% block content %} {% block content %}
{% if vrf %} {% if obj %}
<h1>{{ vrf }}</h1> <h1>{{ obj }}</h1>
{% else %} {% else %}
<h1>Add a VRF</h1> <h1>Add a VRF</h1>
{% endif %} {% endif %}
@ -29,9 +29,9 @@
</div> </div>
<div class="form-group"> <div class="form-group">
<div class="col-md-9 col-md-offset-3"> <div class="col-md-9 col-md-offset-3">
{% if vrf %} {% if obj %}
<button type="submit" name="_update" class="btn btn-primary">Update</button> <button type="submit" name="_update" class="btn btn-primary">Update</button>
<a href="{% url 'ipam:vrf' pk=vrf.pk %}" class="btn btn-default">Cancel</a> <a href="{% url 'ipam:vrf' pk=obj.pk %}" class="btn btn-default">Cancel</a>
{% else %} {% else %}
<button type="submit" name="_create" class="btn btn-primary">Create</button> <button type="submit" name="_create" class="btn btn-primary">Create</button>
<button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button> <button type="submit" name="_addanother" class="btn btn-primary">Create and Add Another</button>