13150 internationalize dcim tables

This commit is contained in:
Arthur 2023-07-25 14:56:27 +07:00
parent d39a99f0e1
commit a4c7fb8294
11 changed files with 370 additions and 143 deletions

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from core.models import *
@ -11,11 +12,18 @@ __all__ = (
class DataSourceTable(NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
type = columns.ChoiceFieldColumn()
status = columns.ChoiceFieldColumn()
enabled = columns.BooleanColumn()
type = columns.ChoiceFieldColumn(
verbose_name=_('Type'),
)
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
enabled = columns.BooleanColumn(
verbose_name=_('Enabled'),
)
tags = columns.TagColumn(
url_name='core:datasource_list'
)
@ -34,13 +42,18 @@ class DataSourceTable(NetBoxTable):
class DataFileTable(NetBoxTable):
source = tables.Column(
verbose_name=_('Source'),
linkify=True
)
path = tables.Column(
verbose_name=_('Path'),
linkify=True
)
last_updated = columns.DateTimeColumn()
last_updated = columns.DateTimeColumn(
verbose_name=_('Last updated'),
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('delete',)
)

View File

@ -1,5 +1,5 @@
import django_tables2 as tables
from django.utils.translation import gettext as _
from django.utils.translation import gettext_lazy as _
from netbox.tables import NetBoxTable, columns
from ..models import Job
@ -7,24 +7,40 @@ from ..models import Job
class JobTable(NetBoxTable):
id = tables.Column(
verbose_name=_('Id'),
linkify=True
)
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
object_type = columns.ContentTypeColumn(
verbose_name=_('Type')
)
object = tables.Column(
verbose_name=_('Object'),
linkify=True
)
status = columns.ChoiceFieldColumn()
created = columns.DateTimeColumn()
scheduled = columns.DateTimeColumn()
interval = columns.DurationColumn()
started = columns.DateTimeColumn()
completed = columns.DateTimeColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
created = columns.DateTimeColumn(
verbose_name=_('Created'),
)
scheduled = columns.DateTimeColumn(
verbose_name=_('Scheduled'),
)
interval = columns.DurationColumn(
verbose_name=_('Interval'),
)
started = columns.DateTimeColumn(
verbose_name=_('Started'),
)
completed = columns.DateTimeColumn(
verbose_name=_('Completed'),
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('delete',)
)

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from django_tables2.utils import Accessor
from django.utils.safestring import mark_safe
@ -50,60 +51,60 @@ class CableTable(TenancyColumnsMixin, NetBoxTable):
a_terminations = CableTerminationsColumn(
cable_end='A',
orderable=False,
verbose_name='Termination A'
verbose_name=_('Termination A')
)
b_terminations = CableTerminationsColumn(
cable_end='B',
orderable=False,
verbose_name='Termination B'
verbose_name=_('Termination B')
)
device_a = CableTerminationsColumn(
cable_end='A',
attr='_device',
orderable=False,
verbose_name='Device A'
verbose_name=_('Device A')
)
device_b = CableTerminationsColumn(
cable_end='B',
attr='_device',
orderable=False,
verbose_name='Device B'
verbose_name=_('Device B')
)
location_a = CableTerminationsColumn(
cable_end='A',
attr='_location',
orderable=False,
verbose_name='Location A'
verbose_name=_('Location A')
)
location_b = CableTerminationsColumn(
cable_end='B',
attr='_location',
orderable=False,
verbose_name='Location B'
verbose_name=_('Location B')
)
rack_a = CableTerminationsColumn(
cable_end='A',
attr='_rack',
orderable=False,
verbose_name='Rack A'
verbose_name=_('Rack A')
)
rack_b = CableTerminationsColumn(
cable_end='B',
attr='_rack',
orderable=False,
verbose_name='Rack B'
verbose_name=_('Rack B')
)
site_a = CableTerminationsColumn(
cable_end='A',
attr='_site',
orderable=False,
verbose_name='Site A'
verbose_name=_('Site A')
)
site_b = CableTerminationsColumn(
cable_end='B',
attr='_site',
orderable=False,
verbose_name='Site B'
verbose_name=_('Site B')
)
status = columns.ChoiceFieldColumn()
length = columns.TemplateColumn(

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from django_tables2.utils import Accessor
@ -18,15 +19,16 @@ __all__ = (
class ConsoleConnectionTable(PathEndpointTable):
device = tables.Column(
verbose_name=_('Device'),
linkify=True
)
name = tables.Column(
linkify=True,
verbose_name='Console Port'
verbose_name=_('Console Port')
)
reachable = columns.BooleanColumn(
accessor=Accessor('_path__is_active'),
verbose_name='Reachable'
verbose_name=_('Reachable')
)
class Meta(BaseTable.Meta):
@ -36,15 +38,16 @@ class ConsoleConnectionTable(PathEndpointTable):
class PowerConnectionTable(PathEndpointTable):
device = tables.Column(
verbose_name=_('Device'),
linkify=True
)
name = tables.Column(
linkify=True,
verbose_name='Power Port'
verbose_name=_('Power Port')
)
reachable = columns.BooleanColumn(
accessor=Accessor('_path__is_active'),
verbose_name='Reachable'
verbose_name=_('Reachable')
)
class Meta(BaseTable.Meta):
@ -54,16 +57,18 @@ class PowerConnectionTable(PathEndpointTable):
class InterfaceConnectionTable(PathEndpointTable):
device = tables.Column(
verbose_name=_('Device'),
accessor=Accessor('device'),
linkify=True
)
interface = tables.Column(
verbose_name=_('Interface'),
accessor=Accessor('name'),
linkify=True
)
reachable = columns.BooleanColumn(
accessor=Accessor('_path__is_active'),
verbose_name='Reachable'
verbose_name=_('Reachable')
)
class Meta(BaseTable.Meta):

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from dcim import models
from django_tables2.utils import Accessor
@ -76,17 +77,18 @@ def get_interface_state_attribute(record):
class DeviceRoleTable(NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
device_count = columns.LinkedCountColumn(
viewname='dcim:device_list',
url_params={'role_id': 'pk'},
verbose_name='Devices'
verbose_name=_('Devices')
)
vm_count = columns.LinkedCountColumn(
viewname='virtualization:virtualmachine_list',
url_params={'role_id': 'pk'},
verbose_name='VMs'
verbose_name=_('VMs')
)
color = columns.ColorColumn()
vm_role = columns.BooleanColumn()
@ -112,23 +114,26 @@ class DeviceRoleTable(NetBoxTable):
class PlatformTable(NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
manufacturer = tables.Column(
verbose_name=_('Manufacturer'),
linkify=True
)
config_template = tables.Column(
verbose_name=_('Config template'),
linkify=True
)
device_count = columns.LinkedCountColumn(
viewname='dcim:device_list',
url_params={'platform_id': 'pk'},
verbose_name='Devices'
verbose_name=_('Devices')
)
vm_count = columns.LinkedCountColumn(
viewname='virtualization:virtualmachine_list',
url_params={'platform_id': 'pk'},
verbose_name='VMs'
verbose_name=_('VMs')
)
tags = columns.TagColumn(
url_name='dcim:platform_list'
@ -151,78 +156,90 @@ class PlatformTable(NetBoxTable):
class DeviceTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
order_by=('_name',),
template_code=DEVICE_LINK,
linkify=True
)
status = columns.ChoiceFieldColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
region = tables.Column(
verbose_name=_('Region'),
accessor=Accessor('site__region'),
linkify=True
)
site_group = tables.Column(
accessor=Accessor('site__group'),
linkify=True,
verbose_name='Site Group'
verbose_name=_('Site Group')
)
site = tables.Column(
verbose_name=_('Site'),
linkify=True
)
location = tables.Column(
verbose_name=_('Location'),
linkify=True
)
rack = tables.Column(
verbose_name=_('Rack'),
linkify=True
)
position = columns.TemplateColumn(
verbose_name=_('Position'),
template_code='{{ value|floatformat }}'
)
device_role = columns.ColoredLabelColumn(
verbose_name='Role'
verbose_name=_('Role')
)
manufacturer = tables.Column(
verbose_name=_('Manufacturer'),
accessor=Accessor('device_type__manufacturer'),
linkify=True
)
device_type = tables.Column(
linkify=True,
verbose_name='Type'
verbose_name=_('Type')
)
primary_ip = tables.Column(
linkify=True,
order_by=('primary_ip4', 'primary_ip6'),
verbose_name='IP Address'
verbose_name=_('IP Address')
)
primary_ip4 = tables.Column(
linkify=True,
verbose_name='IPv4 Address'
verbose_name=_('IPv4 Address')
)
primary_ip6 = tables.Column(
linkify=True,
verbose_name='IPv6 Address'
verbose_name=_('IPv6 Address')
)
cluster = tables.Column(
verbose_name=_('Cluster'),
linkify=True
)
virtual_chassis = tables.Column(
verbose_name=_('Virtual chassis'),
linkify=True
)
vc_position = tables.Column(
verbose_name='VC Position'
verbose_name=_('VC Position')
)
vc_priority = tables.Column(
verbose_name='VC Priority'
verbose_name=_('VC Priority')
)
config_template = tables.Column(
verbose_name=_('Config template'),
linkify=True
)
parent_device = tables.Column(
verbose_name='Parent Device',
verbose_name=_('Parent Device'),
linkify=True,
accessor='parent_bay__device'
)
device_bay_position = tables.Column(
verbose_name='Position (Device Bay)',
verbose_name=_('Position (Device Bay)'),
accessor='parent_bay',
linkify=True
)
@ -248,21 +265,26 @@ class DeviceTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
class DeviceImportTable(TenancyColumnsMixin, NetBoxTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code=DEVICE_LINK,
linkify=True
)
status = columns.ChoiceFieldColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
site = tables.Column(
verbose_name=_('Site'),
linkify=True
)
rack = tables.Column(
verbose_name=_('Rack'),
linkify=True
)
device_role = tables.Column(
verbose_name='Role'
verbose_name=_('Role')
)
device_type = tables.Column(
verbose_name='Type'
verbose_name=_('Type')
)
class Meta(NetBoxTable.Meta):
@ -277,9 +299,11 @@ class DeviceImportTable(TenancyColumnsMixin, NetBoxTable):
class DeviceComponentTable(NetBoxTable):
device = tables.Column(
verbose_name=_('Device'),
linkify=True
)
name = tables.Column(
verbose_name=_('Name'),
linkify=True,
order_by=('_name',)
)
@ -290,6 +314,7 @@ class DeviceComponentTable(NetBoxTable):
class ModularDeviceComponentTable(DeviceComponentTable):
module_bay = tables.Column(
verbose_name=_('Module bay'),
accessor=Accessor('module__module_bay'),
linkify={
'viewname': 'dcim:device_modulebays',
@ -297,39 +322,44 @@ class ModularDeviceComponentTable(DeviceComponentTable):
}
)
module = tables.Column(
verbose_name=_('Module'),
linkify=True
)
class CableTerminationTable(NetBoxTable):
cable = tables.Column(
verbose_name=_('Cable'),
linkify=True
)
cable_color = columns.ColorColumn(
accessor='cable__color',
orderable=False,
verbose_name='Cable Color'
verbose_name=_('Cable Color')
)
link_peer = columns.TemplateColumn(
accessor='link_peers',
template_code=LINKTERMINATION,
orderable=False,
verbose_name='Link Peers'
verbose_name=_('Link Peers')
)
mark_connected = columns.BooleanColumn(
verbose_name=_('Mark connected'),
)
mark_connected = columns.BooleanColumn()
class PathEndpointTable(CableTerminationTable):
connection = columns.TemplateColumn(
accessor='_path__destinations',
template_code=LINKTERMINATION,
verbose_name='Connection',
verbose_name=_('Connection'),
orderable=False
)
class ConsolePortTable(ModularDeviceComponentTable, PathEndpointTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_consoleports',
'args': [Accessor('device_id')],
@ -350,11 +380,13 @@ class ConsolePortTable(ModularDeviceComponentTable, PathEndpointTable):
class DeviceConsolePortTable(ConsolePortTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<i class="mdi mdi-console"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>',
order_by=Accessor('_name'),
attrs={'td': {'class': 'text-nowrap'}}
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=CONSOLEPORT_BUTTONS
)
@ -372,6 +404,7 @@ class DeviceConsolePortTable(ConsolePortTable):
class ConsoleServerPortTable(ModularDeviceComponentTable, PathEndpointTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_consoleserverports',
'args': [Accessor('device_id')],
@ -392,12 +425,14 @@ class ConsoleServerPortTable(ModularDeviceComponentTable, PathEndpointTable):
class DeviceConsoleServerPortTable(ConsoleServerPortTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<i class="mdi mdi-console-network-outline"></i> '
'<a href="{{ record.get_absolute_url }}">{{ value }}</a>',
order_by=Accessor('_name'),
attrs={'td': {'class': 'text-nowrap'}}
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=CONSOLESERVERPORT_BUTTONS
)
@ -415,6 +450,7 @@ class DeviceConsoleServerPortTable(ConsoleServerPortTable):
class PowerPortTable(ModularDeviceComponentTable, PathEndpointTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_powerports',
'args': [Accessor('device_id')],
@ -436,12 +472,14 @@ class PowerPortTable(ModularDeviceComponentTable, PathEndpointTable):
class DevicePowerPortTable(PowerPortTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<i class="mdi mdi-power-plug-outline"></i> <a href="{{ record.get_absolute_url }}">'
'{{ value }}</a>',
order_by=Accessor('_name'),
attrs={'td': {'class': 'text-nowrap'}}
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=POWERPORT_BUTTONS
)
@ -461,12 +499,14 @@ class DevicePowerPortTable(PowerPortTable):
class PowerOutletTable(ModularDeviceComponentTable, PathEndpointTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_poweroutlets',
'args': [Accessor('device_id')],
}
)
power_port = tables.Column(
verbose_name=_('Power port'),
linkify=True
)
tags = columns.TagColumn(
@ -485,11 +525,13 @@ class PowerOutletTable(ModularDeviceComponentTable, PathEndpointTable):
class DevicePowerOutletTable(PowerOutletTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<i class="mdi mdi-power-socket"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>',
order_by=Accessor('_name'),
attrs={'td': {'class': 'text-nowrap'}}
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=POWEROUTLET_BUTTONS
)
@ -508,29 +550,34 @@ class DevicePowerOutletTable(PowerOutletTable):
class BaseInterfaceTable(NetBoxTable):
enabled = columns.BooleanColumn()
enabled = columns.BooleanColumn(
verbose_name=_('Enabled'),
)
ip_addresses = tables.TemplateColumn(
template_code=INTERFACE_IPADDRESSES,
orderable=False,
verbose_name='IP Addresses'
verbose_name=_('IP Addresses')
)
fhrp_groups = tables.TemplateColumn(
accessor=Accessor('fhrp_group_assignments'),
template_code=INTERFACE_FHRPGROUPS,
orderable=False,
verbose_name='FHRP Groups'
verbose_name=_('FHRP Groups')
)
l2vpn = tables.Column(
accessor=tables.A('l2vpn_termination__l2vpn'),
linkify=True,
orderable=False,
verbose_name='L2VPN'
verbose_name=_('L2VPN')
)
untagged_vlan = tables.Column(
verbose_name=_('Untagged VLAN'),
linkify=True
)
untagged_vlan = tables.Column(linkify=True)
tagged_vlans = columns.TemplateColumn(
template_code=INTERFACE_TAGGED_VLANS,
orderable=False,
verbose_name='Tagged VLANs'
verbose_name=_('Tagged VLANs')
)
def value_ip_addresses(self, value):
@ -539,25 +586,30 @@ class BaseInterfaceTable(NetBoxTable):
class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpointTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_interfaces',
'args': [Accessor('device_id')],
}
)
mgmt_only = columns.BooleanColumn()
mgmt_only = columns.BooleanColumn(
verbose_name=_('Mgmt only'),
)
wireless_link = tables.Column(
verbose_name=_('Wireless link'),
linkify=True
)
wireless_lans = columns.TemplateColumn(
template_code=INTERFACE_WIRELESS_LANS,
orderable=False,
verbose_name='Wireless LANs'
verbose_name=_('Wireless LANs')
)
vdcs = columns.ManyToManyColumn(
linkify_item=True,
verbose_name='VDCs'
verbose_name=_('VDCs')
)
vrf = tables.Column(
verbose_name=_('VRF'),
linkify=True
)
tags = columns.TagColumn(
@ -578,6 +630,7 @@ class InterfaceTable(ModularDeviceComponentTable, BaseInterfaceTable, PathEndpoi
class DeviceInterfaceTable(InterfaceTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<i class="mdi mdi-{% if record.mgmt_only %}wrench{% elif record.is_lag %}reorder-horizontal'
'{% elif record.is_virtual %}circle{% elif record.is_wireless %}wifi{% else %}ethernet'
'{% endif %}"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>',
@ -585,16 +638,19 @@ class DeviceInterfaceTable(InterfaceTable):
attrs={'td': {'class': 'text-nowrap'}}
)
parent = tables.Column(
verbose_name=_('Parent'),
linkify=True
)
bridge = tables.Column(
verbose_name=_('Bridge'),
linkify=True
)
lag = tables.Column(
linkify=True,
verbose_name='LAG'
verbose_name=_('LAG')
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=INTERFACE_BUTTONS
)
@ -621,16 +677,20 @@ class DeviceInterfaceTable(InterfaceTable):
class FrontPortTable(ModularDeviceComponentTable, CableTerminationTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_frontports',
'args': [Accessor('device_id')],
}
)
color = columns.ColorColumn()
color = columns.ColorColumn(
verbose_name=_('Color'),
)
rear_port_position = tables.Column(
verbose_name='Position'
verbose_name=_('Position')
)
rear_port = tables.Column(
verbose_name=_('Rear port'),
linkify=True
)
tags = columns.TagColumn(
@ -651,12 +711,14 @@ class FrontPortTable(ModularDeviceComponentTable, CableTerminationTable):
class DeviceFrontPortTable(FrontPortTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<i class="mdi mdi-square-rounded{% if not record.cable %}-outline{% endif %}"></i> '
'<a href="{{ record.get_absolute_url }}">{{ value }}</a>',
order_by=Accessor('_name'),
attrs={'td': {'class': 'text-nowrap'}}
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=FRONTPORT_BUTTONS
)
@ -676,12 +738,15 @@ class DeviceFrontPortTable(FrontPortTable):
class RearPortTable(ModularDeviceComponentTable, CableTerminationTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_rearports',
'args': [Accessor('device_id')],
}
)
color = columns.ColorColumn()
color = columns.ColorColumn(
verbose_name=_('Color'),
)
tags = columns.TagColumn(
url_name='dcim:rearport_list'
)
@ -697,12 +762,14 @@ class RearPortTable(ModularDeviceComponentTable, CableTerminationTable):
class DeviceRearPortTable(RearPortTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<i class="mdi mdi-square-rounded{% if not record.cable %}-outline{% endif %}"></i> '
'<a href="{{ record.get_absolute_url }}">{{ value }}</a>',
order_by=Accessor('_name'),
attrs={'td': {'class': 'text-nowrap'}}
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=REARPORT_BUTTONS
)
@ -722,6 +789,7 @@ class DeviceRearPortTable(RearPortTable):
class DeviceBayTable(DeviceComponentTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_devicebays',
'args': [Accessor('device_id')],
@ -729,18 +797,20 @@ class DeviceBayTable(DeviceComponentTable):
)
device_role = columns.ColoredLabelColumn(
accessor=Accessor('installed_device__device_role'),
verbose_name='Role'
verbose_name=_('Role')
)
device_type = tables.Column(
accessor=Accessor('installed_device__device_type'),
linkify=True,
verbose_name='Type'
verbose_name=_('Type')
)
status = tables.TemplateColumn(
verbose_name=_('Status'),
template_code=DEVICEBAY_STATUS,
order_by=Accessor('installed_device__status')
)
installed_device = tables.Column(
verbose_name=_('Installed device'),
linkify=True
)
tags = columns.TagColumn(
@ -759,12 +829,14 @@ class DeviceBayTable(DeviceComponentTable):
class DeviceDeviceBayTable(DeviceBayTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<i class="mdi mdi-circle{% if record.installed_device %}slice-8{% else %}outline{% endif %}'
'"></i> <a href="{{ record.get_absolute_url }}">{{ value }}</a>',
order_by=Accessor('_name'),
attrs={'td': {'class': 'text-nowrap'}}
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=DEVICEBAY_BUTTONS
)
@ -778,6 +850,7 @@ class DeviceDeviceBayTable(DeviceBayTable):
class ModuleBayTable(DeviceComponentTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_modulebays',
'args': [Accessor('device_id')],
@ -785,18 +858,21 @@ class ModuleBayTable(DeviceComponentTable):
)
installed_module = tables.Column(
linkify=True,
verbose_name='Installed module'
verbose_name=_('Installed module')
)
module_serial = tables.Column(
verbose_name=_('Module serial'),
accessor=tables.A('installed_module__serial')
)
module_asset_tag = tables.Column(
verbose_name=_('Module asset tag'),
accessor=tables.A('installed_module__asset_tag')
)
tags = columns.TagColumn(
url_name='dcim:modulebay_list'
)
module_status = columns.TemplateColumn(
verbose_name=_('Module status'),
template_code=MODULEBAY_STATUS
)
@ -811,6 +887,7 @@ class ModuleBayTable(DeviceComponentTable):
class DeviceModuleBayTable(ModuleBayTable):
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=MODULEBAY_BUTTONS
)
@ -825,20 +902,27 @@ class DeviceModuleBayTable(ModuleBayTable):
class InventoryItemTable(DeviceComponentTable):
device = tables.Column(
verbose_name=_('Device'),
linkify={
'viewname': 'dcim:device_inventory',
'args': [Accessor('device_id')],
}
)
role = columns.ColoredLabelColumn()
role = columns.ColoredLabelColumn(
verbose_name=_('Role'),
)
manufacturer = tables.Column(
verbose_name=_('Manufacturer'),
linkify=True
)
component = tables.Column(
verbose_name=_('Component'),
orderable=False,
linkify=True
)
discovered = columns.BooleanColumn()
discovered = columns.BooleanColumn(
verbose_name=_('Discovered'),
)
tags = columns.TagColumn(
url_name='dcim:inventoryitem_list'
)
@ -857,6 +941,7 @@ class InventoryItemTable(DeviceComponentTable):
class DeviceInventoryItemTable(InventoryItemTable):
name = tables.TemplateColumn(
verbose_name=_('Name'),
template_code='<a href="{{ record.get_absolute_url }}" style="padding-left: {{ record.level }}0px">'
'{{ value }}</a>',
order_by=Accessor('_name'),
@ -876,14 +961,17 @@ class DeviceInventoryItemTable(InventoryItemTable):
class InventoryItemRoleTable(NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
inventoryitem_count = columns.LinkedCountColumn(
viewname='dcim:inventoryitem_list',
url_params={'role_id': 'pk'},
verbose_name='Items'
verbose_name=_('Items')
)
color = columns.ColorColumn(
verbose_name=_('Color'),
)
color = columns.ColorColumn()
tags = columns.TagColumn(
url_name='dcim:inventoryitemrole_list'
)
@ -902,17 +990,21 @@ class InventoryItemRoleTable(NetBoxTable):
class VirtualChassisTable(NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
master = tables.Column(
verbose_name=_('Master'),
linkify=True
)
member_count = columns.LinkedCountColumn(
viewname='dcim:device_list',
url_params={'virtual_chassis_id': 'pk'},
verbose_name='Members'
verbose_name=_('Members')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
comments = columns.MarkdownColumn()
tags = columns.TagColumn(
url_name='dcim:virtualchassis_list'
)
@ -928,31 +1020,35 @@ class VirtualChassisTable(NetBoxTable):
class VirtualDeviceContextTable(TenancyColumnsMixin, NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
device = tables.TemplateColumn(
verbose_name=_('Device'),
order_by=('_name',),
template_code=DEVICE_LINK,
linkify=True
)
status = columns.ChoiceFieldColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
primary_ip = tables.Column(
linkify=True,
order_by=('primary_ip4', 'primary_ip6'),
verbose_name='IP Address'
verbose_name=_('IP Address')
)
primary_ip4 = tables.Column(
linkify=True,
verbose_name='IPv4 Address'
verbose_name=_('IPv4 Address')
)
primary_ip6 = tables.Column(
linkify=True,
verbose_name='IPv6 Address'
verbose_name=_('IPv6 Address')
)
interface_count = columns.LinkedCountColumn(
viewname='dcim:interface_list',
url_params={'vdc_id': 'pk'},
verbose_name='Interfaces'
verbose_name=_('Interfaces')
)
comments = columns.MarkdownColumn()

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from dcim import models
@ -27,27 +28,28 @@ __all__ = (
class ManufacturerTable(ContactsColumnMixin, NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
devicetype_count = columns.LinkedCountColumn(
viewname='dcim:devicetype_list',
url_params={'manufacturer_id': 'pk'},
verbose_name='Device Types'
verbose_name=_('Device Types')
)
moduletype_count = columns.LinkedCountColumn(
viewname='dcim:moduletype_list',
url_params={'manufacturer_id': 'pk'},
verbose_name='Module Types'
verbose_name=_('Module Types')
)
inventoryitem_count = columns.LinkedCountColumn(
viewname='dcim:inventoryitem_list',
url_params={'manufacturer_id': 'pk'},
verbose_name='Inventory Items'
verbose_name=_('Inventory Items')
)
platform_count = columns.LinkedCountColumn(
viewname='dcim:platform_list',
url_params={'manufacturer_id': 'pk'},
verbose_name='Platforms'
verbose_name=_('Platforms')
)
tags = columns.TagColumn(
url_name='dcim:manufacturer_list'
@ -72,30 +74,36 @@ class ManufacturerTable(ContactsColumnMixin, NetBoxTable):
class DeviceTypeTable(NetBoxTable):
model = tables.Column(
linkify=True,
verbose_name='Device Type'
verbose_name=_('Device Type')
)
manufacturer = tables.Column(
verbose_name=_('Manufacturer'),
linkify=True
)
default_platform = tables.Column(
verbose_name=_('Default platform'),
linkify=True
)
is_full_depth = columns.BooleanColumn(
verbose_name='Full Depth'
verbose_name=_('Full Depth')
)
instance_count = columns.LinkedCountColumn(
viewname='dcim:device_list',
url_params={'device_type_id': 'pk'},
verbose_name='Instances'
verbose_name=_('Instances')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
comments = columns.MarkdownColumn()
tags = columns.TagColumn(
url_name='dcim:devicetype_list'
)
u_height = columns.TemplateColumn(
verbose_name=_('U height'),
template_code='{{ value|floatformat }}'
)
weight = columns.TemplateColumn(
verbose_name=_('Weight'),
template_code=WEIGHT,
order_by=('_abs_weight', 'weight_unit')
)
@ -117,7 +125,7 @@ class DeviceTypeTable(NetBoxTable):
class ComponentTemplateTable(NetBoxTable):
id = tables.Column(
verbose_name='ID'
verbose_name=_('ID')
)
name = tables.Column(
order_by=('_name',)
@ -129,6 +137,7 @@ class ComponentTemplateTable(NetBoxTable):
class ConsolePortTemplateTable(ComponentTemplateTable):
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete'),
extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
)
@ -141,6 +150,7 @@ class ConsolePortTemplateTable(ComponentTemplateTable):
class ConsoleServerPortTemplateTable(ComponentTemplateTable):
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete'),
extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
)
@ -153,6 +163,7 @@ class ConsoleServerPortTemplateTable(ComponentTemplateTable):
class PowerPortTemplateTable(ComponentTemplateTable):
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete'),
extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
)
@ -165,6 +176,7 @@ class PowerPortTemplateTable(ComponentTemplateTable):
class PowerOutletTemplateTable(ComponentTemplateTable):
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete'),
extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
)
@ -176,11 +188,14 @@ class PowerOutletTemplateTable(ComponentTemplateTable):
class InterfaceTemplateTable(ComponentTemplateTable):
enabled = columns.BooleanColumn()
enabled = columns.BooleanColumn(
verbose_name=_('Enabled'),
)
mgmt_only = columns.BooleanColumn(
verbose_name='Management Only'
verbose_name=_('Management Only')
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete'),
extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
)
@ -193,10 +208,13 @@ class InterfaceTemplateTable(ComponentTemplateTable):
class FrontPortTemplateTable(ComponentTemplateTable):
rear_port_position = tables.Column(
verbose_name='Position'
verbose_name=_('Position')
)
color = columns.ColorColumn(
verbose_name=_('Color'),
)
color = columns.ColorColumn()
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete'),
extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
)
@ -208,8 +226,11 @@ class FrontPortTemplateTable(ComponentTemplateTable):
class RearPortTemplateTable(ComponentTemplateTable):
color = columns.ColorColumn()
color = columns.ColorColumn(
verbose_name=_('Color'),
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete'),
extra_buttons=MODULAR_COMPONENT_TEMPLATE_BUTTONS
)
@ -222,6 +243,7 @@ class RearPortTemplateTable(ComponentTemplateTable):
class ModuleBayTemplateTable(ComponentTemplateTable):
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete')
)
@ -233,6 +255,7 @@ class ModuleBayTemplateTable(ComponentTemplateTable):
class DeviceBayTemplateTable(ComponentTemplateTable):
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete')
)
@ -244,15 +267,19 @@ class DeviceBayTemplateTable(ComponentTemplateTable):
class InventoryItemTemplateTable(ComponentTemplateTable):
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
actions=('edit', 'delete')
)
role = tables.Column(
verbose_name=_('Role'),
linkify=True
)
manufacturer = tables.Column(
verbose_name=_('Manufacturer'),
linkify=True
)
component = tables.Column(
verbose_name=_('Component'),
orderable=False
)

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from dcim.models import Module, ModuleType
@ -13,21 +14,25 @@ __all__ = (
class ModuleTypeTable(NetBoxTable):
model = tables.Column(
linkify=True,
verbose_name='Module Type'
verbose_name=_('Module Type')
)
manufacturer = tables.Column(
verbose_name=_('Manufacturer'),
linkify=True
)
instance_count = columns.LinkedCountColumn(
viewname='dcim:module_list',
url_params={'module_type_id': 'pk'},
verbose_name='Instances'
verbose_name=_('Instances')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
comments = columns.MarkdownColumn()
tags = columns.TagColumn(
url_name='dcim:moduletype_list'
)
weight = columns.TemplateColumn(
verbose_name=_('Weight'),
template_code=WEIGHT,
order_by=('_abs_weight', 'weight_unit')
)
@ -44,20 +49,28 @@ class ModuleTypeTable(NetBoxTable):
class ModuleTable(NetBoxTable):
device = tables.Column(
verbose_name=_('Device'),
linkify=True
)
module_bay = tables.Column(
verbose_name=_('Module bay'),
linkify=True
)
manufacturer = tables.Column(
verbose_name=_('Manufacturer'),
accessor=tables.A('module_type__manufacturer'),
linkify=True
)
module_type = tables.Column(
verbose_name=_('Module type'),
linkify=True
)
status = columns.ChoiceFieldColumn()
comments = columns.MarkdownColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
tags = columns.TagColumn(
url_name='dcim:module_list'
)

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from dcim.models import PowerFeed, PowerPanel
from tenancy.tables import ContactsColumnMixin
@ -18,20 +19,25 @@ __all__ = (
class PowerPanelTable(ContactsColumnMixin, NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
site = tables.Column(
verbose_name=_('Site'),
linkify=True
)
location = tables.Column(
verbose_name=_('Location'),
linkify=True
)
powerfeed_count = columns.LinkedCountColumn(
viewname='dcim:powerfeed_list',
url_params={'power_panel_id': 'pk'},
verbose_name='Feeds'
verbose_name=_('Feeds')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
comments = columns.MarkdownColumn()
tags = columns.TagColumn(
url_name='dcim:powerpanel_list'
)
@ -53,23 +59,33 @@ class PowerPanelTable(ContactsColumnMixin, NetBoxTable):
# cannot traverse pass-through ports.
class PowerFeedTable(CableTerminationTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
power_panel = tables.Column(
verbose_name=_('Power panel'),
linkify=True
)
rack = tables.Column(
verbose_name=_('Rack'),
linkify=True
)
status = columns.ChoiceFieldColumn()
type = columns.ChoiceFieldColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
type = columns.ChoiceFieldColumn(
verbose_name=_('Type'),
)
max_utilization = tables.TemplateColumn(
verbose_name=_('Max utilization'),
template_code="{{ value }}%"
)
available_power = tables.Column(
verbose_name='Available power (VA)'
verbose_name=_('Available power (VA)')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
comments = columns.MarkdownColumn()
tags = columns.TagColumn(
url_name='dcim:powerfeed_list'
)

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from django_tables2.utils import Accessor
@ -18,13 +19,18 @@ __all__ = (
#
class RackRoleTable(NetBoxTable):
name = tables.Column(linkify=True)
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
rack_count = columns.LinkedCountColumn(
viewname='dcim:rack_list',
url_params={'role_id': 'pk'},
verbose_name='Racks'
verbose_name=_('Racks')
)
color = columns.ColorColumn(
verbose_name=_('Color'),
)
color = columns.ColorColumn()
tags = columns.TagColumn(
url_name='dcim:rackrole_list'
)
@ -44,51 +50,62 @@ class RackRoleTable(NetBoxTable):
class RackTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
order_by=('_name',),
linkify=True
)
location = tables.Column(
verbose_name=_('Location'),
linkify=True
)
site = tables.Column(
verbose_name=_('Site'),
linkify=True
)
status = columns.ChoiceFieldColumn()
role = columns.ColoredLabelColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
role = columns.ColoredLabelColumn(
verbose_name=_('Role'),
)
u_height = tables.TemplateColumn(
template_code="{{ value }}U",
verbose_name='Height'
verbose_name=_('Height')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
comments = columns.MarkdownColumn()
device_count = columns.LinkedCountColumn(
viewname='dcim:device_list',
url_params={'rack_id': 'pk'},
verbose_name='Devices'
verbose_name=_('Devices')
)
get_utilization = columns.UtilizationColumn(
orderable=False,
verbose_name='Space'
verbose_name=_('Space')
)
get_power_utilization = columns.UtilizationColumn(
orderable=False,
verbose_name='Power'
verbose_name=_('Power')
)
tags = columns.TagColumn(
url_name='dcim:rack_list'
)
outer_width = tables.TemplateColumn(
template_code="{{ record.outer_width }} {{ record.outer_unit }}",
verbose_name='Outer Width'
verbose_name=_('Outer Width')
)
outer_depth = tables.TemplateColumn(
template_code="{{ record.outer_depth }} {{ record.outer_unit }}",
verbose_name='Outer Depth'
verbose_name=_('Outer Depth')
)
weight = columns.TemplateColumn(
verbose_name=_('Weight'),
template_code=WEIGHT,
order_by=('_abs_weight', 'weight_unit')
)
max_weight = columns.TemplateColumn(
verbose_name=_('Max weight'),
template_code=WEIGHT,
order_by=('_abs_max_weight', 'weight_unit')
)
@ -113,25 +130,31 @@ class RackTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
class RackReservationTable(TenancyColumnsMixin, NetBoxTable):
reservation = tables.Column(
verbose_name=_('Reservation'),
accessor='pk',
linkify=True
)
site = tables.Column(
verbose_name=_('Site'),
accessor=Accessor('rack__site'),
linkify=True
)
location = tables.Column(
verbose_name=_('Location'),
accessor=Accessor('rack__location'),
linkify=True
)
rack = tables.Column(
verbose_name=_('Rack'),
linkify=True
)
unit_list = tables.Column(
orderable=False,
verbose_name='Units'
verbose_name=_('Units')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
comments = columns.MarkdownColumn()
tags = columns.TagColumn(
url_name='dcim:rackreservation_list'
)

View File

@ -1,3 +1,4 @@
from django.utils.translation import gettext_lazy as _
import django_tables2 as tables
from dcim.models import Location, Region, Site, SiteGroup
from tenancy.tables import ContactsColumnMixin, TenancyColumnsMixin
@ -20,12 +21,13 @@ __all__ = (
class RegionTable(ContactsColumnMixin, NetBoxTable):
name = columns.MPTTColumn(
verbose_name=_('Name'),
linkify=True
)
site_count = columns.LinkedCountColumn(
viewname='dcim:site_list',
url_params={'region_id': 'pk'},
verbose_name='Sites'
verbose_name=_('Sites')
)
tags = columns.TagColumn(
url_name='dcim:region_list'
@ -46,12 +48,13 @@ class RegionTable(ContactsColumnMixin, NetBoxTable):
class SiteGroupTable(ContactsColumnMixin, NetBoxTable):
name = columns.MPTTColumn(
verbose_name=_('Name'),
linkify=True
)
site_count = columns.LinkedCountColumn(
viewname='dcim:site_list',
url_params={'group_id': 'pk'},
verbose_name='Sites'
verbose_name=_('Sites')
)
tags = columns.TagColumn(
url_name='dcim:sitegroup_list'
@ -72,26 +75,33 @@ class SiteGroupTable(ContactsColumnMixin, NetBoxTable):
class SiteTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
name = tables.Column(
verbose_name=_('Name'),
linkify=True
)
status = columns.ChoiceFieldColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
region = tables.Column(
verbose_name=_('Region'),
linkify=True
)
group = tables.Column(
verbose_name=_('Group'),
linkify=True
)
asns = columns.ManyToManyColumn(
linkify_item=True,
verbose_name='ASNs'
verbose_name=_('ASNs')
)
asn_count = columns.LinkedCountColumn(
accessor=tables.A('asns__count'),
viewname='ipam:asn_list',
url_params={'site_id': 'pk'},
verbose_name='ASN Count'
verbose_name=_('ASN Count')
)
comments = columns.MarkdownColumn(
verbose_name=_('Comments'),
)
comments = columns.MarkdownColumn()
tags = columns.TagColumn(
url_name='dcim:site_list'
)
@ -112,26 +122,31 @@ class SiteTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
class LocationTable(TenancyColumnsMixin, ContactsColumnMixin, NetBoxTable):
name = columns.MPTTColumn(
verbose_name=_('Name'),
linkify=True
)
site = tables.Column(
verbose_name=_('Site'),
linkify=True
)
status = columns.ChoiceFieldColumn()
status = columns.ChoiceFieldColumn(
verbose_name=_('Status'),
)
rack_count = columns.LinkedCountColumn(
viewname='dcim:rack_list',
url_params={'location_id': 'pk'},
verbose_name='Racks'
verbose_name=_('Racks')
)
device_count = columns.LinkedCountColumn(
viewname='dcim:device_list',
url_params={'location_id': 'pk'},
verbose_name='Devices'
verbose_name=_('Devices')
)
tags = columns.TagColumn(
url_name='dcim:location_list'
)
actions = columns.ActionsColumn(
verbose_name=_('Actions'),
extra_buttons=LOCATION_BUTTONS
)

View File

@ -1,3 +1,5 @@
from django.utils.translation import gettext_lazy as _
LINKTERMINATION = """
{% for termination in value %}
{% if termination.parent_object %}
@ -20,11 +22,11 @@ WEIGHT = """
{% if value %}{{ value|floatformat:"-2" }} {{ record.weight_unit }}{% endif %}
"""
DEVICE_LINK = """
DEVICE_LINK = _("""
{{ value|default:'<span class="badge bg-info">Unnamed device</span>' }}
"""
""")
DEVICEBAY_STATUS = """
DEVICEBAY_STATUS = _("""
{% if record.installed_device_id %}
<span class="badge bg-{{ record.installed_device.get_status_color }}">
{{ record.installed_device.get_status_display }}
@ -32,7 +34,7 @@ DEVICEBAY_STATUS = """
{% else %}
<span class="badge bg-secondary">Vacant</span>
{% endif %}
"""
""")
INTERFACE_IPADDRESSES = """
<div class="table-badge-group">
@ -54,7 +56,7 @@ INTERFACE_FHRPGROUPS = """
</div>
"""
INTERFACE_TAGGED_VLANS = """
INTERFACE_TAGGED_VLANS = _("""
{% if record.mode == 'tagged' %}
{% for vlan in value.all %}
<a href="{{ vlan.get_absolute_url }}">{{ vlan }}</a><br />
@ -62,7 +64,7 @@ INTERFACE_TAGGED_VLANS = """
{% elif record.mode == 'tagged-all' %}
All
{% endif %}
"""
""")
INTERFACE_WIRELESS_LANS = """
{% for wlan in value.all %}
@ -106,7 +108,7 @@ MODULAR_COMPONENT_TEMPLATE_BUTTONS = """
# Device component buttons
#
CONSOLEPORT_BUTTONS = """
CONSOLEPORT_BUTTONS = _("""
{% if perms.dcim.add_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_consoleports' pk=object.pk %}" class="btn btn-sm btn-success" title="Add inventory item">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
@ -154,9 +156,9 @@ CONSOLEPORT_BUTTONS = """
{% else %}
<a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
{% endif %}
"""
""")
CONSOLESERVERPORT_BUTTONS = """
CONSOLESERVERPORT_BUTTONS = _("""
{% if perms.dcim.add_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_consoleserverports' pk=object.pk %}" class="btn btn-sm btn-success" title="Add inventory item">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
@ -204,9 +206,9 @@ CONSOLESERVERPORT_BUTTONS = """
{% else %}
<a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
{% endif %}
"""
""")
POWERPORT_BUTTONS = """
POWERPORT_BUTTONS = _("""
{% if perms.dcim.add_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_powerports' pk=object.pk %}" class="btn btn-sm btn-primary" title="Add inventory item">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
@ -253,9 +255,9 @@ POWERPORT_BUTTONS = """
{% else %}
<a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
{% endif %}
"""
""")
POWEROUTLET_BUTTONS = """
POWEROUTLET_BUTTONS = _("""
{% if perms.dcim.add_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_poweroutlets' pk=object.pk %}" class="btn btn-sm btn-primary" title="Add inventory item">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
@ -298,9 +300,9 @@ POWEROUTLET_BUTTONS = """
<a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
{% endif %}
{% endif %}
"""
""")
INTERFACE_BUTTONS = """
INTERFACE_BUTTONS = _("""
{% if perms.dcim.change_interface %}
<span class="dropdown">
<button type="button" class="btn btn-primary btn-sm dropdown-toggle" data-bs-toggle="dropdown" aria-haspopup="true" aria-expanded="false" title="Add">
@ -382,9 +384,9 @@ INTERFACE_BUTTONS = """
<span class="mdi mdi-wifi-plus" aria-hidden="true"></span>
</a>
{% endif %}
"""
""")
FRONTPORT_BUTTONS = """
FRONTPORT_BUTTONS = _("""
{% if perms.dcim.add_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_frontports' pk=object.pk %}" class="btn btn-sm btn-primary" title="Add inventory item">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
@ -437,9 +439,9 @@ FRONTPORT_BUTTONS = """
<a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
{% endif %}
{% endif %}
"""
""")
REARPORT_BUTTONS = """
REARPORT_BUTTONS = _("""
{% if perms.dcim.add_inventoryitem %}
<a href="{% url 'dcim:inventoryitem_add' %}?device={{ record.device_id }}&component_type={{ record|content_type_id }}&component_id={{ record.pk }}&return_url={% url 'dcim:device_rearports' pk=object.pk %}" class="btn btn-sm btn-primary" title="Add inventory item">
<i class="mdi mdi-plus-thick" aria-hidden="true"></i>
@ -492,7 +494,7 @@ REARPORT_BUTTONS = """
<a href="#" class="btn btn-outline-dark btn-sm disabled"><i class="mdi mdi-ethernet-cable" aria-hidden="true"></i></a>
{% endif %}
{% endif %}
"""
""")
DEVICEBAY_BUTTONS = """
{% if perms.dcim.change_devicebay %}