diff --git a/netbox/circuits/choices.py b/netbox/circuits/choices.py index 1b5e69cb5..bbf536800 100644 --- a/netbox/circuits/choices.py +++ b/netbox/circuits/choices.py @@ -23,6 +23,15 @@ class CircuitStatusChoices(ChoiceSet): (STATUS_DECOMMISSIONED, 'Decommissioned'), ) + CSS_CLASSES = { + STATUS_DEPROVISIONING: 'warning', + STATUS_ACTIVE: 'success', + STATUS_PLANNED: 'info', + STATUS_PROVISIONING: 'primary', + STATUS_OFFLINE: 'danger', + STATUS_DECOMMISSIONED: 'default', + } + # # CircuitTerminations diff --git a/netbox/circuits/models.py b/netbox/circuits/models.py index fbe568f18..408a53c3c 100644 --- a/netbox/circuits/models.py +++ b/netbox/circuits/models.py @@ -191,15 +191,6 @@ class Circuit(ChangeLoggedModel, CustomFieldModel): 'provider', 'type', 'status', 'tenant', 'install_date', 'commit_rate', 'description', ] - STATUS_CLASS_MAP = { - CircuitStatusChoices.STATUS_DEPROVISIONING: 'warning', - CircuitStatusChoices.STATUS_ACTIVE: 'success', - CircuitStatusChoices.STATUS_PLANNED: 'info', - CircuitStatusChoices.STATUS_PROVISIONING: 'primary', - CircuitStatusChoices.STATUS_OFFLINE: 'danger', - CircuitStatusChoices.STATUS_DECOMMISSIONED: 'default', - } - class Meta: ordering = ['provider', 'cid'] unique_together = ['provider', 'cid'] @@ -224,7 +215,7 @@ class Circuit(ChangeLoggedModel, CustomFieldModel): ) def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return CircuitStatusChoices.CSS_CLASSES.get(self.status) def _get_termination(self, side): for ct in self.terminations.all(): diff --git a/netbox/dcim/choices.py b/netbox/dcim/choices.py index fa4f81792..d6aee8637 100644 --- a/netbox/dcim/choices.py +++ b/netbox/dcim/choices.py @@ -21,6 +21,14 @@ class SiteStatusChoices(ChoiceSet): (STATUS_RETIRED, 'Retired'), ) + CSS_CLASSES = { + STATUS_PLANNED: 'info', + STATUS_STAGING: 'primary', + STATUS_ACTIVE: 'success', + STATUS_DECOMMISSIONING: 'warning', + STATUS_RETIRED: 'danger', + } + # # Racks @@ -74,6 +82,14 @@ class RackStatusChoices(ChoiceSet): (STATUS_DEPRECATED, 'Deprecated'), ) + CSS_CLASSES = { + STATUS_RESERVED: 'warning', + STATUS_AVAILABLE: 'success', + STATUS_PLANNED: 'info', + STATUS_ACTIVE: 'primary', + STATUS_DEPRECATED: 'danger', + } + class RackDimensionUnitChoices(ChoiceSet): @@ -147,6 +163,16 @@ class DeviceStatusChoices(ChoiceSet): (STATUS_DECOMMISSIONING, 'Decommissioning'), ) + CSS_CLASSES = { + STATUS_OFFLINE: 'warning', + STATUS_ACTIVE: 'success', + STATUS_PLANNED: 'info', + STATUS_STAGED: 'primary', + STATUS_FAILED: 'danger', + STATUS_INVENTORY: 'default', + STATUS_DECOMMISSIONING: 'warning', + } + # # ConsolePorts @@ -933,6 +959,12 @@ class CableStatusChoices(ChoiceSet): (STATUS_DECOMMISSIONING, 'Decommissioning'), ) + CSS_CLASSES = { + STATUS_CONNECTED: 'success', + STATUS_PLANNED: 'info', + STATUS_DECOMMISSIONING: 'warning', + } + class CableLengthUnitChoices(ChoiceSet): @@ -967,6 +999,13 @@ class PowerFeedStatusChoices(ChoiceSet): (STATUS_FAILED, 'Failed'), ) + CSS_CLASSES = { + STATUS_OFFLINE: 'warning', + STATUS_ACTIVE: 'success', + STATUS_PLANNED: 'info', + STATUS_FAILED: 'danger', + } + class PowerFeedTypeChoices(ChoiceSet): @@ -978,6 +1017,11 @@ class PowerFeedTypeChoices(ChoiceSet): (TYPE_REDUNDANT, 'Redundant'), ) + CSS_CLASSES = { + TYPE_PRIMARY: 'success', + TYPE_REDUNDANT: 'info', + } + class PowerFeedSupplyChoices(ChoiceSet): diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 3d7963dbb..463b1a3e3 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -600,16 +600,6 @@ class Device(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): 'device_type', 'device_role', 'tenant', 'platform', 'site', 'rack', 'status', 'cluster', ] - STATUS_CLASS_MAP = { - DeviceStatusChoices.STATUS_OFFLINE: 'warning', - DeviceStatusChoices.STATUS_ACTIVE: 'success', - DeviceStatusChoices.STATUS_PLANNED: 'info', - DeviceStatusChoices.STATUS_STAGED: 'primary', - DeviceStatusChoices.STATUS_FAILED: 'danger', - DeviceStatusChoices.STATUS_INVENTORY: 'default', - DeviceStatusChoices.STATUS_DECOMMISSIONING: 'warning', - } - class Meta: ordering = ('_name', 'pk') # Name may be null unique_together = ( @@ -881,7 +871,7 @@ class Device(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): return Device.objects.filter(parent_bay__device=self.pk) def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return DeviceStatusChoices.CSS_CLASSES.get(self.status) # @@ -973,12 +963,6 @@ class Cable(ChangeLoggedModel, CustomFieldModel): 'color', 'length', 'length_unit', ] - STATUS_CLASS_MAP = { - CableStatusChoices.STATUS_CONNECTED: 'success', - CableStatusChoices.STATUS_PLANNED: 'info', - CableStatusChoices.STATUS_DECOMMISSIONING: 'warning', - } - class Meta: ordering = ['pk'] unique_together = ( @@ -1159,7 +1143,7 @@ class Cable(ChangeLoggedModel, CustomFieldModel): ) def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return CableStatusChoices.CSS_CLASSES.get(self.status) def get_compatible_types(self): """ diff --git a/netbox/dcim/models/power.py b/netbox/dcim/models/power.py index 1b226586f..f55d077a4 100644 --- a/netbox/dcim/models/power.py +++ b/netbox/dcim/models/power.py @@ -156,18 +156,6 @@ class PowerFeed(ChangeLoggedModel, CableTermination, CustomFieldModel): 'available_power', ] - STATUS_CLASS_MAP = { - PowerFeedStatusChoices.STATUS_OFFLINE: 'warning', - PowerFeedStatusChoices.STATUS_ACTIVE: 'success', - PowerFeedStatusChoices.STATUS_PLANNED: 'info', - PowerFeedStatusChoices.STATUS_FAILED: 'danger', - } - - TYPE_CLASS_MAP = { - PowerFeedTypeChoices.TYPE_PRIMARY: 'success', - PowerFeedTypeChoices.TYPE_REDUNDANT: 'info', - } - class Meta: ordering = ['power_panel', 'name'] unique_together = ['power_panel', 'name'] @@ -225,7 +213,7 @@ class PowerFeed(ChangeLoggedModel, CableTermination, CustomFieldModel): return self.power_panel def get_type_class(self): - return self.TYPE_CLASS_MAP.get(self.type) + return PowerFeedTypeChoices.CSS_CLASSES.get(self.type) def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return PowerFeedStatusChoices.CSS_CLASSES.get(self.status) diff --git a/netbox/dcim/models/racks.py b/netbox/dcim/models/racks.py index 102929476..409db14c5 100644 --- a/netbox/dcim/models/racks.py +++ b/netbox/dcim/models/racks.py @@ -276,14 +276,6 @@ class Rack(ChangeLoggedModel, CustomFieldModel): 'outer_depth', 'outer_unit', ] - STATUS_CLASS_MAP = { - RackStatusChoices.STATUS_RESERVED: 'warning', - RackStatusChoices.STATUS_AVAILABLE: 'success', - RackStatusChoices.STATUS_PLANNED: 'info', - RackStatusChoices.STATUS_ACTIVE: 'primary', - RackStatusChoices.STATUS_DEPRECATED: 'danger', - } - class Meta: ordering = ('site', 'group', '_name', 'pk') # (site, group, name) may be non-unique unique_together = ( @@ -379,7 +371,7 @@ class Rack(ChangeLoggedModel, CustomFieldModel): return self.name def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return RackStatusChoices.CSS_CLASSES.get(self.status) def get_rack_units(self, user=None, face=DeviceFaceChoices.FACE_FRONT, exclude=None, expand_devices=True): """ diff --git a/netbox/dcim/models/sites.py b/netbox/dcim/models/sites.py index 0d33da806..0adc9aac5 100644 --- a/netbox/dcim/models/sites.py +++ b/netbox/dcim/models/sites.py @@ -199,14 +199,6 @@ class Site(ChangeLoggedModel, CustomFieldModel): 'shipping_address', 'latitude', 'longitude', 'contact_name', 'contact_phone', 'contact_email', ] - STATUS_CLASS_MAP = { - SiteStatusChoices.STATUS_PLANNED: 'info', - SiteStatusChoices.STATUS_STAGING: 'primary', - SiteStatusChoices.STATUS_ACTIVE: 'success', - SiteStatusChoices.STATUS_DECOMMISSIONING: 'warning', - SiteStatusChoices.STATUS_RETIRED: 'danger', - } - class Meta: ordering = ('_name',) @@ -238,4 +230,4 @@ class Site(ChangeLoggedModel, CustomFieldModel): ) def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return SiteStatusChoices.CSS_CLASSES.get(self.status) diff --git a/netbox/extras/choices.py b/netbox/extras/choices.py index 7b4b1665a..7e1e7a036 100644 --- a/netbox/extras/choices.py +++ b/netbox/extras/choices.py @@ -99,13 +99,13 @@ class LogLevelChoices(ChoiceSet): (LOG_FAILURE, 'Failure'), ) - CLASS_MAP = ( - (LOG_DEFAULT, 'default'), - (LOG_SUCCESS, 'success'), - (LOG_INFO, 'info'), - (LOG_WARNING, 'warning'), - (LOG_FAILURE, 'danger'), - ) + CSS_CLASSES = { + LOG_DEFAULT: 'default', + LOG_SUCCESS: 'success', + LOG_INFO: 'info', + LOG_WARNING: 'warning', + LOG_FAILURE: 'danger', + } # diff --git a/netbox/extras/templatetags/log_levels.py b/netbox/extras/templatetags/log_levels.py index c92ff8cdf..050a6996d 100644 --- a/netbox/extras/templatetags/log_levels.py +++ b/netbox/extras/templatetags/log_levels.py @@ -13,5 +13,5 @@ def log_level(level): """ return { 'name': LogLevelChoices.as_dict()[level], - 'class': dict(LogLevelChoices.CLASS_MAP)[level] + 'class': LogLevelChoices.CSS_CLASSES.get(level) } diff --git a/netbox/ipam/choices.py b/netbox/ipam/choices.py index f3ff19ddc..5b7dd16bd 100644 --- a/netbox/ipam/choices.py +++ b/netbox/ipam/choices.py @@ -30,6 +30,13 @@ class PrefixStatusChoices(ChoiceSet): (STATUS_DEPRECATED, 'Deprecated'), ) + CSS_CLASSES = { + STATUS_CONTAINER: 'default', + STATUS_ACTIVE: 'primary', + STATUS_RESERVED: 'info', + STATUS_DEPRECATED: 'danger', + } + # # IPAddresses @@ -51,6 +58,14 @@ class IPAddressStatusChoices(ChoiceSet): (STATUS_SLAAC, 'SLAAC'), ) + CSS_CLASSES = { + STATUS_ACTIVE: 'primary', + STATUS_RESERVED: 'info', + STATUS_DEPRECATED: 'danger', + STATUS_DHCP: 'success', + STATUS_SLAAC: 'success', + } + class IPAddressRoleChoices(ChoiceSet): @@ -74,6 +89,17 @@ class IPAddressRoleChoices(ChoiceSet): (ROLE_CARP, 'CARP'), ) + CSS_CLASSES = { + ROLE_LOOPBACK: 'default', + ROLE_SECONDARY: 'primary', + ROLE_ANYCAST: 'warning', + ROLE_VIP: 'success', + ROLE_VRRP: 'success', + ROLE_HSRP: 'success', + ROLE_GLBP: 'success', + ROLE_CARP: 'success', + } + # # VLANs @@ -91,6 +117,12 @@ class VLANStatusChoices(ChoiceSet): (STATUS_DEPRECATED, 'Deprecated'), ) + CSS_CLASSES = { + STATUS_ACTIVE: 'primary', + STATUS_RESERVED: 'info', + STATUS_DEPRECATED: 'danger', + } + # # Services diff --git a/netbox/ipam/models.py b/netbox/ipam/models.py index f7e4d9cf4..89ea672c7 100644 --- a/netbox/ipam/models.py +++ b/netbox/ipam/models.py @@ -420,13 +420,6 @@ class Prefix(ChangeLoggedModel, CustomFieldModel): 'site', 'vrf', 'tenant', 'vlan', 'status', 'role', 'is_pool', 'description', ] - STATUS_CLASS_MAP = { - 'container': 'default', - 'active': 'primary', - 'reserved': 'info', - 'deprecated': 'danger', - } - class Meta: ordering = (F('vrf').asc(nulls_first=True), 'prefix', 'pk') # (vrf, prefix) may be non-unique verbose_name_plural = 'prefixes' @@ -507,7 +500,7 @@ class Prefix(ChangeLoggedModel, CustomFieldModel): prefix_length = property(fset=_set_prefix_length) def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return PrefixStatusChoices.CSS_CLASSES.get(self.status) def get_duplicates(self): return Prefix.objects.filter(vrf=self.vrf, prefix=str(self.prefix)).exclude(pk=self.pk) @@ -699,25 +692,6 @@ class IPAddress(ChangeLoggedModel, CustomFieldModel): 'vrf', 'tenant', 'status', 'role', 'description', ] - STATUS_CLASS_MAP = { - 'active': 'primary', - 'reserved': 'info', - 'deprecated': 'danger', - 'dhcp': 'success', - 'slaac': 'success', - } - - ROLE_CLASS_MAP = { - 'loopback': 'default', - 'secondary': 'primary', - 'anycast': 'warning', - 'vip': 'success', - 'vrrp': 'success', - 'hsrp': 'success', - 'glbp': 'success', - 'carp': 'success', - } - class Meta: ordering = ('address', 'pk') # address may be non-unique verbose_name = 'IP address' @@ -840,10 +814,10 @@ class IPAddress(ChangeLoggedModel, CustomFieldModel): mask_length = property(fset=_set_mask_length) def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return IPAddressStatusChoices.CSS_CLASSES.get(self.status) def get_role_class(self): - return self.ROLE_CLASS_MAP[self.role] + return IPAddressRoleChoices.CSS_CLASSES.get(self.role) class VLANGroup(ChangeLoggedModel): @@ -967,12 +941,6 @@ class VLAN(ChangeLoggedModel, CustomFieldModel): 'site', 'group', 'tenant', 'status', 'role', 'description', ] - STATUS_CLASS_MAP = { - 'active': 'primary', - 'reserved': 'info', - 'deprecated': 'danger', - } - class Meta: ordering = ('site', 'group', 'vid', 'pk') # (site, group, vid) may be non-unique unique_together = [ @@ -1013,7 +981,7 @@ class VLAN(ChangeLoggedModel, CustomFieldModel): return f'{self.name} ({self.vid})' def get_status_class(self): - return self.STATUS_CLASS_MAP[self.status] + return VLANStatusChoices.CSS_CLASSES.get(self.status) def get_interfaces(self): # Return all device interfaces assigned to this VLAN diff --git a/netbox/virtualization/choices.py b/netbox/virtualization/choices.py index 083470bd9..9c4eb6cd5 100644 --- a/netbox/virtualization/choices.py +++ b/netbox/virtualization/choices.py @@ -22,3 +22,12 @@ class VirtualMachineStatusChoices(ChoiceSet): (STATUS_FAILED, 'Failed'), (STATUS_DECOMMISSIONING, 'Decommissioning'), ) + + CSS_CLASSES = { + STATUS_OFFLINE: 'warning', + STATUS_ACTIVE: 'success', + STATUS_PLANNED: 'info', + STATUS_STAGED: 'primary', + STATUS_FAILED: 'danger', + STATUS_DECOMMISSIONING: 'warning', + } diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index e81ee1e49..2c9cd2a9b 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -287,15 +287,6 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): 'cluster', 'tenant', 'platform', 'status', 'role', 'vcpus', 'memory', 'disk', ] - STATUS_CLASS_MAP = { - VirtualMachineStatusChoices.STATUS_OFFLINE: 'warning', - VirtualMachineStatusChoices.STATUS_ACTIVE: 'success', - VirtualMachineStatusChoices.STATUS_PLANNED: 'info', - VirtualMachineStatusChoices.STATUS_STAGED: 'primary', - VirtualMachineStatusChoices.STATUS_FAILED: 'danger', - VirtualMachineStatusChoices.STATUS_DECOMMISSIONING: 'warning', - } - class Meta: ordering = ('name', 'pk') # Name may be non-unique unique_together = [ @@ -355,7 +346,7 @@ class VirtualMachine(ChangeLoggedModel, ConfigContextModel, CustomFieldModel): ) def get_status_class(self): - return self.STATUS_CLASS_MAP.get(self.status) + return VirtualMachineStatusChoices.CSS_CLASSES.get(self.status) @property def primary_ip(self):