From 7b3f6f1c673fe602530c7727c94ffbf3de0cdb08 Mon Sep 17 00:00:00 2001 From: jeremystretch Date: Fri, 17 Sep 2021 15:37:19 -0400 Subject: [PATCH] Clean up table classes --- netbox/circuits/tables.py | 8 + netbox/dcim/tables/devices.py | 1 + netbox/extras/tables.py | 13 ++ netbox/ipam/tables/__init__.py | 4 + netbox/ipam/{tables.py => tables/ip.py} | 288 ++---------------------- netbox/ipam/tables/services.py | 35 +++ netbox/ipam/tables/vlans.py | 203 +++++++++++++++++ netbox/ipam/tables/vrfs.py | 74 ++++++ netbox/tenancy/tables.py | 6 + 9 files changed, 357 insertions(+), 275 deletions(-) create mode 100644 netbox/ipam/tables/__init__.py rename netbox/ipam/{tables.py => tables/ip.py} (59%) create mode 100644 netbox/ipam/tables/services.py create mode 100644 netbox/ipam/tables/vlans.py create mode 100644 netbox/ipam/tables/vrfs.py diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index c3e616d8a..2e31237b6 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -6,6 +6,14 @@ from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, Markdo from .models import * +__all__ = ( + 'CircuitTable', + 'CircuitTypeTable', + 'ProviderTable', + 'ProviderNetworkTable', +) + + CIRCUITTERMINATION_LINK = """ {% if value.site %} {{ value.site }} diff --git a/netbox/dcim/tables/devices.py b/netbox/dcim/tables/devices.py index dda0af2b4..306b29b09 100644 --- a/netbox/dcim/tables/devices.py +++ b/netbox/dcim/tables/devices.py @@ -18,6 +18,7 @@ from .template_code import ( ) __all__ = ( + 'BaseInterfaceTable', 'ConsolePortTable', 'ConsoleServerPortTable', 'DeviceBayTable', diff --git a/netbox/extras/tables.py b/netbox/extras/tables.py index c556e312f..20a6ffd8a 100644 --- a/netbox/extras/tables.py +++ b/netbox/extras/tables.py @@ -7,6 +7,19 @@ from utilities.tables import ( ) from .models import * +__all__ = ( + 'ConfigContextTable', + 'CustomFieldTable', + 'CustomLinkTable', + 'ExportTemplateTable', + 'JournalEntryTable', + 'ObjectChangeTable', + 'ObjectJournalTable', + 'TaggedItemTable', + 'TagTable', + 'WebhookTable', +) + CONFIGCONTEXT_ACTIONS = """ {% if perms.extras.change_configcontext %} diff --git a/netbox/ipam/tables/__init__.py b/netbox/ipam/tables/__init__.py new file mode 100644 index 000000000..a280eac1b --- /dev/null +++ b/netbox/ipam/tables/__init__.py @@ -0,0 +1,4 @@ +from .ip import * +from .services import * +from .vlans import * +from .vrfs import * diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables/ip.py similarity index 59% rename from netbox/ipam/tables.py rename to netbox/ipam/tables/ip.py index a39df2601..2e59a681c 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables/ip.py @@ -2,14 +2,23 @@ import django_tables2 as tables from django.utils.safestring import mark_safe from django_tables2.utils import Accessor -from dcim.models import Interface from tenancy.tables import TenantColumn from utilities.tables import ( - BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn, + BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, LinkedCountColumn, TagColumn, ToggleColumn, UtilizationColumn, ) -from virtualization.models import VMInterface -from .models import * +from ipam.models import * + +__all__ = ( + 'AggregateTable', + 'InterfaceIPAddressTable', + 'IPAddressAssignTable', + 'IPAddressTable', + 'IPRangeTable', + 'PrefixTable', + 'RIRTable', + 'RoleTable', +) AVAILABLE_LABEL = mark_safe('Available') @@ -66,114 +75,6 @@ VRF_LINK = """ {% endif %} """ -VRF_TARGETS = """ -{% for rt in value.all %} - {{ rt }}{% if not forloop.last %}
{% endif %} -{% empty %} - — -{% endfor %} -""" - -VLAN_LINK = """ -{% if record.pk %} - {{ record.vid }} -{% elif perms.ipam.add_vlan %} - {{ record.available }} VLAN{{ record.available|pluralize }} available -{% else %} - {{ record.available }} VLAN{{ record.available|pluralize }} available -{% endif %} -""" - -VLAN_PREFIXES = """ -{% for prefix in record.prefixes.all %} - {{ prefix }}{% if not forloop.last %}
{% endif %} -{% empty %} - — -{% endfor %} -""" - -VLAN_ROLE_LINK = """ -{% if record.role %} - {{ record.role }} -{% else %} - — -{% endif %} -""" - -VLANGROUP_ADD_VLAN = """ -{% with next_vid=record.get_next_available_vid %} - {% if next_vid and perms.ipam.add_vlan %} - - - - {% endif %} -{% endwith %} -""" - -VLAN_MEMBER_TAGGED = """ -{% if record.untagged_vlan_id == object.pk %} - -{% else %} - -{% endif %} -""" - - -# -# VRFs -# - -class VRFTable(BaseTable): - pk = ToggleColumn() - name = tables.Column( - linkify=True - ) - rd = tables.Column( - verbose_name='RD' - ) - tenant = TenantColumn() - enforce_unique = BooleanColumn( - verbose_name='Unique' - ) - import_targets = tables.TemplateColumn( - template_code=VRF_TARGETS, - orderable=False - ) - export_targets = tables.TemplateColumn( - template_code=VRF_TARGETS, - orderable=False - ) - tags = TagColumn( - url_name='ipam:vrf_list' - ) - - class Meta(BaseTable.Meta): - model = VRF - fields = ( - 'pk', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tags', - ) - default_columns = ('pk', 'name', 'rd', 'tenant', 'description') - - -# -# Route targets -# - -class RouteTargetTable(BaseTable): - pk = ToggleColumn() - name = tables.Column( - linkify=True - ) - tenant = TenantColumn() - tags = TagColumn( - url_name='ipam:vrf_list' - ) - - class Meta(BaseTable.Meta): - model = RouteTarget - fields = ('pk', 'name', 'tenant', 'description', 'tags') - default_columns = ('pk', 'name', 'tenant', 'description') - # # RIRs @@ -475,166 +376,3 @@ class InterfaceIPAddressTable(BaseTable): class Meta(BaseTable.Meta): model = IPAddress fields = ('address', 'vrf', 'status', 'role', 'tenant', 'description') - - -# -# VLAN groups -# - -class VLANGroupTable(BaseTable): - pk = ToggleColumn() - name = tables.Column(linkify=True) - scope_type = ContentTypeColumn() - scope = tables.Column( - linkify=True, - orderable=False - ) - vlan_count = LinkedCountColumn( - viewname='ipam:vlan_list', - url_params={'group_id': 'pk'}, - verbose_name='VLANs' - ) - actions = ButtonsColumn( - model=VLANGroup, - prepend_template=VLANGROUP_ADD_VLAN - ) - - class Meta(BaseTable.Meta): - model = VLANGroup - fields = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'slug', 'description', 'actions') - default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description', 'actions') - - -# -# VLANs -# - -class VLANTable(BaseTable): - pk = ToggleColumn() - vid = tables.TemplateColumn( - template_code=VLAN_LINK, - verbose_name='ID' - ) - site = tables.Column( - linkify=True - ) - group = tables.Column( - linkify=True - ) - tenant = TenantColumn() - status = ChoiceFieldColumn( - default=AVAILABLE_LABEL - ) - role = tables.TemplateColumn( - template_code=VLAN_ROLE_LINK - ) - prefixes = tables.TemplateColumn( - template_code=VLAN_PREFIXES, - orderable=False, - verbose_name='Prefixes' - ) - tags = TagColumn( - url_name='ipam:vlan_list' - ) - - class Meta(BaseTable.Meta): - model = VLAN - fields = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags') - default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description') - row_attrs = { - 'class': lambda record: 'success' if not isinstance(record, VLAN) else '', - } - - -class VLANMembersTable(BaseTable): - """ - Base table for Interface and VMInterface assignments - """ - name = tables.Column( - linkify=True, - verbose_name='Interface' - ) - tagged = tables.TemplateColumn( - template_code=VLAN_MEMBER_TAGGED, - orderable=False - ) - - -class VLANDevicesTable(VLANMembersTable): - device = tables.Column( - linkify=True - ) - actions = ButtonsColumn(Interface, buttons=['edit']) - - class Meta(BaseTable.Meta): - model = Interface - fields = ('device', 'name', 'tagged', 'actions') - - -class VLANVirtualMachinesTable(VLANMembersTable): - virtual_machine = tables.Column( - linkify=True - ) - actions = ButtonsColumn(VMInterface, buttons=['edit']) - - class Meta(BaseTable.Meta): - model = VMInterface - fields = ('virtual_machine', 'name', 'tagged', 'actions') - - -class InterfaceVLANTable(BaseTable): - """ - List VLANs assigned to a specific Interface. - """ - vid = tables.Column( - linkify=True, - verbose_name='ID' - ) - tagged = BooleanColumn() - site = tables.Column( - linkify=True - ) - group = tables.Column( - accessor=Accessor('group__name'), - verbose_name='Group' - ) - tenant = TenantColumn() - status = ChoiceFieldColumn() - role = tables.TemplateColumn( - template_code=VLAN_ROLE_LINK - ) - - class Meta(BaseTable.Meta): - model = VLAN - fields = ('vid', 'tagged', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description') - - def __init__(self, interface, *args, **kwargs): - self.interface = interface - super().__init__(*args, **kwargs) - - -# -# Services -# - -class ServiceTable(BaseTable): - pk = ToggleColumn() - name = tables.Column( - linkify=True - ) - parent = tables.Column( - linkify=True, - order_by=('device', 'virtual_machine') - ) - ports = tables.TemplateColumn( - template_code='{{ record.port_list }}', - verbose_name='Ports' - ) - tags = TagColumn( - url_name='ipam:service_list' - ) - - class Meta(BaseTable.Meta): - model = Service - fields = ('pk', 'name', 'parent', 'protocol', 'ports', 'ipaddresses', 'description', 'tags') - default_columns = ('pk', 'name', 'parent', 'protocol', 'ports', 'description') diff --git a/netbox/ipam/tables/services.py b/netbox/ipam/tables/services.py new file mode 100644 index 000000000..58c8ea49e --- /dev/null +++ b/netbox/ipam/tables/services.py @@ -0,0 +1,35 @@ +import django_tables2 as tables + +from utilities.tables import BaseTable, TagColumn, ToggleColumn +from ipam.models import * + +__all__ = ( + 'ServiceTable', +) + + +# +# Services +# + +class ServiceTable(BaseTable): + pk = ToggleColumn() + name = tables.Column( + linkify=True + ) + parent = tables.Column( + linkify=True, + order_by=('device', 'virtual_machine') + ) + ports = tables.TemplateColumn( + template_code='{{ record.port_list }}', + verbose_name='Ports' + ) + tags = TagColumn( + url_name='ipam:service_list' + ) + + class Meta(BaseTable.Meta): + model = Service + fields = ('pk', 'name', 'parent', 'protocol', 'ports', 'ipaddresses', 'description', 'tags') + default_columns = ('pk', 'name', 'parent', 'protocol', 'ports', 'description') diff --git a/netbox/ipam/tables/vlans.py b/netbox/ipam/tables/vlans.py new file mode 100644 index 000000000..4219a8a52 --- /dev/null +++ b/netbox/ipam/tables/vlans.py @@ -0,0 +1,203 @@ +import django_tables2 as tables +from django.utils.safestring import mark_safe +from django_tables2.utils import Accessor + +from dcim.models import Interface +from tenancy.tables import TenantColumn +from utilities.tables import ( + BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ContentTypeColumn, LinkedCountColumn, TagColumn, + ToggleColumn, +) +from virtualization.models import VMInterface +from ipam.models import * + +__all__ = ( + 'InterfaceVLANTable', + 'VLANDevicesTable', + 'VLANGroupTable', + 'VLANMembersTable', + 'VLANTable', + 'VLANVirtualMachinesTable', +) + +AVAILABLE_LABEL = mark_safe('Available') + +VLAN_LINK = """ +{% if record.pk %} + {{ record.vid }} +{% elif perms.ipam.add_vlan %} + {{ record.available }} VLAN{{ record.available|pluralize }} available +{% else %} + {{ record.available }} VLAN{{ record.available|pluralize }} available +{% endif %} +""" + +VLAN_PREFIXES = """ +{% for prefix in record.prefixes.all %} + {{ prefix }}{% if not forloop.last %}
{% endif %} +{% empty %} + — +{% endfor %} +""" + +VLAN_ROLE_LINK = """ +{% if record.role %} + {{ record.role }} +{% else %} + — +{% endif %} +""" + +VLANGROUP_ADD_VLAN = """ +{% with next_vid=record.get_next_available_vid %} + {% if next_vid and perms.ipam.add_vlan %} + + + + {% endif %} +{% endwith %} +""" + +VLAN_MEMBER_TAGGED = """ +{% if record.untagged_vlan_id == object.pk %} + +{% else %} + +{% endif %} +""" + + +# +# VLAN groups +# + +class VLANGroupTable(BaseTable): + pk = ToggleColumn() + name = tables.Column(linkify=True) + scope_type = ContentTypeColumn() + scope = tables.Column( + linkify=True, + orderable=False + ) + vlan_count = LinkedCountColumn( + viewname='ipam:vlan_list', + url_params={'group_id': 'pk'}, + verbose_name='VLANs' + ) + actions = ButtonsColumn( + model=VLANGroup, + prepend_template=VLANGROUP_ADD_VLAN + ) + + class Meta(BaseTable.Meta): + model = VLANGroup + fields = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'slug', 'description', 'actions') + default_columns = ('pk', 'name', 'scope_type', 'scope', 'vlan_count', 'description', 'actions') + + +# +# VLANs +# + +class VLANTable(BaseTable): + pk = ToggleColumn() + vid = tables.TemplateColumn( + template_code=VLAN_LINK, + verbose_name='ID' + ) + site = tables.Column( + linkify=True + ) + group = tables.Column( + linkify=True + ) + tenant = TenantColumn() + status = ChoiceFieldColumn( + default=AVAILABLE_LABEL + ) + role = tables.TemplateColumn( + template_code=VLAN_ROLE_LINK + ) + prefixes = tables.TemplateColumn( + template_code=VLAN_PREFIXES, + orderable=False, + verbose_name='Prefixes' + ) + tags = TagColumn( + url_name='ipam:vlan_list' + ) + + class Meta(BaseTable.Meta): + model = VLAN + fields = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description', 'tags') + default_columns = ('pk', 'vid', 'name', 'site', 'group', 'prefixes', 'tenant', 'status', 'role', 'description') + row_attrs = { + 'class': lambda record: 'success' if not isinstance(record, VLAN) else '', + } + + +class VLANMembersTable(BaseTable): + """ + Base table for Interface and VMInterface assignments + """ + name = tables.Column( + linkify=True, + verbose_name='Interface' + ) + tagged = tables.TemplateColumn( + template_code=VLAN_MEMBER_TAGGED, + orderable=False + ) + + +class VLANDevicesTable(VLANMembersTable): + device = tables.Column( + linkify=True + ) + actions = ButtonsColumn(Interface, buttons=['edit']) + + class Meta(BaseTable.Meta): + model = Interface + fields = ('device', 'name', 'tagged', 'actions') + + +class VLANVirtualMachinesTable(VLANMembersTable): + virtual_machine = tables.Column( + linkify=True + ) + actions = ButtonsColumn(VMInterface, buttons=['edit']) + + class Meta(BaseTable.Meta): + model = VMInterface + fields = ('virtual_machine', 'name', 'tagged', 'actions') + + +class InterfaceVLANTable(BaseTable): + """ + List VLANs assigned to a specific Interface. + """ + vid = tables.Column( + linkify=True, + verbose_name='ID' + ) + tagged = BooleanColumn() + site = tables.Column( + linkify=True + ) + group = tables.Column( + accessor=Accessor('group__name'), + verbose_name='Group' + ) + tenant = TenantColumn() + status = ChoiceFieldColumn() + role = tables.TemplateColumn( + template_code=VLAN_ROLE_LINK + ) + + class Meta(BaseTable.Meta): + model = VLAN + fields = ('vid', 'tagged', 'site', 'group', 'name', 'tenant', 'status', 'role', 'description') + + def __init__(self, interface, *args, **kwargs): + self.interface = interface + super().__init__(*args, **kwargs) diff --git a/netbox/ipam/tables/vrfs.py b/netbox/ipam/tables/vrfs.py new file mode 100644 index 000000000..bea2a6b1f --- /dev/null +++ b/netbox/ipam/tables/vrfs.py @@ -0,0 +1,74 @@ +import django_tables2 as tables + +from tenancy.tables import TenantColumn +from utilities.tables import BaseTable, BooleanColumn, TagColumn, ToggleColumn +from ipam.models import * + +__all__ = ( + 'RouteTargetTable', + 'VRFTable', +) + +VRF_TARGETS = """ +{% for rt in value.all %} + {{ rt }}{% if not forloop.last %}
{% endif %} +{% empty %} + — +{% endfor %} +""" + + +# +# VRFs +# + +class VRFTable(BaseTable): + pk = ToggleColumn() + name = tables.Column( + linkify=True + ) + rd = tables.Column( + verbose_name='RD' + ) + tenant = TenantColumn() + enforce_unique = BooleanColumn( + verbose_name='Unique' + ) + import_targets = tables.TemplateColumn( + template_code=VRF_TARGETS, + orderable=False + ) + export_targets = tables.TemplateColumn( + template_code=VRF_TARGETS, + orderable=False + ) + tags = TagColumn( + url_name='ipam:vrf_list' + ) + + class Meta(BaseTable.Meta): + model = VRF + fields = ( + 'pk', 'name', 'rd', 'tenant', 'enforce_unique', 'description', 'import_targets', 'export_targets', 'tags', + ) + default_columns = ('pk', 'name', 'rd', 'tenant', 'description') + + +# +# Route targets +# + +class RouteTargetTable(BaseTable): + pk = ToggleColumn() + name = tables.Column( + linkify=True + ) + tenant = TenantColumn() + tags = TagColumn( + url_name='ipam:vrf_list' + ) + + class Meta(BaseTable.Meta): + model = RouteTarget + fields = ('pk', 'name', 'tenant', 'description', 'tags') + default_columns = ('pk', 'name', 'tenant', 'description') diff --git a/netbox/tenancy/tables.py b/netbox/tenancy/tables.py index 961d02dcc..c62c641d1 100644 --- a/netbox/tenancy/tables.py +++ b/netbox/tenancy/tables.py @@ -5,6 +5,12 @@ from utilities.tables import ( ) from .models import Tenant, TenantGroup +__all__ = ( + 'TenantColumn', + 'TenantGroupTable', + 'TenantTable', +) + # # Table columns