diff --git a/netbox/ipam/urls.py b/netbox/ipam/urls.py index dd5a83fee..da6a0b6ca 100644 --- a/netbox/ipam/urls.py +++ b/netbox/ipam/urls.py @@ -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\d+)/edit/$', views.vrf_edit, name='vrf_edit'), url(r'^vrfs/(?P\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\d+)/edit/$', views.aggregate_edit, name='aggregate_edit'), url(r'^aggregates/(?P\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\d+)/delete/$', views.prefix_delete, name='prefix_delete'), url(r'^prefixes/(?P\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\d+)/edit/$', views.ipaddress_edit, name='ipaddress_edit'), url(r'^ip-addresses/(?P\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'), diff --git a/netbox/ipam/views.py b/netbox/ipam/views.py index e95b1aefb..a1e7a4473 100644 --- a/netbox/ipam/views.py +++ b/netbox/ipam/views.py @@ -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): diff --git a/netbox/templates/ipam/aggregate_list.html b/netbox/templates/ipam/aggregate_list.html index 1f057952a..477c8b981 100644 --- a/netbox/templates/ipam/aggregate_list.html +++ b/netbox/templates/ipam/aggregate_list.html @@ -28,7 +28,7 @@

Aggregates

- {% include 'ipam/inc/aggregate_table.html' with table=aggregate_table %} + {% include 'ipam/inc/aggregate_table.html' %}
{% include 'inc/filter_panel.html' %} diff --git a/netbox/templates/ipam/inc/vrf_table.html b/netbox/templates/ipam/inc/vrf_table.html index 2290b0aaa..e03f3ea59 100644 --- a/netbox/templates/ipam/inc/vrf_table.html +++ b/netbox/templates/ipam/inc/vrf_table.html @@ -2,7 +2,7 @@ {% if perms.ipam.change_vrf or perms.ipam.delete_vrf %}
{% csrf_token %} - {% render_table vrf_table 'table.html' %} + {% render_table table table_template|default:'table.html' %} {% if perms.ipam.change_vrf %}
- No IP addresses were found. However, a prefix search returned the following results. -
- {% render_table prefix_table 'table.html' %} - {% else %} - {% include 'ipam/inc/ipaddress_table.html' with table=ip_table %} - {% endif %} + {% include 'ipam/inc/ipaddress_table.html' %}
diff --git a/netbox/templates/ipam/prefix_list.html b/netbox/templates/ipam/prefix_list.html index 5e7169a9f..e465055bf 100644 --- a/netbox/templates/ipam/prefix_list.html +++ b/netbox/templates/ipam/prefix_list.html @@ -33,7 +33,7 @@

Prefixes

- {% include 'ipam/inc/prefix_table.html' with table=prefix_table %} + {% include 'ipam/inc/prefix_table.html' %}
diff --git a/netbox/templates/ipam/vlan_list.html b/netbox/templates/ipam/vlan_list.html index a8c0360c7..2d34ba253 100644 --- a/netbox/templates/ipam/vlan_list.html +++ b/netbox/templates/ipam/vlan_list.html @@ -33,7 +33,7 @@

VLANs

- {% include 'ipam/inc/vlan_table.html' with table=vlan_table %} + {% include 'ipam/inc/vlan_table.html' %}
diff --git a/netbox/templates/ipam/vrf_list.html b/netbox/templates/ipam/vrf_list.html index 40da95576..72117d65a 100644 --- a/netbox/templates/ipam/vrf_list.html +++ b/netbox/templates/ipam/vrf_list.html @@ -33,7 +33,7 @@

VRFs

- {% include 'ipam/inc/vrf_table.html' with table=vrf_table %} + {% include 'ipam/inc/vrf_table.html' %}