Converted IPAM object lists to ObjectListView

This commit is contained in:
Jeremy Stretch 2016-03-04 11:25:20 -05:00
parent 5796d1f385
commit d7e2acbae6
8 changed files with 50 additions and 161 deletions

View File

@ -3,7 +3,7 @@ from django.conf.urls import url
from . import views
urlpatterns = [
url(r'^vrfs/$', views.vrf_list, 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/import/$', views.VRFBulkImportView.as_view(), name='vrf_import'),
url(r'^vrfs/edit/$', views.VRFBulkEditView.as_view(), name='vrf_bulk_edit'),
@ -12,7 +12,7 @@ urlpatterns = [
url(r'^vrfs/(?P<pk>\d+)/edit/$', views.vrf_edit, name='vrf_edit'),
url(r'^vrfs/(?P<pk>\d+)/delete/$', views.vrf_delete, name='vrf_delete'),
url(r'^aggregates/$', views.aggregate_list, 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/import/$', views.AggregateBulkImportView.as_view(), name='aggregate_import'),
url(r'^aggregates/edit/$', views.AggregateBulkEditView.as_view(), name='aggregate_bulk_edit'),
@ -21,7 +21,7 @@ urlpatterns = [
url(r'^aggregates/(?P<pk>\d+)/edit/$', views.aggregate_edit, name='aggregate_edit'),
url(r'^aggregates/(?P<pk>\d+)/delete/$', views.aggregate_delete, name='aggregate_delete'),
url(r'^prefixes/$', views.prefix_list, 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/import/$', views.PrefixBulkImportView.as_view(), name='prefix_import'),
url(r'^prefixes/edit/$', views.PrefixBulkEditView.as_view(), name='prefix_bulk_edit'),
@ -31,7 +31,7 @@ urlpatterns = [
url(r'^prefixes/(?P<pk>\d+)/delete/$', views.prefix_delete, name='prefix_delete'),
url(r'^prefixes/(?P<pk>\d+)/ip-addresses/$', views.prefix_ipaddresses, name='prefix_ipaddresses'),
url(r'^ip-addresses/$', views.ipaddress_list, name='ipaddress_list'),
url(r'^ip-addresses/$', views.IPAddressListView.as_view(), name='ipaddress_list'),
url(r'^ip-addresses/add/$', views.ipaddress_add, name='ipaddress_add'),
url(r'^ip-addresses/import/$', views.IPAddressBulkImportView.as_view(), name='ipaddress_import'),
url(r'^ip-addresses/edit/$', views.IPAddressBulkEditView.as_view(), name='ipaddress_bulk_edit'),
@ -40,7 +40,7 @@ urlpatterns = [
url(r'^ip-addresses/(?P<pk>\d+)/edit/$', views.ipaddress_edit, name='ipaddress_edit'),
url(r'^ip-addresses/(?P<pk>\d+)/delete/$', views.ipaddress_delete, name='ipaddress_delete'),
url(r'^vlans/$', views.vlan_list, name='vlan_list'),
url(r'^vlans/$', views.VLANListView.as_view(), name='vlan_list'),
url(r'^vlans/add/$', views.vlan_add, name='vlan_add'),
url(r'^vlans/import/$', views.VLANBulkImportView.as_view(), name='vlan_import'),
url(r'^vlans/edit/$', views.VLANBulkEditView.as_view(), name='vlan_bulk_edit'),

View File

@ -1,5 +1,4 @@
from netaddr import IPNetwork, IPSet
from netaddr.core import AddrFormatError
from netaddr import IPSet
from django_tables2 import RequestConfig
from django.conf import settings
@ -13,11 +12,10 @@ from django.shortcuts import get_object_or_404, redirect, render
from django.utils.http import urlencode
from dcim.models import Device
from extras.models import ExportTemplate
from utilities.error_handlers import handle_protectederror
from utilities.forms import ConfirmationForm
from utilities.paginator import EnhancedPaginator
from utilities.views import BulkImportView, BulkEditView, BulkDeleteView
from utilities.views import BulkImportView, BulkEditView, BulkDeleteView, ObjectListView
from .filters import AggregateFilter, PrefixFilter, IPAddressFilter, VLANFilter, VRFFilter
from .forms import AggregateForm, AggregateImportForm, AggregateBulkEditForm, AggregateBulkDeleteForm, \
@ -51,30 +49,13 @@ def add_available_prefixes(parent, prefix_list):
# VRFs
#
def vrf_list(request):
class VRFListView(ObjectListView):
queryset = VRF.objects.all()
queryset = VRFFilter(request.GET, queryset).qs
# annotate_depth(queryset)
# Export
if 'export' in request.GET:
et = get_object_or_404(ExportTemplate, content_type__model='vrf', name=request.GET.get('export'))
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_vrfs')
return response
if request.user.has_perm('ipam.change_vrf') or request.user.has_perm('ipam.delete_vrf'):
vrf_table = VRFBulkEditTable(queryset)
else:
vrf_table = VRFTable(queryset)
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(vrf_table)
export_templates = ExportTemplate.objects.filter(content_type__model='vrf')
return render(request, 'ipam/vrf_list.html', {
'vrf_table': vrf_table,
'export_templates': export_templates,
})
filter = VRFFilter
table = VRFTable
edit_table = VRFBulkEditTable
edit_table_permissions = ['ipam.change_vrf', 'ipam.delete_vrf']
template_name = 'ipam/vrf_list.html'
def vrf(request, pk):
@ -196,35 +177,16 @@ class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# Aggregates
#
def aggregate_list(request):
queryset = Aggregate.objects.select_related('rir').extra(
select = {
'child_count': 'SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix',
}
)
queryset = AggregateFilter(request.GET, queryset).qs
# Export
if 'export' in request.GET:
et = get_object_or_404(ExportTemplate, content_type__model='aggregate', name=request.GET.get('export'))
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_aggregates')
return response
if request.user.has_perm('ipam.change_aggregate') or request.user.has_perm('ipam.delete_aggregate'):
aggregate_table = AggregateBulkEditTable(queryset)
else:
aggregate_table = AggregateTable(queryset)
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator})\
.configure(aggregate_table)
export_templates = ExportTemplate.objects.filter(content_type__model='aggregate')
return render(request, 'ipam/aggregate_list.html', {
'aggregate_table': aggregate_table,
'export_templates': export_templates,
'filter_form': AggregateFilterForm(request.GET, label_suffix=''),
class AggregateListView(ObjectListView):
queryset = Aggregate.objects.select_related('rir').extra(select={
'child_count': 'SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix',
})
filter = AggregateFilter
filter_form = AggregateFilterForm
table = AggregateTable
edit_table = AggregateBulkEditTable
edit_table_permissions = ['ipam.change_aggregate', 'ipam.delete_aggregate']
template_name = 'ipam/aggregate_list.html'
def aggregate(request, pk):
@ -357,34 +319,14 @@ class AggregateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# Prefixes
#
def prefix_list(request):
class PrefixListView(ObjectListView):
queryset = Prefix.objects.select_related('site', 'status', 'role')
queryset = PrefixFilter(request.GET, queryset).qs
# Export
if 'export' in request.GET:
et = get_object_or_404(ExportTemplate, content_type__model='prefix', name=request.GET.get('export'))
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_prefixes')
return response
# Show only top-level prefixes by default
limit = None if request.GET.get('expand') else 0
prefixes = queryset.annotate_depth(limit=limit)
if request.user.has_perm('ipam.change_prefix') or request.user.has_perm('ipam.delete_prefix'):
prefix_table = PrefixBulkEditTable(prefixes)
else:
prefix_table = PrefixTable(prefixes)
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(prefix_table)
export_templates = ExportTemplate.objects.filter(content_type__model='prefix')
return render(request, 'ipam/prefix_list.html', {
'prefix_table': prefix_table,
'export_templates': export_templates,
'filter_form': PrefixFilterForm(request.GET, label_suffix=''),
})
filter = PrefixFilter
filter_form = PrefixFilterForm
table = PrefixTable
edit_table = PrefixBulkEditTable
edit_table_permissions = ['ipam.change_prefix', 'ipam.delete_prefix']
template_name = 'ipam/prefix_list.html'
def prefix(request, pk):
@ -568,41 +510,14 @@ def prefix_ipaddresses(request, pk):
# IP addresses
#
def ipaddress_list(request):
class IPAddressListView(ObjectListView):
queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'primary_for')
queryset = IPAddressFilter(request.GET, queryset).qs
# Export
if 'export' in request.GET:
et = get_object_or_404(ExportTemplate, content_type__model='ipaddress', name=request.GET.get('export'))
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_ips')
return response
if request.user.has_perm('ipam.change_ipaddress') or request.user.has_perm('ipam.delete_ipaddress'):
ip_table = IPAddressBulkEditTable(queryset)
else:
ip_table = IPAddressTable(queryset)
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(ip_table)
export_templates = ExportTemplate.objects.filter(content_type__model='ipaddress')
# If searching and no IPAddresses were found, include a list of parent prefixes matching the query
prefix_table = None
if request.GET.get('q') and not queryset:
try:
ip = str(IPNetwork(request.GET.get('q')))
prefix_table = PrefixTable(Prefix.objects.filter(prefix__net_contains_or_equals=ip))
RequestConfig(request).configure(prefix_table)
except AddrFormatError:
pass
return render(request, 'ipam/ipaddress_list.html', {
'ip_table': ip_table,
'prefix_table': prefix_table,
'export_templates': export_templates,
'filter_form': IPAddressFilterForm(request.GET, label_suffix=''),
})
filter = IPAddressFilter
filter_form = IPAddressFilterForm
table = IPAddressTable
edit_table = IPAddressBulkEditTable
edit_table_permissions = ['ipam.change_ipaddress', 'ipam.delete_ipaddress']
template_name = 'ipam/ipaddress_list.html'
def ipaddress(request, pk):
@ -755,30 +670,14 @@ class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# VLANs
#
def vlan_list(request):
class VLANListView(ObjectListView):
queryset = VLAN.objects.select_related('site', 'status', 'role')
queryset = VLANFilter(request.GET, queryset).qs
# Export
if 'export' in request.GET:
et = get_object_or_404(ExportTemplate, content_type__model='vlan', name=request.GET.get('export'))
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_vlans')
return response
if request.user.has_perm('ipam.change_vlan') or request.user.has_perm('ipam.delete_vlan'):
vlan_table = VLANBulkEditTable(queryset)
else:
vlan_table = VLANTable(queryset)
RequestConfig(request, paginate={'per_page': settings.PAGINATE_COUNT, 'klass': EnhancedPaginator}).configure(vlan_table)
export_templates = ExportTemplate.objects.filter(content_type__model='vlan')
return render(request, 'ipam/vlan_list.html', {
'vlan_table': vlan_table,
'export_templates': export_templates,
'filter_form': VLANFilterForm(request.GET, label_suffix=''),
})
filter = VLANFilter
filter_form = VLANFilterForm
table = VLANTable
edit_table = VLANBulkEditTable
edit_table_permissions = ['ipam.change_vlan', 'ipam.delete_vlan']
template_name = 'ipam/vlan_list.html'
def vlan(request, pk):

View File

@ -28,7 +28,7 @@
<h1>Aggregates</h1>
<div class="row">
<div class="col-md-9">
{% include 'ipam/inc/aggregate_table.html' with table=aggregate_table %}
{% include 'ipam/inc/aggregate_table.html' %}
</div>
<div class="col-md-3">
{% include 'inc/filter_panel.html' %}

View File

@ -2,7 +2,7 @@
{% if perms.ipam.change_vrf or perms.ipam.delete_vrf %}
<form method="post" class="form form-horizontal">
{% csrf_token %}
{% render_table vrf_table 'table.html' %}
{% render_table table table_template|default:'table.html' %}
{% if perms.ipam.change_vrf %}
<button type="submit" name="_edit" formaction="{% url 'ipam:vrf_bulk_edit' %}" class="btn btn-warning btn-sm">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span>
@ -17,5 +17,5 @@
{% endif %}
</form>
{% else %}
{% render_table vrf_table 'table.html' %}
{% render_table table table_template|default:'table.html' %}
{% endif %}

View File

@ -33,17 +33,7 @@
<h1>IP Addresses</h1>
<div class="row">
<div class="col-md-9">
{% if not ip_table.rows and prefix_table.rows %}
<div class="alert alert-warning alert-dismissable" role="alert">
<button type="button" class="close" data-dismiss="alert" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
No IP addresses were found. However, a <a href="{% url 'ipam:prefix_list' %}?q={{ request.GET.q }}">prefix search</a> returned the following results.
</div>
{% render_table prefix_table 'table.html' %}
{% else %}
{% include 'ipam/inc/ipaddress_table.html' with table=ip_table %}
{% endif %}
{% include 'ipam/inc/ipaddress_table.html' %}
</div>
<div class="col-md-3">
<div class="panel panel-default">

View File

@ -33,7 +33,7 @@
<h1>Prefixes</h1>
<div class="row">
<div class="col-md-9">
{% include 'ipam/inc/prefix_table.html' with table=prefix_table %}
{% include 'ipam/inc/prefix_table.html' %}
</div>
<div class="col-md-3">
<div class="panel panel-default">

View File

@ -33,7 +33,7 @@
<h1>VLANs</h1>
<div class="row">
<div class="col-md-9">
{% include 'ipam/inc/vlan_table.html' with table=vlan_table %}
{% include 'ipam/inc/vlan_table.html' %}
</div>
<div class="col-md-3">
<div class="panel panel-default">

View File

@ -33,7 +33,7 @@
<h1>VRFs</h1>
<div class="row">
<div class="col-md-9">
{% include 'ipam/inc/vrf_table.html' with table=vrf_table %}
{% include 'ipam/inc/vrf_table.html' %}
</div>
<div class="col-md-3">
<div class="panel panel-default">