1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

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 from . import views
urlpatterns = [ 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/add/$', views.vrf_add, 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'),
@ -12,7 +12,7 @@ urlpatterns = [
url(r'^vrfs/(?P<pk>\d+)/edit/$', views.vrf_edit, name='vrf_edit'), 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'^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/add/$', views.aggregate_add, 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'),
@ -21,7 +21,7 @@ urlpatterns = [
url(r'^aggregates/(?P<pk>\d+)/edit/$', views.aggregate_edit, name='aggregate_edit'), 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'^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/add/$', views.prefix_add, name='prefix_add'),
url(r'^prefixes/import/$', views.PrefixBulkImportView.as_view(), name='prefix_import'), url(r'^prefixes/import/$', views.PrefixBulkImportView.as_view(), name='prefix_import'),
url(r'^prefixes/edit/$', views.PrefixBulkEditView.as_view(), name='prefix_bulk_edit'), 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+)/delete/$', views.prefix_delete, name='prefix_delete'),
url(r'^prefixes/(?P<pk>\d+)/ip-addresses/$', views.prefix_ipaddresses, name='prefix_ipaddresses'), 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/add/$', views.ipaddress_add, name='ipaddress_add'),
url(r'^ip-addresses/import/$', views.IPAddressBulkImportView.as_view(), name='ipaddress_import'), 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'), 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+)/edit/$', views.ipaddress_edit, name='ipaddress_edit'),
url(r'^ip-addresses/(?P<pk>\d+)/delete/$', views.ipaddress_delete, name='ipaddress_delete'), 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/add/$', views.vlan_add, name='vlan_add'),
url(r'^vlans/import/$', views.VLANBulkImportView.as_view(), name='vlan_import'), url(r'^vlans/import/$', views.VLANBulkImportView.as_view(), name='vlan_import'),
url(r'^vlans/edit/$', views.VLANBulkEditView.as_view(), name='vlan_bulk_edit'), 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 import IPSet
from netaddr.core import AddrFormatError
from django_tables2 import RequestConfig from django_tables2 import RequestConfig
from django.conf import settings 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 django.utils.http import urlencode
from dcim.models import Device from dcim.models import Device
from extras.models import ExportTemplate
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 from utilities.views import BulkImportView, BulkEditView, BulkDeleteView, ObjectListView
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, \
@ -51,30 +49,13 @@ def add_available_prefixes(parent, prefix_list):
# VRFs # VRFs
# #
def vrf_list(request): class VRFListView(ObjectListView):
queryset = VRF.objects.all() queryset = VRF.objects.all()
queryset = VRFFilter(request.GET, queryset).qs filter = VRFFilter
# annotate_depth(queryset) table = VRFTable
edit_table = VRFBulkEditTable
# Export edit_table_permissions = ['ipam.change_vrf', 'ipam.delete_vrf']
if 'export' in request.GET: template_name = 'ipam/vrf_list.html'
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,
})
def vrf(request, pk): def vrf(request, pk):
@ -196,35 +177,16 @@ class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# Aggregates # Aggregates
# #
def aggregate_list(request): class AggregateListView(ObjectListView):
queryset = Aggregate.objects.select_related('rir').extra(select={
queryset = Aggregate.objects.select_related('rir').extra( 'child_count': 'SELECT COUNT(*) FROM ipam_prefix WHERE ipam_prefix.prefix <<= ipam_aggregate.prefix',
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=''),
}) })
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): def aggregate(request, pk):
@ -357,34 +319,14 @@ class AggregateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# Prefixes # Prefixes
# #
def prefix_list(request): class PrefixListView(ObjectListView):
queryset = Prefix.objects.select_related('site', 'status', 'role') queryset = Prefix.objects.select_related('site', 'status', 'role')
queryset = PrefixFilter(request.GET, queryset).qs filter = PrefixFilter
filter_form = PrefixFilterForm
# Export table = PrefixTable
if 'export' in request.GET: edit_table = PrefixBulkEditTable
et = get_object_or_404(ExportTemplate, content_type__model='prefix', name=request.GET.get('export')) edit_table_permissions = ['ipam.change_prefix', 'ipam.delete_prefix']
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_prefixes') template_name = 'ipam/prefix_list.html'
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=''),
})
def prefix(request, pk): def prefix(request, pk):
@ -568,41 +510,14 @@ def prefix_ipaddresses(request, pk):
# IP addresses # IP addresses
# #
def ipaddress_list(request): class IPAddressListView(ObjectListView):
queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'primary_for') queryset = IPAddress.objects.select_related('vrf', 'interface__device', 'primary_for')
queryset = IPAddressFilter(request.GET, queryset).qs filter = IPAddressFilter
filter_form = IPAddressFilterForm
# Export table = IPAddressTable
if 'export' in request.GET: edit_table = IPAddressBulkEditTable
et = get_object_or_404(ExportTemplate, content_type__model='ipaddress', name=request.GET.get('export')) edit_table_permissions = ['ipam.change_ipaddress', 'ipam.delete_ipaddress']
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_ips') template_name = 'ipam/ipaddress_list.html'
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=''),
})
def ipaddress(request, pk): def ipaddress(request, pk):
@ -755,30 +670,14 @@ class IPAddressBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# VLANs # VLANs
# #
def vlan_list(request): class VLANListView(ObjectListView):
queryset = VLAN.objects.select_related('site', 'status', 'role') queryset = VLAN.objects.select_related('site', 'status', 'role')
queryset = VLANFilter(request.GET, queryset).qs filter = VLANFilter
filter_form = VLANFilterForm
# Export table = VLANTable
if 'export' in request.GET: edit_table = VLANBulkEditTable
et = get_object_or_404(ExportTemplate, content_type__model='vlan', name=request.GET.get('export')) edit_table_permissions = ['ipam.change_vlan', 'ipam.delete_vlan']
response = et.to_response(context_dict={'queryset': queryset}, filename='netbox_vlans') template_name = 'ipam/vlan_list.html'
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=''),
})
def vlan(request, pk): def vlan(request, pk):

View File

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

View File

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

View File

@ -33,17 +33,7 @@
<h1>IP Addresses</h1> <h1>IP Addresses</h1>
<div class="row"> <div class="row">
<div class="col-md-9"> <div class="col-md-9">
{% if not ip_table.rows and prefix_table.rows %} {% include 'ipam/inc/ipaddress_table.html' %}
<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 %}
</div> </div>
<div class="col-md-3"> <div class="col-md-3">
<div class="panel panel-default"> <div class="panel panel-default">

View File

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

View File

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

View File

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