Browse Source

Removed SearchTables; created DetailTables for models where needed

Jeremy Stretch 7 years ago
parent
commit
dc68be5abf

+ 6 - 23
netbox/circuits/tables.py

@@ -3,7 +3,7 @@ from __future__ import unicode_literals
 import django_tables2 as tables
 import django_tables2 as tables
 from django_tables2.utils import Accessor
 from django_tables2.utils import Accessor
 
 
-from utilities.tables import BaseTable, SearchTable, ToggleColumn
+from utilities.tables import BaseTable, ToggleColumn
 from .models import Circuit, CircuitType, Provider
 from .models import Circuit, CircuitType, Provider
 
 
 
 
@@ -21,19 +21,18 @@ CIRCUITTYPE_ACTIONS = """
 class ProviderTable(BaseTable):
 class ProviderTable(BaseTable):
     pk = ToggleColumn()
     pk = ToggleColumn()
     name = tables.LinkColumn()
     name = tables.LinkColumn()
-    circuit_count = tables.Column(accessor=Accessor('count_circuits'), verbose_name='Circuits')
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Provider
         model = Provider
-        fields = ('pk', 'name', 'asn', 'account', 'circuit_count')
+        fields = ('pk', 'name', 'asn', 'account',)
 
 
 
 
-class ProviderSearchTable(SearchTable):
+class ProviderDetailTable(ProviderTable):
-    name = tables.LinkColumn()
+    circuit_count = tables.Column(accessor=Accessor('count_circuits'), verbose_name='Circuits')
 
 
-    class Meta(SearchTable.Meta):
+    class Meta(ProviderTable.Meta):
         model = Provider
         model = Provider
-        fields = ('name', 'asn', 'account')
+        fields = ('pk', 'name', 'asn', 'account', 'circuit_count')
 
 
 
 
 #
 #
@@ -74,19 +73,3 @@ class CircuitTable(BaseTable):
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Circuit
         model = Circuit
         fields = ('pk', 'cid', 'type', 'provider', 'tenant', 'a_side', 'z_side', 'description')
         fields = ('pk', 'cid', 'type', 'provider', 'tenant', 'a_side', 'z_side', 'description')
-
-
-class CircuitSearchTable(SearchTable):
-    cid = tables.LinkColumn(verbose_name='ID')
-    provider = tables.LinkColumn('circuits:provider', args=[Accessor('provider.slug')])
-    tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
-    a_side = tables.LinkColumn(
-        'dcim:site', accessor=Accessor('termination_a.site'), args=[Accessor('termination_a.site.slug')]
-    )
-    z_side = tables.LinkColumn(
-        'dcim:site', accessor=Accessor('termination_z.site'), args=[Accessor('termination_z.site.slug')]
-    )
-
-    class Meta(SearchTable.Meta):
-        model = Circuit
-        fields = ('cid', 'type', 'provider', 'tenant', 'a_side', 'z_side', 'description')

+ 1 - 1
netbox/circuits/views.py

@@ -26,7 +26,7 @@ class ProviderListView(ObjectListView):
     queryset = Provider.objects.annotate(count_circuits=Count('circuits'))
     queryset = Provider.objects.annotate(count_circuits=Count('circuits'))
     filter = filters.ProviderFilter
     filter = filters.ProviderFilter
     filter_form = forms.ProviderFilterForm
     filter_form = forms.ProviderFilterForm
-    table = tables.ProviderTable
+    table = tables.ProviderDetailTable
     template_name = 'circuits/provider_list.html'
     template_name = 'circuits/provider_list.html'
 
 
 
 

+ 29 - 57
netbox/dcim/tables.py

@@ -3,7 +3,7 @@ from __future__ import unicode_literals
 import django_tables2 as tables
 import django_tables2 as tables
 from django_tables2.utils import Accessor
 from django_tables2.utils import Accessor
 
 
-from utilities.tables import BaseTable, SearchTable, ToggleColumn
+from utilities.tables import BaseTable, ToggleColumn
 from .models import (
 from .models import (
     ConsolePort, ConsolePortTemplate, ConsoleServerPortTemplate, Device, DeviceBayTemplate, DeviceRole, DeviceType,
     ConsolePort, ConsolePortTemplate, ConsoleServerPortTemplate, Device, DeviceBayTemplate, DeviceRole, DeviceType,
     Interface, InterfaceTemplate, Manufacturer, Platform, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
     Interface, InterfaceTemplate, Manufacturer, Platform, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
@@ -142,30 +142,26 @@ class SiteTable(BaseTable):
     name = tables.LinkColumn()
     name = tables.LinkColumn()
     region = tables.TemplateColumn(template_code=SITE_REGION_LINK)
     region = tables.TemplateColumn(template_code=SITE_REGION_LINK)
     tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
     tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
+
+    class Meta(BaseTable.Meta):
+        model = Site
+        fields = ('pk', 'name', 'facility', 'region', 'tenant', 'asn')
+
+
+class SiteDetailTable(SiteTable):
     rack_count = tables.Column(accessor=Accessor('count_racks'), orderable=False, verbose_name='Racks')
     rack_count = tables.Column(accessor=Accessor('count_racks'), orderable=False, verbose_name='Racks')
     device_count = tables.Column(accessor=Accessor('count_devices'), orderable=False, verbose_name='Devices')
     device_count = tables.Column(accessor=Accessor('count_devices'), orderable=False, verbose_name='Devices')
     prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes')
     prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes')
     vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs')
     vlan_count = tables.Column(accessor=Accessor('count_vlans'), orderable=False, verbose_name='VLANs')
     circuit_count = tables.Column(accessor=Accessor('count_circuits'), orderable=False, verbose_name='Circuits')
     circuit_count = tables.Column(accessor=Accessor('count_circuits'), orderable=False, verbose_name='Circuits')
 
 
-    class Meta(BaseTable.Meta):
+    class Meta(SiteTable.Meta):
-        model = Site
         fields = (
         fields = (
             'pk', 'name', 'facility', 'region', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count',
             'pk', 'name', 'facility', 'region', 'tenant', 'asn', 'rack_count', 'device_count', 'prefix_count',
             'vlan_count', 'circuit_count',
             'vlan_count', 'circuit_count',
         )
         )
 
 
 
 
-class SiteSearchTable(SearchTable):
-    name = tables.LinkColumn()
-    region = tables.TemplateColumn(template_code=SITE_REGION_LINK)
-    tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
-
-    class Meta(SearchTable.Meta):
-        model = Site
-        fields = ('name', 'facility', 'region', 'tenant', 'asn')
-
-
 #
 #
 # Rack groups
 # Rack groups
 #
 #
@@ -214,27 +210,20 @@ class RackTable(BaseTable):
     tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
     tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
     role = tables.TemplateColumn(RACK_ROLE)
     role = tables.TemplateColumn(RACK_ROLE)
     u_height = tables.TemplateColumn("{{ record.u_height }}U", verbose_name='Height')
     u_height = tables.TemplateColumn("{{ record.u_height }}U", verbose_name='Height')
-    devices = tables.Column(accessor=Accessor('device_count'))
-    get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Rack
         model = Rack
-        fields = (
+        fields = ('pk', 'name', 'site', 'group', 'facility_id', 'tenant', 'role', 'u_height')
-            'pk', 'name', 'site', 'group', 'facility_id', 'tenant', 'role', 'u_height', 'devices', 'get_utilization'
-        )
 
 
 
 
-class RackSearchTable(SearchTable):
+class RackDetailTable(RackTable):
-    name = tables.LinkColumn()
+    devices = tables.Column(accessor=Accessor('device_count'))
-    site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
+    get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
-    group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
-    tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
-    role = tables.TemplateColumn(RACK_ROLE)
-    u_height = tables.TemplateColumn("{{ record.u_height }}U", verbose_name='Height')
 
 
-    class Meta(SearchTable.Meta):
+    class Meta(RackTable.Meta):
-        model = Rack
+        fields = (
-        fields = ('name', 'site', 'group', 'facility_id', 'tenant', 'role', 'u_height')
+            'pk', 'name', 'site', 'group', 'facility_id', 'tenant', 'role', 'u_height', 'devices', 'get_utilization'
+        )
 
 
 
 
 class RackImportTable(BaseTable):
 class RackImportTable(BaseTable):
@@ -296,29 +285,22 @@ class DeviceTypeTable(BaseTable):
     is_pdu = tables.BooleanColumn(verbose_name='PDU')
     is_pdu = tables.BooleanColumn(verbose_name='PDU')
     is_network_device = tables.BooleanColumn(verbose_name='Net')
     is_network_device = tables.BooleanColumn(verbose_name='Net')
     subdevice_role = tables.TemplateColumn(SUBDEVICE_ROLE_TEMPLATE, verbose_name='Subdevice Role')
     subdevice_role = tables.TemplateColumn(SUBDEVICE_ROLE_TEMPLATE, verbose_name='Subdevice Role')
-    instance_count = tables.Column(verbose_name='Instances')
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = DeviceType
         model = DeviceType
         fields = (
         fields = (
             'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
             'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
-            'is_network_device', 'subdevice_role', 'instance_count'
+            'is_network_device', 'subdevice_role',
         )
         )
 
 
 
 
-class DeviceTypeSearchTable(SearchTable):
+class DeviceTypeDetailTable(DeviceTypeTable):
-    model = tables.LinkColumn('dcim:devicetype', args=[Accessor('pk')], verbose_name='Device Type')
+    instance_count = tables.Column(verbose_name='Instances')
-    is_full_depth = tables.BooleanColumn(verbose_name='Full Depth')
-    is_console_server = tables.BooleanColumn(verbose_name='CS')
-    is_pdu = tables.BooleanColumn(verbose_name='PDU')
-    is_network_device = tables.BooleanColumn(verbose_name='Net')
-    subdevice_role = tables.TemplateColumn(SUBDEVICE_ROLE_TEMPLATE, verbose_name='Subdevice Role')
 
 
-    class Meta(SearchTable.Meta):
+    class Meta(DeviceTypeTable.Meta):
-        model = DeviceType
         fields = (
         fields = (
-            'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
+            'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu',
-            'is_network_device', 'subdevice_role',
+            'is_network_device', 'subdevice_role', 'instance_count',
         )
         )
 
 
 
 
@@ -439,30 +421,20 @@ class DeviceTable(BaseTable):
         'dcim:devicetype', args=[Accessor('device_type.pk')], verbose_name='Type',
         'dcim:devicetype', args=[Accessor('device_type.pk')], verbose_name='Type',
         text=lambda record: record.device_type.full_name
         text=lambda record: record.device_type.full_name
     )
     )
-    primary_ip = tables.TemplateColumn(
-        orderable=False, verbose_name='IP Address', template_code=DEVICE_PRIMARY_IP
-    )
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Device
         model = Device
-        fields = ('pk', 'name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type', 'primary_ip')
+        fields = ('pk', 'name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type')
 
 
 
 
-class DeviceSearchTable(SearchTable):
+class DeviceDetailTable(DeviceTable):
-    name = tables.TemplateColumn(template_code=DEVICE_LINK)
+    primary_ip = tables.TemplateColumn(
-    status = tables.TemplateColumn(template_code=DEVICE_STATUS, verbose_name='Status')
+        orderable=False, verbose_name='IP Address', template_code=DEVICE_PRIMARY_IP
-    tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
-    site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
-    rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')])
-    device_role = tables.TemplateColumn(DEVICE_ROLE, verbose_name='Role')
-    device_type = tables.LinkColumn(
-        'dcim:devicetype', args=[Accessor('device_type.pk')], verbose_name='Type',
-        text=lambda record: record.device_type.full_name
     )
     )
 
 
-    class Meta(SearchTable.Meta):
+    class Meta(DeviceTable.Meta):
         model = Device
         model = Device
-        fields = ('name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type')
+        fields = ('pk', 'name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type', 'primary_ip')
 
 
 
 
 class DeviceImportTable(BaseTable):
 class DeviceImportTable(BaseTable):

+ 4 - 4
netbox/dcim/views.py

@@ -216,7 +216,7 @@ class SiteListView(ObjectListView):
     queryset = Site.objects.select_related('region', 'tenant')
     queryset = Site.objects.select_related('region', 'tenant')
     filter = filters.SiteFilter
     filter = filters.SiteFilter
     filter_form = forms.SiteFilterForm
     filter_form = forms.SiteFilterForm
-    table = tables.SiteTable
+    table = tables.SiteDetailTable
     template_name = 'dcim/site_list.html'
     template_name = 'dcim/site_list.html'
 
 
 
 
@@ -354,7 +354,7 @@ class RackListView(ObjectListView):
     )
     )
     filter = filters.RackFilter
     filter = filters.RackFilter
     filter_form = forms.RackFilterForm
     filter_form = forms.RackFilterForm
-    table = tables.RackTable
+    table = tables.RackDetailTable
     template_name = 'dcim/rack_list.html'
     template_name = 'dcim/rack_list.html'
 
 
 
 
@@ -550,7 +550,7 @@ class DeviceTypeListView(ObjectListView):
     queryset = DeviceType.objects.select_related('manufacturer').annotate(instance_count=Count('instances'))
     queryset = DeviceType.objects.select_related('manufacturer').annotate(instance_count=Count('instances'))
     filter = filters.DeviceTypeFilter
     filter = filters.DeviceTypeFilter
     filter_form = forms.DeviceTypeFilterForm
     filter_form = forms.DeviceTypeFilterForm
-    table = tables.DeviceTypeTable
+    table = tables.DeviceTypeDetailTable
     template_name = 'dcim/devicetype_list.html'
     template_name = 'dcim/devicetype_list.html'
 
 
 
 
@@ -805,7 +805,7 @@ class DeviceListView(ObjectListView):
                                              'primary_ip4', 'primary_ip6')
                                              'primary_ip4', 'primary_ip6')
     filter = filters.DeviceFilter
     filter = filters.DeviceFilter
     filter_form = forms.DeviceFilterForm
     filter_form = forms.DeviceFilterForm
-    table = tables.DeviceTable
+    table = tables.DeviceDetailTable
     template_name = 'dcim/device_list.html'
     template_name = 'dcim/device_list.html'
 
 
 
 

+ 24 - 82
netbox/ipam/tables.py

@@ -3,7 +3,7 @@ from __future__ import unicode_literals
 import django_tables2 as tables
 import django_tables2 as tables
 from django_tables2.utils import Accessor
 from django_tables2.utils import Accessor
 
 
-from utilities.tables import BaseTable, SearchTable, ToggleColumn
+from utilities.tables import BaseTable, ToggleColumn
 from .models import Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VLANGroup, VRF
 from .models import Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VLANGroup, VRF
 
 
 
 
@@ -152,16 +152,6 @@ class VRFTable(BaseTable):
         fields = ('pk', 'name', 'rd', 'tenant', 'description')
         fields = ('pk', 'name', 'rd', 'tenant', 'description')
 
 
 
 
-class VRFSearchTable(SearchTable):
-    name = tables.LinkColumn()
-    rd = tables.Column(verbose_name='RD')
-    tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
-
-    class Meta(SearchTable.Meta):
-        model = VRF
-        fields = ('name', 'rd', 'tenant', 'description')
-
-
 #
 #
 # RIRs
 # RIRs
 #
 #
@@ -197,22 +187,19 @@ class RIRTable(BaseTable):
 class AggregateTable(BaseTable):
 class AggregateTable(BaseTable):
     pk = ToggleColumn()
     pk = ToggleColumn()
     prefix = tables.LinkColumn(verbose_name='Aggregate')
     prefix = tables.LinkColumn(verbose_name='Aggregate')
-    child_count = tables.Column(verbose_name='Prefixes')
-    get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
     date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added')
     date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added')
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Aggregate
         model = Aggregate
-        fields = ('pk', 'prefix', 'rir', 'child_count', 'get_utilization', 'date_added', 'description')
+        fields = ('pk', 'prefix', 'rir', 'date_added', 'description')
 
 
 
 
-class AggregateSearchTable(SearchTable):
+class AggregateDetailTable(AggregateTable):
-    prefix = tables.LinkColumn(verbose_name='Aggregate')
+    child_count = tables.Column(verbose_name='Prefixes')
-    date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added')
+    get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
 
 
-    class Meta(SearchTable.Meta):
+    class Meta(AggregateTable.Meta):
-        model = Aggregate
+        fields = ('pk', 'prefix', 'rir', 'child_count', 'get_utilization', 'date_added', 'description')
-        fields = ('prefix', 'rir', 'date_added', 'description')
 
 
 
 
 #
 #
@@ -241,7 +228,6 @@ class PrefixTable(BaseTable):
     prefix = tables.TemplateColumn(PREFIX_LINK, attrs={'th': {'style': 'padding-left: 17px'}})
     prefix = tables.TemplateColumn(PREFIX_LINK, attrs={'th': {'style': 'padding-left: 17px'}})
     status = tables.TemplateColumn(STATUS_LABEL)
     status = tables.TemplateColumn(STATUS_LABEL)
     vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF')
     vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF')
-    get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
     tenant = tables.TemplateColumn(TENANT_LINK)
     tenant = tables.TemplateColumn(TENANT_LINK)
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
     vlan = tables.LinkColumn('ipam:vlan', args=[Accessor('vlan.pk')], verbose_name='VLAN')
     vlan = tables.LinkColumn('ipam:vlan', args=[Accessor('vlan.pk')], verbose_name='VLAN')
@@ -249,37 +235,17 @@ class PrefixTable(BaseTable):
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Prefix
         model = Prefix
-        fields = ('pk', 'prefix', 'status', 'vrf', 'get_utilization', 'tenant', 'site', 'vlan', 'role', 'description')
+        fields = ('pk', 'prefix', 'status', 'vrf', 'tenant', 'site', 'vlan', 'role', 'description')
         row_attrs = {
         row_attrs = {
             'class': lambda record: 'success' if not record.pk else '',
             'class': lambda record: 'success' if not record.pk else '',
         }
         }
 
 
 
 
-class PrefixBriefTable(BaseTable):
+class PrefixDetailTable(PrefixTable):
-    prefix = tables.TemplateColumn(PREFIX_LINK_BRIEF)
+    get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization')
-    vrf = tables.LinkColumn('ipam:vrf', args=[Accessor('vrf.pk')], default='Global')
-    site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
-    status = tables.TemplateColumn(STATUS_LABEL)
-    vlan = tables.LinkColumn('ipam:vlan', args=[Accessor('vlan.pk')])
-
-    class Meta(BaseTable.Meta):
-        model = Prefix
-        fields = ('prefix', 'vrf', 'status', 'site', 'vlan', 'role')
-        orderable = False
-
-
-class PrefixSearchTable(SearchTable):
-    prefix = tables.TemplateColumn(PREFIX_LINK, attrs={'th': {'style': 'padding-left: 17px'}})
-    status = tables.TemplateColumn(STATUS_LABEL)
-    vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF')
-    tenant = tables.TemplateColumn(TENANT_LINK)
-    site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
-    vlan = tables.LinkColumn('ipam:vlan', args=[Accessor('vlan.pk')], verbose_name='VLAN')
-    role = tables.TemplateColumn(PREFIX_ROLE_LINK)
 
 
-    class Meta(SearchTable.Meta):
+    class Meta(PrefixTable.Meta):
-        model = Prefix
+        fields = ('pk', 'prefix', 'status', 'vrf', 'get_utilization', 'tenant', 'site', 'vlan', 'role', 'description')
-        fields = ('prefix', 'status', 'vrf', 'tenant', 'site', 'vlan', 'role', 'description')
 
 
 
 
 #
 #
@@ -292,43 +258,26 @@ class IPAddressTable(BaseTable):
     status = tables.TemplateColumn(STATUS_LABEL)
     status = tables.TemplateColumn(STATUS_LABEL)
     vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF')
     vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF')
     tenant = tables.TemplateColumn(TENANT_LINK)
     tenant = tables.TemplateColumn(TENANT_LINK)
-    nat_inside = tables.LinkColumn(
-        'ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False, verbose_name='NAT (Inside)'
-    )
     device = tables.TemplateColumn(IPADDRESS_DEVICE, orderable=False)
     device = tables.TemplateColumn(IPADDRESS_DEVICE, orderable=False)
+    interface = tables.Column(orderable=False)
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = IPAddress
         model = IPAddress
-        fields = ('pk', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'device', 'description')
+        fields = ('pk', 'address', 'vrf', 'status', 'role', 'tenant', 'device', 'interface', 'description')
         row_attrs = {
         row_attrs = {
             'class': lambda record: 'success' if not isinstance(record, IPAddress) else '',
             'class': lambda record: 'success' if not isinstance(record, IPAddress) else '',
         }
         }
 
 
 
 
-class IPAddressBriefTable(BaseTable):
+class IPAddressDetailTable(IPAddressTable):
-    address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address')
-    device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False)
-    interface = tables.Column(orderable=False)
     nat_inside = tables.LinkColumn(
     nat_inside = tables.LinkColumn(
         'ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False, verbose_name='NAT (Inside)'
         'ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False, verbose_name='NAT (Inside)'
     )
     )
 
 
-    class Meta(BaseTable.Meta):
+    class Meta(IPAddressTable.Meta):
-        model = IPAddress
+        fields = (
-        fields = ('address', 'device', 'interface', 'nat_inside')
+            'pk', 'address', 'vrf', 'status', 'role', 'tenant', 'nat_inside', 'device', 'interface', 'description',
-
+        )
-
-class IPAddressSearchTable(SearchTable):
-    address = tables.TemplateColumn(IPADDRESS_LINK, verbose_name='IP Address')
-    status = tables.TemplateColumn(STATUS_LABEL)
-    vrf = tables.TemplateColumn(VRF_LINK, verbose_name='VRF')
-    tenant = tables.TemplateColumn(TENANT_LINK)
-    device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False)
-    interface = tables.Column(orderable=False)
-
-    class Meta(SearchTable.Meta):
-        model = IPAddress
-        fields = ('address', 'vrf', 'status', 'role', 'tenant', 'device', 'interface', 'description')
 
 
 
 
 #
 #
@@ -358,24 +307,17 @@ class VLANTable(BaseTable):
     vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
     vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
     site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
     group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
     group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
-    prefixes = tables.TemplateColumn(VLAN_PREFIXES, orderable=False, verbose_name='Prefixes')
     tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
     tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
     status = tables.TemplateColumn(STATUS_LABEL)
     status = tables.TemplateColumn(STATUS_LABEL)
     role = tables.TemplateColumn(VLAN_ROLE_LINK)
     role = tables.TemplateColumn(VLAN_ROLE_LINK)
 
 
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = VLAN
         model = VLAN
-        fields = ('pk', 'vid', 'site', 'group', 'name', 'prefixes', 'tenant', 'status', 'role', 'description')
+        fields = ('pk', 'vid', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description')
 
 
 
 
-class VLANSearchTable(SearchTable):
+class VLANDetailTable(VLANTable):
-    vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID')
+    prefixes = tables.TemplateColumn(VLAN_PREFIXES, orderable=False, verbose_name='Prefixes')
-    site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')])
-    group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group')
-    tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')])
-    status = tables.TemplateColumn(STATUS_LABEL)
-    role = tables.TemplateColumn(VLAN_ROLE_LINK)
 
 
-    class Meta(SearchTable.Meta):
+    class Meta(VLANTable.Meta):
-        model = VLAN
+        fields = ('pk', 'vid', 'site', 'group', 'name', 'prefixes', 'tenant', 'status', 'role', 'description')
-        fields = ('vid', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description')

+ 12 - 12
netbox/ipam/views.py

@@ -103,8 +103,8 @@ class VRFView(View):
     def get(self, request, pk):
     def get(self, request, pk):
 
 
         vrf = get_object_or_404(VRF.objects.all(), pk=pk)
         vrf = get_object_or_404(VRF.objects.all(), pk=pk)
-        prefix_table = tables.PrefixBriefTable(
+        prefix_table = tables.PrefixTable(
-            list(Prefix.objects.filter(vrf=vrf).select_related('site', 'role'))
+            list(Prefix.objects.filter(vrf=vrf).select_related('site', 'role')), orderable=False
         )
         )
         prefix_table.exclude = ('vrf',)
         prefix_table.exclude = ('vrf',)
 
 
@@ -273,7 +273,7 @@ class AggregateListView(ObjectListView):
     })
     })
     filter = filters.AggregateFilter
     filter = filters.AggregateFilter
     filter_form = forms.AggregateFilterForm
     filter_form = forms.AggregateFilterForm
-    table = tables.AggregateTable
+    table = tables.AggregateDetailTable
     template_name = 'ipam/aggregate_list.html'
     template_name = 'ipam/aggregate_list.html'
 
 
     def extra_context(self):
     def extra_context(self):
@@ -410,7 +410,7 @@ class PrefixListView(ObjectListView):
     queryset = Prefix.objects.select_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
     queryset = Prefix.objects.select_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role')
     filter = filters.PrefixFilter
     filter = filters.PrefixFilter
     filter_form = forms.PrefixFilterForm
     filter_form = forms.PrefixFilterForm
-    table = tables.PrefixTable
+    table = tables.PrefixDetailTable
     template_name = 'ipam/prefix_list.html'
     template_name = 'ipam/prefix_list.html'
 
 
     def alter_queryset(self, request):
     def alter_queryset(self, request):
@@ -445,7 +445,7 @@ class PrefixView(View):
         ).select_related(
         ).select_related(
             'site', 'role'
             'site', 'role'
         ).annotate_depth()
         ).annotate_depth()
-        parent_prefix_table = tables.PrefixBriefTable(parent_prefixes)
+        parent_prefix_table = tables.PrefixTable(list(parent_prefixes), orderable=False)
         parent_prefix_table.exclude = ('vrf',)
         parent_prefix_table.exclude = ('vrf',)
 
 
         # Duplicate prefixes table
         # Duplicate prefixes table
@@ -456,7 +456,7 @@ class PrefixView(View):
         ).select_related(
         ).select_related(
             'site', 'role'
             'site', 'role'
         )
         )
-        duplicate_prefix_table = tables.PrefixBriefTable(list(duplicate_prefixes))
+        duplicate_prefix_table = tables.PrefixTable(list(duplicate_prefixes), orderable=False)
         duplicate_prefix_table.exclude = ('vrf',)
         duplicate_prefix_table.exclude = ('vrf',)
 
 
         # Child prefixes table
         # Child prefixes table
@@ -585,7 +585,7 @@ class IPAddressListView(ObjectListView):
     queryset = IPAddress.objects.select_related('vrf__tenant', 'tenant', 'interface__device', 'nat_inside')
     queryset = IPAddress.objects.select_related('vrf__tenant', 'tenant', 'interface__device', 'nat_inside')
     filter = filters.IPAddressFilter
     filter = filters.IPAddressFilter
     filter_form = forms.IPAddressFilterForm
     filter_form = forms.IPAddressFilterForm
-    table = tables.IPAddressTable
+    table = tables.IPAddressDetailTable
     template_name = 'ipam/ipaddress_list.html'
     template_name = 'ipam/ipaddress_list.html'
 
 
 
 
@@ -601,7 +601,7 @@ class IPAddressView(View):
         ).select_related(
         ).select_related(
             'site', 'role'
             'site', 'role'
         )
         )
-        parent_prefixes_table = tables.PrefixBriefTable(list(parent_prefixes))
+        parent_prefixes_table = tables.PrefixTable(list(parent_prefixes), orderable=False)
         parent_prefixes_table.exclude = ('vrf',)
         parent_prefixes_table.exclude = ('vrf',)
 
 
         # Duplicate IPs table
         # Duplicate IPs table
@@ -612,7 +612,7 @@ class IPAddressView(View):
         ).select_related(
         ).select_related(
             'interface__device', 'nat_inside'
             'interface__device', 'nat_inside'
         )
         )
-        duplicate_ips_table = tables.IPAddressBriefTable(list(duplicate_ips))
+        duplicate_ips_table = tables.IPAddressTable(list(duplicate_ips), orderable=False)
 
 
         # Related IP table
         # Related IP table
         related_ips = IPAddress.objects.select_related(
         related_ips = IPAddress.objects.select_related(
@@ -622,7 +622,7 @@ class IPAddressView(View):
         ).filter(
         ).filter(
             vrf=ipaddress.vrf, address__net_contained_or_equal=str(ipaddress.address)
             vrf=ipaddress.vrf, address__net_contained_or_equal=str(ipaddress.address)
         )
         )
-        related_ips_table = tables.IPAddressBriefTable(list(related_ips))
+        related_ips_table = tables.IPAddressTable(list(related_ips), orderable=False)
 
 
         return render(request, 'ipam/ipaddress.html', {
         return render(request, 'ipam/ipaddress.html', {
             'ipaddress': ipaddress,
             'ipaddress': ipaddress,
@@ -722,7 +722,7 @@ class VLANListView(ObjectListView):
     queryset = VLAN.objects.select_related('site', 'group', 'tenant', 'role').prefetch_related('prefixes')
     queryset = VLAN.objects.select_related('site', 'group', 'tenant', 'role').prefetch_related('prefixes')
     filter = filters.VLANFilter
     filter = filters.VLANFilter
     filter_form = forms.VLANFilterForm
     filter_form = forms.VLANFilterForm
-    table = tables.VLANTable
+    table = tables.VLANDetailTable
     template_name = 'ipam/vlan_list.html'
     template_name = 'ipam/vlan_list.html'
 
 
 
 
@@ -734,7 +734,7 @@ class VLANView(View):
             'site__region', 'tenant__group', 'role'
             'site__region', 'tenant__group', 'role'
         ), pk=pk)
         ), pk=pk)
         prefixes = Prefix.objects.filter(vlan=vlan).select_related('vrf', 'site', 'role')
         prefixes = Prefix.objects.filter(vlan=vlan).select_related('vrf', 'site', 'role')
-        prefix_table = tables.PrefixBriefTable(list(prefixes))
+        prefix_table = tables.PrefixTable(list(prefixes), orderable=False)
         prefix_table.exclude = ('vlan',)
         prefix_table.exclude = ('vlan',)
 
 
         return render(request, 'ipam/vlan.html', {
         return render(request, 'ipam/vlan.html', {

+ 22 - 20
netbox/netbox/views.py

@@ -11,20 +11,20 @@ from django.views.generic import View
 
 
 from circuits.filters import CircuitFilter, ProviderFilter
 from circuits.filters import CircuitFilter, ProviderFilter
 from circuits.models import Circuit, Provider
 from circuits.models import Circuit, Provider
-from circuits.tables import CircuitSearchTable, ProviderSearchTable
+from circuits.tables import CircuitTable, ProviderTable
 from dcim.filters import DeviceFilter, DeviceTypeFilter, RackFilter, SiteFilter
 from dcim.filters import DeviceFilter, DeviceTypeFilter, RackFilter, SiteFilter
 from dcim.models import ConsolePort, Device, DeviceType, InterfaceConnection, PowerPort, Rack, Site
 from dcim.models import ConsolePort, Device, DeviceType, InterfaceConnection, PowerPort, Rack, Site
-from dcim.tables import DeviceSearchTable, DeviceTypeSearchTable, RackSearchTable, SiteSearchTable
+from dcim.tables import DeviceTable, DeviceTypeTable, RackTable, SiteTable
 from extras.models import TopologyMap, UserAction
 from extras.models import TopologyMap, UserAction
 from ipam.filters import AggregateFilter, IPAddressFilter, PrefixFilter, VLANFilter, VRFFilter
 from ipam.filters import AggregateFilter, IPAddressFilter, PrefixFilter, VLANFilter, VRFFilter
 from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF
 from ipam.models import Aggregate, IPAddress, Prefix, VLAN, VRF
-from ipam.tables import AggregateSearchTable, IPAddressSearchTable, PrefixSearchTable, VLANSearchTable, VRFSearchTable
+from ipam.tables import AggregateTable, IPAddressTable, PrefixTable, VLANTable, VRFTable
 from secrets.filters import SecretFilter
 from secrets.filters import SecretFilter
 from secrets.models import Secret
 from secrets.models import Secret
-from secrets.tables import SecretSearchTable
+from secrets.tables import SecretTable
 from tenancy.filters import TenantFilter
 from tenancy.filters import TenantFilter
 from tenancy.models import Tenant
 from tenancy.models import Tenant
-from tenancy.tables import TenantSearchTable
+from tenancy.tables import TenantTable
 from .forms import SearchForm
 from .forms import SearchForm
 
 
 
 
@@ -34,83 +34,85 @@ SEARCH_TYPES = OrderedDict((
     ('provider', {
     ('provider', {
         'queryset': Provider.objects.all(),
         'queryset': Provider.objects.all(),
         'filter': ProviderFilter,
         'filter': ProviderFilter,
-        'table': ProviderSearchTable,
+        'table': ProviderTable,
         'url': 'circuits:provider_list',
         'url': 'circuits:provider_list',
     }),
     }),
     ('circuit', {
     ('circuit', {
         'queryset': Circuit.objects.select_related('type', 'provider', 'tenant').prefetch_related('terminations__site'),
         'queryset': Circuit.objects.select_related('type', 'provider', 'tenant').prefetch_related('terminations__site'),
         'filter': CircuitFilter,
         'filter': CircuitFilter,
-        'table': CircuitSearchTable,
+        'table': CircuitTable,
         'url': 'circuits:circuit_list',
         'url': 'circuits:circuit_list',
     }),
     }),
     # DCIM
     # DCIM
     ('site', {
     ('site', {
         'queryset': Site.objects.select_related('region', 'tenant'),
         'queryset': Site.objects.select_related('region', 'tenant'),
         'filter': SiteFilter,
         'filter': SiteFilter,
-        'table': SiteSearchTable,
+        'table': SiteTable,
         'url': 'dcim:site_list',
         'url': 'dcim:site_list',
     }),
     }),
     ('rack', {
     ('rack', {
         'queryset': Rack.objects.select_related('site', 'group', 'tenant', 'role'),
         'queryset': Rack.objects.select_related('site', 'group', 'tenant', 'role'),
         'filter': RackFilter,
         'filter': RackFilter,
-        'table': RackSearchTable,
+        'table': RackTable,
         'url': 'dcim:rack_list',
         'url': 'dcim:rack_list',
     }),
     }),
     ('devicetype', {
     ('devicetype', {
         'queryset': DeviceType.objects.select_related('manufacturer'),
         'queryset': DeviceType.objects.select_related('manufacturer'),
         'filter': DeviceTypeFilter,
         'filter': DeviceTypeFilter,
-        'table': DeviceTypeSearchTable,
+        'table': DeviceTypeTable,
         'url': 'dcim:devicetype_list',
         'url': 'dcim:devicetype_list',
     }),
     }),
     ('device', {
     ('device', {
-        'queryset': Device.objects.select_related('device_type__manufacturer', 'device_role', 'tenant', 'site', 'rack'),
+        'queryset': Device.objects.select_related(
+            'device_type__manufacturer', 'device_role', 'tenant', 'site', 'rack'
+        ),
         'filter': DeviceFilter,
         'filter': DeviceFilter,
-        'table': DeviceSearchTable,
+        'table': DeviceTable,
         'url': 'dcim:device_list',
         'url': 'dcim:device_list',
     }),
     }),
     # IPAM
     # IPAM
     ('vrf', {
     ('vrf', {
         'queryset': VRF.objects.select_related('tenant'),
         'queryset': VRF.objects.select_related('tenant'),
         'filter': VRFFilter,
         'filter': VRFFilter,
-        'table': VRFSearchTable,
+        'table': VRFTable,
         'url': 'ipam:vrf_list',
         'url': 'ipam:vrf_list',
     }),
     }),
     ('aggregate', {
     ('aggregate', {
         'queryset': Aggregate.objects.select_related('rir'),
         'queryset': Aggregate.objects.select_related('rir'),
         'filter': AggregateFilter,
         'filter': AggregateFilter,
-        'table': AggregateSearchTable,
+        'table': AggregateTable,
         'url': 'ipam:aggregate_list',
         'url': 'ipam:aggregate_list',
     }),
     }),
     ('prefix', {
     ('prefix', {
         'queryset': Prefix.objects.select_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role'),
         'queryset': Prefix.objects.select_related('site', 'vrf__tenant', 'tenant', 'vlan', 'role'),
         'filter': PrefixFilter,
         'filter': PrefixFilter,
-        'table': PrefixSearchTable,
+        'table': PrefixTable,
         'url': 'ipam:prefix_list',
         'url': 'ipam:prefix_list',
     }),
     }),
     ('ipaddress', {
     ('ipaddress', {
         'queryset': IPAddress.objects.select_related('vrf__tenant', 'tenant', 'interface__device'),
         'queryset': IPAddress.objects.select_related('vrf__tenant', 'tenant', 'interface__device'),
         'filter': IPAddressFilter,
         'filter': IPAddressFilter,
-        'table': IPAddressSearchTable,
+        'table': IPAddressTable,
         'url': 'ipam:ipaddress_list',
         'url': 'ipam:ipaddress_list',
     }),
     }),
     ('vlan', {
     ('vlan', {
         'queryset': VLAN.objects.select_related('site', 'group', 'tenant', 'role'),
         'queryset': VLAN.objects.select_related('site', 'group', 'tenant', 'role'),
         'filter': VLANFilter,
         'filter': VLANFilter,
-        'table': VLANSearchTable,
+        'table': VLANTable,
         'url': 'ipam:vlan_list',
         'url': 'ipam:vlan_list',
     }),
     }),
     # Secrets
     # Secrets
     ('secret', {
     ('secret', {
         'queryset': Secret.objects.select_related('role', 'device'),
         'queryset': Secret.objects.select_related('role', 'device'),
         'filter': SecretFilter,
         'filter': SecretFilter,
-        'table': SecretSearchTable,
+        'table': SecretTable,
         'url': 'secrets:secret_list',
         'url': 'secrets:secret_list',
     }),
     }),
     # Tenancy
     # Tenancy
     ('tenant', {
     ('tenant', {
         'queryset': Tenant.objects.select_related('group'),
         'queryset': Tenant.objects.select_related('group'),
         'filter': TenantFilter,
         'filter': TenantFilter,
-        'table': TenantSearchTable,
+        'table': TenantTable,
         'url': 'tenancy:tenant_list',
         'url': 'tenancy:tenant_list',
     }),
     }),
 ))
 ))
@@ -189,7 +191,7 @@ class SearchView(View):
 
 
                 # Construct the results table for this object type
                 # Construct the results table for this object type
                 filtered_queryset = filter_cls({'q': form.cleaned_data['q']}, queryset=queryset).qs
                 filtered_queryset = filter_cls({'q': form.cleaned_data['q']}, queryset=queryset).qs
-                table = table(filtered_queryset)
+                table = table(filtered_queryset, orderable=False)
                 table.paginate(per_page=SEARCH_MAX_RESULTS)
                 table.paginate(per_page=SEARCH_MAX_RESULTS)
 
 
                 if table.page:
                 if table.page:

+ 1 - 9
netbox/secrets/tables.py

@@ -2,7 +2,7 @@ from __future__ import unicode_literals
 
 
 import django_tables2 as tables
 import django_tables2 as tables
 
 
-from utilities.tables import BaseTable, SearchTable, ToggleColumn
+from utilities.tables import BaseTable, ToggleColumn
 
 
 from .models import SecretRole, Secret
 from .models import SecretRole, Secret
 
 
@@ -43,11 +43,3 @@ class SecretTable(BaseTable):
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Secret
         model = Secret
         fields = ('pk', 'device', 'role', 'name', 'last_updated')
         fields = ('pk', 'device', 'role', 'name', 'last_updated')
-
-
-class SecretSearchTable(SearchTable):
-    device = tables.LinkColumn()
-
-    class Meta(SearchTable.Meta):
-        model = Secret
-        fields = ('device', 'role', 'name', 'last_updated')

+ 1 - 9
netbox/tenancy/tables.py

@@ -2,7 +2,7 @@ from __future__ import unicode_literals
 
 
 import django_tables2 as tables
 import django_tables2 as tables
 
 
-from utilities.tables import BaseTable, SearchTable, ToggleColumn
+from utilities.tables import BaseTable, ToggleColumn
 
 
 from .models import Tenant, TenantGroup
 from .models import Tenant, TenantGroup
 
 
@@ -43,11 +43,3 @@ class TenantTable(BaseTable):
     class Meta(BaseTable.Meta):
     class Meta(BaseTable.Meta):
         model = Tenant
         model = Tenant
         fields = ('pk', 'name', 'group', 'description')
         fields = ('pk', 'name', 'group', 'description')
-
-
-class TenantSearchTable(SearchTable):
-    name = tables.LinkColumn()
-
-    class Meta(SearchTable.Meta):
-        model = Tenant
-        fields = ('name', 'group', 'description')

+ 0 - 11
netbox/utilities/tables.py

@@ -18,19 +18,8 @@ class BaseTable(tables.Table):
 
 
     class Meta:
     class Meta:
         attrs = {
         attrs = {
-            'class': 'table table-hover',
-        }
-
-
-class SearchTable(tables.Table):
-    """
-    Default table for search results
-    """
-    class Meta:
-        attrs = {
             'class': 'table table-hover table-headings',
             'class': 'table table-hover table-headings',
         }
         }
-        orderable = False
 
 
 
 
 class ToggleColumn(tables.CheckBoxColumn):
 class ToggleColumn(tables.CheckBoxColumn):