From 18a8a91d57271b632583ba53572dc9d010113b2d Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 25 Sep 2020 10:52:14 -0400 Subject: [PATCH] Introduce ChoiceFieldColumn to replace template columns --- netbox/circuits/tables.py | 10 ++------- netbox/dcim/tables.py | 39 ++++++++------------------------- netbox/ipam/tables.py | 30 ++++++++++++------------- netbox/ipam/utils.py | 2 +- netbox/utilities/tables.py | 16 ++++++++++++++ netbox/virtualization/tables.py | 11 ++-------- 6 files changed, 44 insertions(+), 64 deletions(-) diff --git a/netbox/circuits/tables.py b/netbox/circuits/tables.py index 4aca8688f..782b02394 100644 --- a/netbox/circuits/tables.py +++ b/netbox/circuits/tables.py @@ -2,13 +2,9 @@ import django_tables2 as tables from django_tables2.utils import Accessor from tenancy.tables import COL_TENANT -from utilities.tables import BaseTable, ButtonsColumn, TagColumn, ToggleColumn +from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, TagColumn, ToggleColumn from .models import Circuit, CircuitType, Provider -STATUS_LABEL = """ -{{ record.get_status_display }} -""" - # # Providers @@ -64,9 +60,7 @@ class CircuitTable(BaseTable): viewname='circuits:provider', args=[Accessor('provider__slug')] ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() tenant = tables.TemplateColumn( template_code=COL_TENANT ) diff --git a/netbox/dcim/tables.py b/netbox/dcim/tables.py index 371eff9db..4486ecd1b 100644 --- a/netbox/dcim/tables.py +++ b/netbox/dcim/tables.py @@ -3,7 +3,8 @@ from django_tables2.utils import Accessor from tenancy.tables import COL_TENANT from utilities.tables import ( - BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, ColoredLabelColumn, TagColumn, ToggleColumn, + BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, TagColumn, + ToggleColumn, ) from .models import ( Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, @@ -99,14 +100,6 @@ PLATFORM_VM_COUNT = """ {{ value|default:0 }} """ -STATUS_LABEL = """ -{{ record.get_status_display }} -""" - -TYPE_LABEL = """ -{{ record.get_type_display }} -""" - DEVICE_PRIMARY_IP = """ {{ record.primary_ip6.address.ip|default:"" }} {% if record.primary_ip6 and record.primary_ip4 %}
{% endif %} @@ -187,9 +180,7 @@ class SiteTable(BaseTable): name = tables.LinkColumn( order_by=('_name',) ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() region = tables.TemplateColumn( template_code=SITE_REGION_LINK ) @@ -272,9 +263,7 @@ class RackTable(BaseTable): tenant = tables.TemplateColumn( template_code=COL_TENANT ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() role = ColoredLabelColumn() u_height = tables.TemplateColumn( template_code="{{ record.u_height }}U", @@ -595,9 +584,7 @@ class DeviceTable(BaseTable): order_by=('_name',), template_code=DEVICE_LINK ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() tenant = tables.TemplateColumn( template_code=COL_TENANT ) @@ -663,9 +650,7 @@ class DeviceImportTable(BaseTable): name = tables.TemplateColumn( template_code=DEVICE_LINK ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() tenant = tables.TemplateColumn( template_code=COL_TENANT ) @@ -876,9 +861,7 @@ class CableTable(BaseTable): orderable=False, verbose_name='Termination B' ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() length = tables.TemplateColumn( template_code=CABLE_LENGTH, order_by='_abs_length' @@ -1062,12 +1045,8 @@ class PowerFeedTable(BaseTable): rack = tables.Column( linkify=True ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) - type = tables.TemplateColumn( - template_code=TYPE_LABEL - ) + status = ChoiceFieldColumn() + type = ChoiceFieldColumn() max_utilization = tables.TemplateColumn( template_code="{{ value }}%" ) diff --git a/netbox/ipam/tables.py b/netbox/ipam/tables.py index 6a76b5c91..e8b2474ea 100644 --- a/netbox/ipam/tables.py +++ b/netbox/ipam/tables.py @@ -1,12 +1,15 @@ 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 COL_TENANT -from utilities.tables import BaseTable, BooleanColumn, ButtonsColumn, TagColumn, ToggleColumn +from utilities.tables import BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, TagColumn, ToggleColumn from virtualization.models import VMInterface from .models import Aggregate, IPAddress, Prefix, RIR, Role, RouteTarget, Service, VLAN, VLANGroup, VRF +AVAILABLE_LABEL = mark_safe('Available') + RIR_UTILIZATION = """
{% if record.stats.total %} @@ -327,8 +330,8 @@ class PrefixTable(BaseTable): template_code=PREFIX_LINK, attrs={'th': {'style': 'padding-left: 17px'}} ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL + status = ChoiceFieldColumn( + default=AVAILABLE_LABEL ) vrf = tables.TemplateColumn( template_code=VRF_LINK, @@ -400,9 +403,10 @@ class IPAddressTable(BaseTable): template_code=VRF_LINK, verbose_name='VRF' ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL + status = ChoiceFieldColumn( + default=AVAILABLE_LABEL ) + role = ChoiceFieldColumn() tenant = tables.TemplateColumn( template_code=TENANT_LINK ) @@ -461,9 +465,7 @@ class IPAddressAssignTable(BaseTable): template_code=IPADDRESS_ASSIGN_LINK, verbose_name='IP Address' ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() assigned_object = tables.Column( orderable=False ) @@ -485,9 +487,7 @@ class InterfaceIPAddressTable(BaseTable): template_code=VRF_LINK, verbose_name='VRF' ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() tenant = tables.TemplateColumn( template_code=TENANT_LINK ) @@ -543,8 +543,8 @@ class VLANTable(BaseTable): tenant = tables.TemplateColumn( template_code=COL_TENANT ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL + status = ChoiceFieldColumn( + default=AVAILABLE_LABEL ) role = tables.TemplateColumn( template_code=VLAN_ROLE_LINK @@ -630,9 +630,7 @@ class InterfaceVLANTable(BaseTable): tenant = tables.TemplateColumn( template_code=COL_TENANT ) - status = tables.TemplateColumn( - template_code=STATUS_LABEL - ) + status = ChoiceFieldColumn() role = tables.TemplateColumn( template_code=VLAN_ROLE_LINK ) diff --git a/netbox/ipam/utils.py b/netbox/ipam/utils.py index f3cc0cb52..0414a01e0 100644 --- a/netbox/ipam/utils.py +++ b/netbox/ipam/utils.py @@ -11,7 +11,7 @@ def add_available_prefixes(parent, prefix_list): # Find all unallocated space available_prefixes = netaddr.IPSet(parent) ^ netaddr.IPSet([p.prefix for p in prefix_list]) - available_prefixes = [Prefix(prefix=p) for p in available_prefixes.iter_cidrs()] + available_prefixes = [Prefix(prefix=p, status=None) for p in available_prefixes.iter_cidrs()] # Concatenate and sort complete list of children prefix_list = list(prefix_list) + available_prefixes diff --git a/netbox/utilities/tables.py b/netbox/utilities/tables.py index d1f17ff1e..76c37b403 100644 --- a/netbox/utilities/tables.py +++ b/netbox/utilities/tables.py @@ -174,6 +174,22 @@ class ButtonsColumn(tables.TemplateColumn): return '' +class ChoiceFieldColumn(tables.Column): + """ + Render a ChoiceField value inside a indicating a particular CSS class. This is useful for displaying colored + choices. The CSS class is derived by calling .get_FOO_class() on the row record. + """ + def render(self, record, bound_column, value): + if value: + name = bound_column.name + css_class = getattr(record, f'get_{name}_class')() + label = getattr(record, f'get_{name}_display')() + return mark_safe( + f'{label}' + ) + return self.default + + class ColorColumn(tables.Column): """ Display a color (#RRGGBB). diff --git a/netbox/virtualization/tables.py b/netbox/virtualization/tables.py index 5f5b9326d..7cb684dee 100644 --- a/netbox/virtualization/tables.py +++ b/netbox/virtualization/tables.py @@ -1,15 +1,10 @@ import django_tables2 as tables -from django_tables2.utils import Accessor from dcim.tables import BaseInterfaceTable from tenancy.tables import COL_TENANT -from utilities.tables import BaseTable, ButtonsColumn, ColoredLabelColumn, TagColumn, ToggleColumn +from utilities.tables import BaseTable, ButtonsColumn, ChoiceFieldColumn, ColoredLabelColumn, TagColumn, ToggleColumn from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface -VIRTUALMACHINE_STATUS = """ -{{ record.get_status_display }} -""" - VIRTUALMACHINE_PRIMARY_IP = """ {{ record.primary_ip6.address.ip|default:"" }} {% if record.primary_ip6 and record.primary_ip4 %}
{% endif %} @@ -99,9 +94,7 @@ class ClusterTable(BaseTable): class VirtualMachineTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn() - status = tables.TemplateColumn( - template_code=VIRTUALMACHINE_STATUS - ) + status = ChoiceFieldColumn() cluster = tables.Column( linkify=True )