1
0
mirror of https://github.com/netbox-community/netbox.git synced 2024-05-10 07:54:54 +00:00

Introduce ChoiceFieldColumn to replace template columns

This commit is contained in:
Jeremy Stretch
2020-09-25 10:52:14 -04:00
parent 1b55285167
commit 18a8a91d57
6 changed files with 44 additions and 64 deletions

View File

@ -2,13 +2,9 @@ import django_tables2 as tables
from django_tables2.utils import Accessor from django_tables2.utils import Accessor
from tenancy.tables import COL_TENANT 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 from .models import Circuit, CircuitType, Provider
STATUS_LABEL = """
<span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
"""
# #
# Providers # Providers
@ -64,9 +60,7 @@ class CircuitTable(BaseTable):
viewname='circuits:provider', viewname='circuits:provider',
args=[Accessor('provider__slug')] args=[Accessor('provider__slug')]
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
tenant = tables.TemplateColumn( tenant = tables.TemplateColumn(
template_code=COL_TENANT template_code=COL_TENANT
) )

View File

@ -3,7 +3,8 @@ from django_tables2.utils import Accessor
from tenancy.tables import COL_TENANT from tenancy.tables import COL_TENANT
from utilities.tables import ( from utilities.tables import (
BaseTable, BooleanColumn, ButtonsColumn, ColorColumn, ColoredLabelColumn, TagColumn, ToggleColumn, BaseTable, BooleanColumn, ButtonsColumn, ChoiceFieldColumn, ColorColumn, ColoredLabelColumn, TagColumn,
ToggleColumn,
) )
from .models import ( from .models import (
Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
@ -99,14 +100,6 @@ PLATFORM_VM_COUNT = """
<a href="{% url 'virtualization:virtualmachine_list' %}?platform={{ record.slug }}">{{ value|default:0 }}</a> <a href="{% url 'virtualization:virtualmachine_list' %}?platform={{ record.slug }}">{{ value|default:0 }}</a>
""" """
STATUS_LABEL = """
<span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
"""
TYPE_LABEL = """
<span class="label label-{{ record.get_type_class }}">{{ record.get_type_display }}</span>
"""
DEVICE_PRIMARY_IP = """ DEVICE_PRIMARY_IP = """
{{ record.primary_ip6.address.ip|default:"" }} {{ record.primary_ip6.address.ip|default:"" }}
{% if record.primary_ip6 and record.primary_ip4 %}<br />{% endif %} {% if record.primary_ip6 and record.primary_ip4 %}<br />{% endif %}
@ -187,9 +180,7 @@ class SiteTable(BaseTable):
name = tables.LinkColumn( name = tables.LinkColumn(
order_by=('_name',) order_by=('_name',)
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
region = tables.TemplateColumn( region = tables.TemplateColumn(
template_code=SITE_REGION_LINK template_code=SITE_REGION_LINK
) )
@ -272,9 +263,7 @@ class RackTable(BaseTable):
tenant = tables.TemplateColumn( tenant = tables.TemplateColumn(
template_code=COL_TENANT template_code=COL_TENANT
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
role = ColoredLabelColumn() role = ColoredLabelColumn()
u_height = tables.TemplateColumn( u_height = tables.TemplateColumn(
template_code="{{ record.u_height }}U", template_code="{{ record.u_height }}U",
@ -595,9 +584,7 @@ class DeviceTable(BaseTable):
order_by=('_name',), order_by=('_name',),
template_code=DEVICE_LINK template_code=DEVICE_LINK
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
tenant = tables.TemplateColumn( tenant = tables.TemplateColumn(
template_code=COL_TENANT template_code=COL_TENANT
) )
@ -663,9 +650,7 @@ class DeviceImportTable(BaseTable):
name = tables.TemplateColumn( name = tables.TemplateColumn(
template_code=DEVICE_LINK template_code=DEVICE_LINK
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
tenant = tables.TemplateColumn( tenant = tables.TemplateColumn(
template_code=COL_TENANT template_code=COL_TENANT
) )
@ -876,9 +861,7 @@ class CableTable(BaseTable):
orderable=False, orderable=False,
verbose_name='Termination B' verbose_name='Termination B'
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
length = tables.TemplateColumn( length = tables.TemplateColumn(
template_code=CABLE_LENGTH, template_code=CABLE_LENGTH,
order_by='_abs_length' order_by='_abs_length'
@ -1062,12 +1045,8 @@ class PowerFeedTable(BaseTable):
rack = tables.Column( rack = tables.Column(
linkify=True linkify=True
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL type = ChoiceFieldColumn()
)
type = tables.TemplateColumn(
template_code=TYPE_LABEL
)
max_utilization = tables.TemplateColumn( max_utilization = tables.TemplateColumn(
template_code="{{ value }}%" template_code="{{ value }}%"
) )

View File

@ -1,12 +1,15 @@
import django_tables2 as tables import django_tables2 as tables
from django.utils.safestring import mark_safe
from django_tables2.utils import Accessor from django_tables2.utils import Accessor
from dcim.models import Interface from dcim.models import Interface
from tenancy.tables import COL_TENANT 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 virtualization.models import VMInterface
from .models import Aggregate, IPAddress, Prefix, RIR, Role, RouteTarget, Service, VLAN, VLANGroup, VRF from .models import Aggregate, IPAddress, Prefix, RIR, Role, RouteTarget, Service, VLAN, VLANGroup, VRF
AVAILABLE_LABEL = mark_safe('<span class="label label-success">Available</span>')
RIR_UTILIZATION = """ RIR_UTILIZATION = """
<div class="progress"> <div class="progress">
{% if record.stats.total %} {% if record.stats.total %}
@ -327,8 +330,8 @@ class PrefixTable(BaseTable):
template_code=PREFIX_LINK, template_code=PREFIX_LINK,
attrs={'th': {'style': 'padding-left: 17px'}} attrs={'th': {'style': 'padding-left: 17px'}}
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn(
template_code=STATUS_LABEL default=AVAILABLE_LABEL
) )
vrf = tables.TemplateColumn( vrf = tables.TemplateColumn(
template_code=VRF_LINK, template_code=VRF_LINK,
@ -400,9 +403,10 @@ class IPAddressTable(BaseTable):
template_code=VRF_LINK, template_code=VRF_LINK,
verbose_name='VRF' verbose_name='VRF'
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn(
template_code=STATUS_LABEL default=AVAILABLE_LABEL
) )
role = ChoiceFieldColumn()
tenant = tables.TemplateColumn( tenant = tables.TemplateColumn(
template_code=TENANT_LINK template_code=TENANT_LINK
) )
@ -461,9 +465,7 @@ class IPAddressAssignTable(BaseTable):
template_code=IPADDRESS_ASSIGN_LINK, template_code=IPADDRESS_ASSIGN_LINK,
verbose_name='IP Address' verbose_name='IP Address'
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
assigned_object = tables.Column( assigned_object = tables.Column(
orderable=False orderable=False
) )
@ -485,9 +487,7 @@ class InterfaceIPAddressTable(BaseTable):
template_code=VRF_LINK, template_code=VRF_LINK,
verbose_name='VRF' verbose_name='VRF'
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
tenant = tables.TemplateColumn( tenant = tables.TemplateColumn(
template_code=TENANT_LINK template_code=TENANT_LINK
) )
@ -543,8 +543,8 @@ class VLANTable(BaseTable):
tenant = tables.TemplateColumn( tenant = tables.TemplateColumn(
template_code=COL_TENANT template_code=COL_TENANT
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn(
template_code=STATUS_LABEL default=AVAILABLE_LABEL
) )
role = tables.TemplateColumn( role = tables.TemplateColumn(
template_code=VLAN_ROLE_LINK template_code=VLAN_ROLE_LINK
@ -630,9 +630,7 @@ class InterfaceVLANTable(BaseTable):
tenant = tables.TemplateColumn( tenant = tables.TemplateColumn(
template_code=COL_TENANT template_code=COL_TENANT
) )
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=STATUS_LABEL
)
role = tables.TemplateColumn( role = tables.TemplateColumn(
template_code=VLAN_ROLE_LINK template_code=VLAN_ROLE_LINK
) )

View File

@ -11,7 +11,7 @@ def add_available_prefixes(parent, prefix_list):
# Find all unallocated space # Find all unallocated space
available_prefixes = netaddr.IPSet(parent) ^ netaddr.IPSet([p.prefix for p in prefix_list]) 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 # Concatenate and sort complete list of children
prefix_list = list(prefix_list) + available_prefixes prefix_list = list(prefix_list) + available_prefixes

View File

@ -174,6 +174,22 @@ class ButtonsColumn(tables.TemplateColumn):
return '' return ''
class ChoiceFieldColumn(tables.Column):
"""
Render a ChoiceField value inside a <span> 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'<span class="label label-{css_class}">{label}</span>'
)
return self.default
class ColorColumn(tables.Column): class ColorColumn(tables.Column):
""" """
Display a color (#RRGGBB). Display a color (#RRGGBB).

View File

@ -1,15 +1,10 @@
import django_tables2 as tables import django_tables2 as tables
from django_tables2.utils import Accessor
from dcim.tables import BaseInterfaceTable from dcim.tables import BaseInterfaceTable
from tenancy.tables import COL_TENANT 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 from .models import Cluster, ClusterGroup, ClusterType, VirtualMachine, VMInterface
VIRTUALMACHINE_STATUS = """
<span class="label label-{{ record.get_status_class }}">{{ record.get_status_display }}</span>
"""
VIRTUALMACHINE_PRIMARY_IP = """ VIRTUALMACHINE_PRIMARY_IP = """
{{ record.primary_ip6.address.ip|default:"" }} {{ record.primary_ip6.address.ip|default:"" }}
{% if record.primary_ip6 and record.primary_ip4 %}<br />{% endif %} {% if record.primary_ip6 and record.primary_ip4 %}<br />{% endif %}
@ -99,9 +94,7 @@ class ClusterTable(BaseTable):
class VirtualMachineTable(BaseTable): class VirtualMachineTable(BaseTable):
pk = ToggleColumn() pk = ToggleColumn()
name = tables.LinkColumn() name = tables.LinkColumn()
status = tables.TemplateColumn( status = ChoiceFieldColumn()
template_code=VIRTUALMACHINE_STATUS
)
cluster = tables.Column( cluster = tables.Column(
linkify=True linkify=True
) )