diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 0a0b92d43..c13727cb7 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from utilities.tables import ToggleColumn +from utilities.tables import BaseTable, ToggleColumn from .models import Circuit, CircuitType, Provider @@ -17,46 +17,38 @@ CIRCUITTYPE_EDIT_LINK = """ # Providers # -class ProviderTable(tables.Table): +class ProviderTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn('circuits:provider', args=[Accessor('slug')], verbose_name='Name') asn = tables.Column(verbose_name='ASN') circuit_count = tables.Column(accessor=Accessor('count_circuits'), verbose_name='Circuits') - class Meta: + class Meta(BaseTable.Meta): model = Provider fields = ('pk', 'name', 'asn', 'circuit_count') - empty_text = "No providers found." - attrs = { - 'class': 'table table-hover', - } # # Circuit types # -class CircuitTypeTable(tables.Table): +class CircuitTypeTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') circuit_count = tables.Column(verbose_name='Circuits') slug = tables.Column(verbose_name='Slug') edit = tables.TemplateColumn(template_code=CIRCUITTYPE_EDIT_LINK, verbose_name='') - class Meta: + class Meta(BaseTable.Meta): model = CircuitType fields = ('pk', 'name', 'circuit_count', 'slug', 'edit') - empty_text = "No circuit types found." - attrs = { - 'class': 'table table-hover', - } # # Circuits # -class CircuitTable(tables.Table): +class CircuitTable(BaseTable): pk = ToggleColumn() cid = tables.LinkColumn('circuits:circuit', args=[Accessor('pk')], verbose_name='ID') type = tables.Column(verbose_name='Type') @@ -65,10 +57,6 @@ class CircuitTable(tables.Table): port_speed_human = tables.Column(verbose_name='Port Speed') commit_rate_human = tables.Column(verbose_name='Commit Rate') - class Meta: + class Meta(BaseTable.Meta): model = Circuit fields = ('pk', 'cid', 'type', 'provider', 'site', 'port_speed_human', 'commit_rate_human') - empty_text = "No circuits found." - attrs = { - 'class': 'table table-hover', - } diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index fe1adb4c0..c754b0296 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from utilities.tables import ToggleColumn +from utilities.tables import BaseTable, ToggleColumn from .models import ( ConsolePort, ConsolePortTemplate, ConsoleServerPortTemplate, Device, DeviceRole, DeviceType, InterfaceTemplate, @@ -52,7 +52,7 @@ STATUS_ICON = """ # Sites # -class SiteTable(tables.Table): +class SiteTable(BaseTable): name = tables.LinkColumn('dcim:site', args=[Accessor('slug')], verbose_name='Name') facility = tables.Column(verbose_name='Facility') asn = tables.Column(verbose_name='ASN') @@ -62,21 +62,17 @@ class SiteTable(tables.Table): 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') - class Meta: + class Meta(BaseTable.Meta): model = Site fields = ('name', 'facility', 'asn', 'rack_count', 'device_count', 'prefix_count', 'vlan_count', 'circuit_count') - empty_text = "No sites have been defined." - attrs = { - 'class': 'table table-hover', - } # # Rack groups # -class RackGroupTable(tables.Table): +class RackGroupTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') @@ -84,20 +80,16 @@ class RackGroupTable(tables.Table): slug = tables.Column(verbose_name='Slug') edit = tables.TemplateColumn(template_code=RACKGROUP_EDIT_LINK, verbose_name='') - class Meta: + class Meta(BaseTable.Meta): model = RackGroup fields = ('pk', 'name', 'site', 'rack_count', 'slug', 'edit') - empty_text = "No rack groups were found." - attrs = { - 'class': 'table table-hover', - } # # Racks # -class RackTable(tables.Table): +class RackTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn('dcim:rack', args=[Accessor('pk')], verbose_name='Name') site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') @@ -106,50 +98,38 @@ class RackTable(tables.Table): u_height = tables.Column(verbose_name='Height (U)') devices = tables.Column(accessor=Accessor('device_count'), verbose_name='Devices') - class Meta: + class Meta(BaseTable.Meta): model = Rack fields = ('pk', 'name', 'site', 'group', 'facility_id', 'u_height', 'devices') - empty_text = "No racks were found." - attrs = { - 'class': 'table table-hover', - } # # Manufacturers # -class ManufacturerTable(tables.Table): +class ManufacturerTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') devicetype_count = tables.Column(verbose_name='Device Types') slug = tables.Column(verbose_name='Slug') edit = tables.TemplateColumn(template_code=MANUFACTURER_EDIT_LINK, verbose_name='') - class Meta: + class Meta(BaseTable.Meta): model = Manufacturer fields = ('pk', 'name', 'devicetype_count', 'slug', 'edit') - empty_text = "No device types were found." - attrs = { - 'class': 'table table-hover', - } # # Device types # -class DeviceTypeTable(tables.Table): +class DeviceTypeTable(BaseTable): pk = ToggleColumn() model = tables.LinkColumn('dcim:devicetype', args=[Accessor('pk')], verbose_name='Device Type') - class Meta: + class Meta(BaseTable.Meta): model = DeviceType fields = ('pk', 'model', 'manufacturer', 'u_height') - empty_text = "No device types were found." - attrs = { - 'class': 'table table-hover', - } # @@ -225,7 +205,7 @@ class InterfaceTemplateTable(tables.Table): # Device roles # -class DeviceRoleTable(tables.Table): +class DeviceRoleTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') device_count = tables.Column(verbose_name='Devices') @@ -233,40 +213,32 @@ class DeviceRoleTable(tables.Table): color = tables.Column(verbose_name='Color') edit = tables.TemplateColumn(template_code=DEVICEROLE_EDIT_LINK, verbose_name='') - class Meta: + class Meta(BaseTable.Meta): model = DeviceRole fields = ('pk', 'name', 'device_count', 'slug', 'color') - empty_text = "No device roles were found." - attrs = { - 'class': 'table table-hover', - } # # Platforms # -class PlatformTable(tables.Table): +class PlatformTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') device_count = tables.Column(verbose_name='Devices') slug = tables.Column(verbose_name='Slug') edit = tables.TemplateColumn(template_code=PLATFORM_EDIT_LINK, verbose_name='') - class Meta: + class Meta(BaseTable.Meta): model = Platform fields = ('pk', 'name', 'device_count', 'slug', 'edit') - empty_text = "No platforms were found." - attrs = { - 'class': 'table table-hover', - } # # Devices # -class DeviceTable(tables.Table): +class DeviceTable(BaseTable): pk = ToggleColumn() status = tables.TemplateColumn(template_code=STATUS_ICON, verbose_name='') name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name') @@ -277,16 +249,12 @@ class DeviceTable(tables.Table): primary_ip = tables.TemplateColumn(orderable=False, verbose_name='IP Address', template_code="{{ record.primary_ip.address.ip }}") - class Meta: + class Meta(BaseTable.Meta): model = Device fields = ('pk', 'name', 'status', 'site', 'rack', 'device_role', 'device_type', 'primary_ip') - empty_text = "No devices were found." - attrs = { - 'class': 'table table-hover', - } -class DeviceImportTable(tables.Table): +class DeviceImportTable(BaseTable): name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name') site = tables.Column(accessor=Accessor('rack.site'), verbose_name='Site') rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack') @@ -294,49 +262,41 @@ class DeviceImportTable(tables.Table): device_role = tables.Column(verbose_name='Role') device_type = tables.Column(verbose_name='Type') - class Meta: + class Meta(BaseTable.Meta): model = Device fields = ('name', 'site', 'rack', 'position', 'device_role', 'device_type') - attrs = { - 'class': 'table table-hover', - } + empty_text = False # # Device connections # -class ConsoleConnectionTable(tables.Table): +class ConsoleConnectionTable(BaseTable): console_server = tables.LinkColumn('dcim:device', accessor=Accessor('cs_port.device'), args=[Accessor('cs_port.device.pk')], verbose_name='Console server') cs_port = tables.Column(verbose_name='Port') device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device') name = tables.Column(verbose_name='Console port') - class Meta: + class Meta(BaseTable.Meta): model = ConsolePort fields = ('console_server', 'cs_port', 'device', 'name') - attrs = { - 'class': 'table table-hover', - } -class PowerConnectionTable(tables.Table): +class PowerConnectionTable(BaseTable): pdu = tables.LinkColumn('dcim:device', accessor=Accessor('power_outlet.device'), args=[Accessor('power_outlet.device.pk')], verbose_name='PDU') power_outlet = tables.Column(verbose_name='Outlet') device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device') name = tables.Column(verbose_name='Console port') - class Meta: + class Meta(BaseTable.Meta): model = PowerPort fields = ('pdu', 'power_outlet', 'device', 'name') - attrs = { - 'class': 'table table-hover', - } -class InterfaceConnectionTable(tables.Table): +class InterfaceConnectionTable(BaseTable): device_a = tables.LinkColumn('dcim:device', accessor=Accessor('interface_a.device'), args=[Accessor('interface_a.device.pk')], verbose_name='Device A') interface_a = tables.Column(verbose_name='Interface A') @@ -344,9 +304,6 @@ class InterfaceConnectionTable(tables.Table): args=[Accessor('interface_b.device.pk')], verbose_name='Device B') interface_b = tables.Column(verbose_name='Interface B') - class Meta: + class Meta(BaseTable.Meta): model = PowerPort fields = ('device_a', 'interface_a', 'device_b', 'interface_b') - attrs = { - 'class': 'table table-hover', - } diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index 1dffa88fa..2267b5deb 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from utilities.tables import ToggleColumn +from utilities.tables import BaseTable, ToggleColumn from .models import Aggregate, IPAddress, Prefix, RIR, Role, VLAN, VRF @@ -55,46 +55,38 @@ STATUS_LABEL = """ # VRFs # -class VRFTable(tables.Table): +class VRFTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn('ipam:vrf', args=[Accessor('pk')], verbose_name='Name') rd = tables.Column(verbose_name='RD') description = tables.Column(orderable=False, verbose_name='Description') - class Meta: + class Meta(BaseTable.Meta): model = VRF fields = ('pk', 'name', 'rd', 'description') - empty_text = "No VRFs found." - attrs = { - 'class': 'table table-hover', - } # # RIRs # -class RIRTable(tables.Table): +class RIRTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') aggregate_count = tables.Column(verbose_name='Aggregates') slug = tables.Column(verbose_name='Slug') edit = tables.TemplateColumn(template_code=RIR_EDIT_LINK, verbose_name='') - class Meta: + class Meta(BaseTable.Meta): model = RIR fields = ('pk', 'name', 'aggregate_count', 'slug', 'edit') - empty_text = "No aggregates were found." - attrs = { - 'class': 'table table-hover', - } # # Aggregates # -class AggregateTable(tables.Table): +class AggregateTable(BaseTable): pk = ToggleColumn() prefix = tables.LinkColumn('ipam:aggregate', args=[Accessor('pk')], verbose_name='Aggregate') rir = tables.Column(verbose_name='RIR') @@ -103,20 +95,16 @@ class AggregateTable(tables.Table): date_added = tables.DateColumn(format="Y-m-d", verbose_name='Added') description = tables.Column(orderable=False, verbose_name='Description') - class Meta: + class Meta(BaseTable.Meta): model = Aggregate fields = ('pk', 'prefix', 'rir', 'child_count', 'utilization', 'date_added', 'description') - empty_text = "No aggregates found." - attrs = { - 'class': 'table table-hover', - } # # Roles # -class RoleTable(tables.Table): +class RoleTable(BaseTable): pk = ToggleColumn() name = tables.Column(verbose_name='Name') prefix_count = tables.Column(accessor=Accessor('count_prefixes'), orderable=False, verbose_name='Prefixes') @@ -124,20 +112,16 @@ class RoleTable(tables.Table): slug = tables.Column(verbose_name='Slug') edit = tables.TemplateColumn(template_code=ROLE_EDIT_LINK, verbose_name='') - class Meta: + class Meta(BaseTable.Meta): model = Role fields = ('pk', 'name', 'prefix_count', 'vlan_count', 'slug', 'edit') - empty_text = "No roles were found." - attrs = { - 'class': 'table table-hover', - } # # Prefixes # -class PrefixTable(tables.Table): +class PrefixTable(BaseTable): pk = ToggleColumn() status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status') prefix = tables.TemplateColumn(PREFIX_LINK, verbose_name='Prefix') @@ -146,35 +130,27 @@ class PrefixTable(tables.Table): role = tables.Column(verbose_name='Role') description = tables.Column(orderable=False, verbose_name='Description') - class Meta: + class Meta(BaseTable.Meta): model = Prefix fields = ('pk', 'prefix', 'status', 'vrf', 'site', 'role', 'description') - empty_text = "No prefixes found." - attrs = { - 'class': 'table table-hover', - } -class PrefixBriefTable(tables.Table): +class PrefixBriefTable(BaseTable): prefix = tables.TemplateColumn(PREFIX_LINK_BRIEF, verbose_name='Prefix') site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status') role = tables.Column(verbose_name='Role') - class Meta: + class Meta(BaseTable.Meta): model = Prefix fields = ('prefix', 'status', 'site', 'role') - empty_text = "No prefixes found." - attrs = { - 'class': 'table table-hover', - } # # IPAddresses # -class IPAddressTable(tables.Table): +class IPAddressTable(BaseTable): pk = ToggleColumn() address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address') vrf = tables.Column(orderable=False, default='Global', verbose_name='VRF') @@ -183,16 +159,12 @@ class IPAddressTable(tables.Table): interface = tables.Column(orderable=False, verbose_name='Interface') description = tables.Column(orderable=False, verbose_name='Description') - class Meta: + class Meta(BaseTable.Meta): model = IPAddress fields = ('pk', 'address', 'vrf', 'device', 'interface', 'description') - empty_text = "No IP addresses found." - attrs = { - 'class': 'table table-hover', - } -class IPAddressBriefTable(tables.Table): +class IPAddressBriefTable(BaseTable): address = tables.LinkColumn('ipam:ipaddress', args=[Accessor('pk')], verbose_name='IP Address') device = tables.LinkColumn('dcim:device', args=[Accessor('interface.device.pk')], orderable=False, verbose_name='Device') @@ -200,20 +172,16 @@ class IPAddressBriefTable(tables.Table): nat_inside = tables.LinkColumn('ipam:ipaddress', args=[Accessor('nat_inside.pk')], orderable=False, verbose_name='NAT (Inside)') - class Meta: + class Meta(BaseTable.Meta): model = IPAddress fields = ('address', 'device', 'interface', 'nat_inside') - empty_text = "No IP addresses found." - attrs = { - 'class': 'table table-hover', - } # # VLANs # -class VLANTable(tables.Table): +class VLANTable(BaseTable): pk = ToggleColumn() vid = tables.LinkColumn('ipam:vlan', args=[Accessor('pk')], verbose_name='ID') site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') @@ -221,10 +189,6 @@ class VLANTable(tables.Table): status = tables.TemplateColumn(STATUS_LABEL, verbose_name='Status') role = tables.Column(verbose_name='Role') - class Meta: + class Meta(BaseTable.Meta): model = VLAN fields = ('pk', 'vid', 'site', 'name', 'status', 'role') - empty_text = "No VLANs found." - attrs = { - 'class': 'table table-hover', - } diff --git a/netbox/secrets/tables.py b/netbox/secrets/tables.py index de0cfa048..7c199318f 100644 --- a/netbox/secrets/tables.py +++ b/netbox/secrets/tables.py @@ -1,7 +1,7 @@ import django_tables2 as tables from django_tables2.utils import Accessor -from utilities.tables import ToggleColumn +from utilities.tables import BaseTable, ToggleColumn from .models import SecretRole, Secret @@ -17,37 +17,29 @@ SECRETROLE_EDIT_LINK = """ # Secret roles # -class SecretRoleTable(tables.Table): +class SecretRoleTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') secret_count = tables.Column(verbose_name='Secrets') slug = tables.Column(verbose_name='Slug') edit = tables.TemplateColumn(template_code=SECRETROLE_EDIT_LINK, verbose_name='') - class Meta: + class Meta(BaseTable.Meta): model = SecretRole fields = ('pk', 'name', 'secret_count', 'slug', 'edit') - empty_text = "No secret roles were found." - attrs = { - 'class': 'table table-hover', - } # # Secrets # -class SecretTable(tables.Table): +class SecretTable(BaseTable): pk = ToggleColumn() device = tables.LinkColumn('secrets:secret', args=[Accessor('pk')], verbose_name='Device') role = tables.Column(verbose_name='Role') name = tables.Column(verbose_name='Name') last_modified = tables.DateTimeColumn(verbose_name='Last modified') - class Meta: + class Meta(BaseTable.Meta): model = Secret fields = ('pk', 'device', 'role', 'name', 'last_modified') - empty_text = "No secrets found." - attrs = { - 'class': 'table table-hover', - } diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index c9f60864d..8f494d609 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -3,6 +3,21 @@ import django_tables2 as tables from django.utils.safestring import mark_safe +class BaseTable(tables.Table): + + def __init__(self, *args, **kwargs): + super(BaseTable, self).__init__(*args, **kwargs) + + # Set default empty_text if none was provided + if self.empty_text is None: + self.empty_text = 'No {} found.'.format(self._meta.model._meta.verbose_name_plural) + + class Meta: + attrs = { + 'class': 'table table-hover', + } + + class ToggleColumn(tables.CheckBoxColumn): default = '' visible = False