Parcourir la source

Converted IPAM object lists to ObjectListView

Jeremy Stretch il y a 9 ans
Parent
commit
d7e2acbae6

+ 5 - 5
netbox/ipam/urls.py

@@ -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'),

+ 38 - 139
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_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
-    # 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):
 def vrf(request, pk):
@@ -196,35 +177,16 @@ class VRFBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
 # Aggregates
 # 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):
 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
-
-    # 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):
 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
-
-    # 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):
 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
-
-    # 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):
 def vlan(request, pk):

+ 1 - 1
netbox/templates/ipam/aggregate_list.html

@@ -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' %}

+ 2 - 2
netbox/templates/ipam/inc/vrf_table.html

@@ -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 %}

+ 1 - 11
netbox/templates/ipam/ipaddress_list.html

@@ -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 %}
-            <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>
 	<div class="col-md-3">
 	<div class="col-md-3">
 		<div class="panel panel-default">
 		<div class="panel panel-default">

+ 1 - 1
netbox/templates/ipam/prefix_list.html

@@ -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">

+ 1 - 1
netbox/templates/ipam/vlan_list.html

@@ -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">

+ 1 - 1
netbox/templates/ipam/vrf_list.html

@@ -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">