import django_tables2 as tables from django_tables2.utils import Accessor from tenancy.tables import COL_TENANT from utilities.tables import BaseTable, BooleanColumn, ToggleColumn from .models import ( Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate, InventoryItem, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, RackReservation, RearPort, RearPortTemplate, Region, Site, VirtualChassis, ) REGION_LINK = """ {% if record.get_children %} {% else %} {% endif %} {{ record.name }} """ SITE_REGION_LINK = """ {% if record.region %} {{ record.region }} {% else %} — {% endif %} """ COLOR_LABEL = """ """ DEVICE_LINK = """ {{ record.name|default:'Unnamed device' }} """ REGION_ACTIONS = """ {% if perms.dcim.change_region %} {% endif %} """ RACKGROUP_ACTIONS = """ {% if perms.dcim.change_rackgroup %} {% endif %} """ RACKROLE_ACTIONS = """ {% if perms.dcim.change_rackrole %} {% endif %} """ RACK_ROLE = """ {% if record.role %} {% else %} — {% endif %} """ RACK_DEVICE_COUNT = """ {{ value }} """ RACKRESERVATION_ACTIONS = """ {% if perms.dcim.change_rackreservation %} {% endif %} """ MANUFACTURER_ACTIONS = """ {% if perms.dcim.change_manufacturer %} {% endif %} """ DEVICEROLE_ACTIONS = """ {% if perms.dcim.change_devicerole %} {% endif %} """ DEVICEROLE_DEVICE_COUNT = """ {{ value }} """ DEVICEROLE_VM_COUNT = """ {{ value }} """ PLATFORM_DEVICE_COUNT = """ {{ value }} """ PLATFORM_VM_COUNT = """ {{ value }} """ PLATFORM_ACTIONS = """ {% if perms.dcim.change_platform %} {% endif %} """ DEVICE_ROLE = """ """ STATUS_LABEL = """ {{ record.get_status_display }} """ DEVICE_PRIMARY_IP = """ {{ record.primary_ip6.address.ip|default:"" }} {% if record.primary_ip6 and record.primary_ip4 %}
{% endif %} {{ record.primary_ip4.address.ip|default:"" }} """ SUBDEVICE_ROLE_TEMPLATE = """ {% if record.subdevice_role == True %}Parent{% elif record.subdevice_role == False %}Child{% else %}—{% endif %} """ DEVICETYPE_INSTANCES_TEMPLATE = """ {{ record.instance_count }} """ UTILIZATION_GRAPH = """ {% load helpers %} {% utilization_graph value %} """ VIRTUALCHASSIS_ACTIONS = """ {% if perms.dcim.change_virtualchassis %} {% endif %} """ # # Regions # class RegionTable(BaseTable): pk = ToggleColumn() name = tables.TemplateColumn(template_code=REGION_LINK, orderable=False) site_count = tables.Column(verbose_name='Sites') slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn( template_code=REGION_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' ) class Meta(BaseTable.Meta): model = Region fields = ('pk', 'name', 'site_count', 'slug', 'actions') # # Sites # class SiteTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(order_by=('_nat1', '_nat2', '_nat3')) status = tables.TemplateColumn(template_code=STATUS_LABEL, verbose_name='Status') region = tables.TemplateColumn(template_code=SITE_REGION_LINK) tenant = tables.TemplateColumn(template_code=COL_TENANT) class Meta(BaseTable.Meta): model = Site fields = ('pk', 'name', 'status', 'facility', 'region', 'tenant', 'asn', 'description') # # Rack groups # class RackGroupTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn() site = tables.LinkColumn( viewname='dcim:site', args=[Accessor('site.slug')], verbose_name='Site' ) rack_count = tables.Column( verbose_name='Racks' ) slug = tables.Column() actions = tables.TemplateColumn( template_code=RACKGROUP_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' ) class Meta(BaseTable.Meta): model = RackGroup fields = ('pk', 'name', 'site', 'rack_count', 'slug', 'actions') # # Rack roles # class RackRoleTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') rack_count = tables.Column(verbose_name='Racks') color = tables.TemplateColumn(COLOR_LABEL, verbose_name='Color') slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn(template_code=RACKROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='') class Meta(BaseTable.Meta): model = RackGroup fields = ('pk', 'name', 'rack_count', 'color', 'slug', 'actions') # # Racks # class RackTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(order_by=('_nat1', '_nat2', '_nat3')) site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')]) group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group') tenant = tables.TemplateColumn(template_code=COL_TENANT) role = tables.TemplateColumn(RACK_ROLE) u_height = tables.TemplateColumn("{{ record.u_height }}U", verbose_name='Height') class Meta(BaseTable.Meta): model = Rack fields = ('pk', 'name', 'site', 'group', 'facility_id', 'tenant', 'role', 'u_height') class RackDetailTable(RackTable): device_count = tables.TemplateColumn( template_code=RACK_DEVICE_COUNT, verbose_name='Devices' ) get_utilization = tables.TemplateColumn(UTILIZATION_GRAPH, orderable=False, verbose_name='Utilization') class Meta(RackTable.Meta): fields = ( 'pk', 'name', 'site', 'group', 'facility_id', 'tenant', 'role', 'u_height', 'device_count', 'get_utilization', ) class RackImportTable(BaseTable): name = tables.LinkColumn('dcim:rack', args=[Accessor('pk')], verbose_name='Name') site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') group = tables.Column(accessor=Accessor('group.name'), verbose_name='Group') facility_id = tables.Column(verbose_name='Facility ID') tenant = tables.TemplateColumn(template_code=COL_TENANT) u_height = tables.Column(verbose_name='Height (U)') class Meta(BaseTable.Meta): model = Rack fields = ('name', 'site', 'group', 'facility_id', 'tenant', 'u_height') # # Rack reservations # class RackReservationTable(BaseTable): pk = ToggleColumn() tenant = tables.LinkColumn('tenancy:tenant', args=[Accessor('tenant.slug')]) rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')]) unit_list = tables.Column(orderable=False, verbose_name='Units') actions = tables.TemplateColumn( template_code=RACKRESERVATION_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' ) class Meta(BaseTable.Meta): model = RackReservation fields = ('pk', 'rack', 'unit_list', 'user', 'created', 'tenant', 'description', 'actions') # # Manufacturers # class ManufacturerTable(BaseTable): pk = ToggleColumn() name = tables.LinkColumn(verbose_name='Name') devicetype_count = tables.Column(verbose_name='Device Types') platform_count = tables.Column(verbose_name='Platforms') slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn(template_code=MANUFACTURER_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='') class Meta(BaseTable.Meta): model = Manufacturer fields = ('pk', 'name', 'devicetype_count', 'platform_count', 'slug', 'actions') # # Device types # class DeviceTypeTable(BaseTable): pk = ToggleColumn() model = tables.LinkColumn( viewname='dcim:devicetype', args=[Accessor('pk')], verbose_name='Device Type' ) is_full_depth = BooleanColumn(verbose_name='Full Depth') is_console_server = BooleanColumn(verbose_name='CS') is_pdu = BooleanColumn(verbose_name='PDU') is_network_device = BooleanColumn(verbose_name='Net') is_patch_panel = BooleanColumn(verbose_name='PP') subdevice_role = tables.TemplateColumn( template_code=SUBDEVICE_ROLE_TEMPLATE, verbose_name='Subdevice Role' ) instance_count = tables.TemplateColumn( template_code=DEVICETYPE_INSTANCES_TEMPLATE, verbose_name='Instances' ) class Meta(BaseTable.Meta): model = DeviceType fields = ( 'pk', 'model', 'manufacturer', 'part_number', 'u_height', 'is_full_depth', 'is_console_server', 'is_pdu', 'is_network_device', 'is_patch_panel', 'subdevice_role', 'instance_count', ) # # Device type components # class ConsolePortTemplateTable(BaseTable): pk = ToggleColumn() class Meta(BaseTable.Meta): model = ConsolePortTemplate fields = ('pk', 'name') empty_text = "None" class ConsoleServerPortTemplateTable(BaseTable): pk = ToggleColumn() class Meta(BaseTable.Meta): model = ConsoleServerPortTemplate fields = ('pk', 'name') empty_text = "None" class PowerPortTemplateTable(BaseTable): pk = ToggleColumn() class Meta(BaseTable.Meta): model = PowerPortTemplate fields = ('pk', 'name') empty_text = "None" class PowerOutletTemplateTable(BaseTable): pk = ToggleColumn() class Meta(BaseTable.Meta): model = PowerOutletTemplate fields = ('pk', 'name') empty_text = "None" class InterfaceTemplateTable(BaseTable): pk = ToggleColumn() mgmt_only = tables.TemplateColumn("{% if value %}OOB Management{% endif %}") class Meta(BaseTable.Meta): model = InterfaceTemplate fields = ('pk', 'name', 'mgmt_only', 'form_factor') empty_text = "None" class FrontPortTemplateTable(BaseTable): pk = ToggleColumn() class Meta(BaseTable.Meta): model = FrontPortTemplate fields = ('pk', 'name', 'type', 'rear_port', 'rear_port_position') empty_text = "None" class RearPortTemplateTable(BaseTable): pk = ToggleColumn() class Meta(BaseTable.Meta): model = RearPortTemplate fields = ('pk', 'name', 'type', 'positions') empty_text = "None" class DeviceBayTemplateTable(BaseTable): pk = ToggleColumn() class Meta(BaseTable.Meta): model = DeviceBayTemplate fields = ('pk', 'name') empty_text = "None" # # Device roles # class DeviceRoleTable(BaseTable): pk = ToggleColumn() device_count = tables.TemplateColumn( template_code=DEVICEROLE_DEVICE_COUNT, accessor=Accessor('devices.count'), orderable=False, verbose_name='Devices' ) vm_count = tables.TemplateColumn( template_code=DEVICEROLE_VM_COUNT, accessor=Accessor('virtual_machines.count'), orderable=False, verbose_name='VMs' ) color = tables.TemplateColumn(COLOR_LABEL, verbose_name='Label') slug = tables.Column(verbose_name='Slug') actions = tables.TemplateColumn( template_code=DEVICEROLE_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' ) class Meta(BaseTable.Meta): model = DeviceRole fields = ('pk', 'name', 'device_count', 'vm_count', 'color', 'vm_role', 'slug', 'actions') # # Platforms # class PlatformTable(BaseTable): pk = ToggleColumn() device_count = tables.TemplateColumn( template_code=PLATFORM_DEVICE_COUNT, accessor=Accessor('devices.count'), orderable=False, verbose_name='Devices' ) vm_count = tables.TemplateColumn( template_code=PLATFORM_VM_COUNT, accessor=Accessor('virtual_machines.count'), orderable=False, verbose_name='VMs' ) actions = tables.TemplateColumn( template_code=PLATFORM_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' ) class Meta(BaseTable.Meta): model = Platform fields = ('pk', 'name', 'manufacturer', 'device_count', 'vm_count', 'slug', 'napalm_driver', 'actions') # # Devices # class DeviceTable(BaseTable): pk = ToggleColumn() name = tables.TemplateColumn( order_by=('_nat1', '_nat2', '_nat3'), template_code=DEVICE_LINK ) status = tables.TemplateColumn(template_code=STATUS_LABEL, verbose_name='Status') tenant = tables.TemplateColumn(template_code=COL_TENANT) site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')]) rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')]) device_role = tables.TemplateColumn(DEVICE_ROLE, verbose_name='Role') device_type = tables.LinkColumn( 'dcim:devicetype', args=[Accessor('device_type.pk')], verbose_name='Type', text=lambda record: record.device_type.full_name ) class Meta(BaseTable.Meta): model = Device fields = ('pk', 'name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type') class DeviceDetailTable(DeviceTable): primary_ip = tables.TemplateColumn( orderable=False, verbose_name='IP Address', template_code=DEVICE_PRIMARY_IP ) class Meta(DeviceTable.Meta): model = Device fields = ('pk', 'name', 'status', 'tenant', 'site', 'rack', 'device_role', 'device_type', 'primary_ip') class DeviceImportTable(BaseTable): name = tables.TemplateColumn(template_code=DEVICE_LINK, verbose_name='Name') status = tables.TemplateColumn(template_code=STATUS_LABEL, verbose_name='Status') tenant = tables.TemplateColumn(template_code=COL_TENANT) site = tables.LinkColumn('dcim:site', args=[Accessor('site.slug')], verbose_name='Site') rack = tables.LinkColumn('dcim:rack', args=[Accessor('rack.pk')], verbose_name='Rack') position = tables.Column(verbose_name='Position') device_role = tables.Column(verbose_name='Role') device_type = tables.Column(verbose_name='Type') class Meta(BaseTable.Meta): model = Device fields = ('name', 'status', 'tenant', 'site', 'rack', 'position', 'device_role', 'device_type') empty_text = False # # Device components # class ConsolePortTable(BaseTable): class Meta(BaseTable.Meta): model = ConsolePort fields = ('name',) class ConsoleServerPortTable(BaseTable): class Meta(BaseTable.Meta): model = ConsoleServerPort fields = ('name',) class PowerPortTable(BaseTable): class Meta(BaseTable.Meta): model = PowerPort fields = ('name',) class PowerOutletTable(BaseTable): class Meta(BaseTable.Meta): model = PowerOutlet fields = ('name',) class InterfaceTable(BaseTable): class Meta(BaseTable.Meta): model = Interface fields = ('name', 'form_factor', 'lag', 'enabled', 'mgmt_only', 'description') class FrontPortTable(BaseTable): class Meta(BaseTable.Meta): model = FrontPort fields = ('name', 'type', 'rear_port', 'rear_port_position') empty_text = "None" class RearPortTable(BaseTable): class Meta(BaseTable.Meta): model = RearPort fields = ('name', 'type', 'positions') empty_text = "None" class DeviceBayTable(BaseTable): class Meta(BaseTable.Meta): model = DeviceBay fields = ('name',) # # Cables # class CableTable(BaseTable): # django-tables2 adds CSS `class="label"` which causes rendering issues _label = tables.Column( accessor=Accessor('label'), verbose_name='Label' ) device_a = tables.LinkColumn( viewname='dcim:device', accessor=Accessor('termination_a.device'), args=[Accessor('termination_a.device.pk')], orderable=False, verbose_name='Device A' ) termination_a = tables.Column( accessor=Accessor('termination_a.name'), orderable=False, verbose_name='Component' ) device_b = tables.LinkColumn( viewname='dcim:device', accessor=Accessor('termination_b.device'), args=[Accessor('termination_b.device.pk')], orderable=False, verbose_name='Device B' ) termination_b = tables.Column( accessor=Accessor('termination_b.name'), orderable=False, verbose_name='Component' ) class Meta(BaseTable.Meta): model = Cable fields = ('_label', 'device_a', 'termination_a', 'device_b', 'termination_b', 'status', 'type', 'color') # # Device connections # class ConsoleConnectionTable(BaseTable): console_server = tables.LinkColumn( 'dcim:device', accessor=Accessor('connected_endpoint.device'), args=[Accessor('connected_endpoint.device.pk')], verbose_name='Console server' ) connected_endpoint = tables.Column(verbose_name='Port') device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device') name = tables.Column(verbose_name='Console port') class Meta(BaseTable.Meta): model = ConsolePort fields = ('console_server', 'connected_endpoint', 'device', 'name') class PowerConnectionTable(BaseTable): pdu = tables.LinkColumn( 'dcim:device', accessor=Accessor('connected_endpoint.device'), args=[Accessor('connected_endpoint.device.pk')], verbose_name='PDU' ) connected_endpoint = tables.Column(verbose_name='Outlet') device = tables.LinkColumn('dcim:device', args=[Accessor('device.pk')], verbose_name='Device') name = tables.Column(verbose_name='Power Port') class Meta(BaseTable.Meta): model = PowerPort fields = ('pdu', 'connected_endpoint', 'device', 'name') class InterfaceConnectionTable(BaseTable): device_a = tables.LinkColumn( viewname='dcim:device', accessor=Accessor('device'), args=[Accessor('device.pk')], verbose_name='Device A' ) interface_a = tables.LinkColumn( viewname='dcim:interface', accessor=Accessor('name'), args=[Accessor('pk')], verbose_name='Interface A' ) device_b = tables.LinkColumn( viewname='dcim:device', accessor=Accessor('connected_endpoint.device'), args=[Accessor('connected_endpoint.device.pk')], verbose_name='Device B' ) interface_b = tables.LinkColumn( viewname='dcim:interface', accessor=Accessor('connected_endpoint.name'), args=[Accessor('connected_endpoint.pk')], verbose_name='Interface B' ) class Meta(BaseTable.Meta): model = Interface fields = ('device_a', 'interface_a', 'device_b', 'interface_b') # # InventoryItems # class InventoryItemTable(BaseTable): pk = ToggleColumn() device = tables.LinkColumn('dcim:device_inventory', args=[Accessor('device.pk')]) manufacturer = tables.Column(accessor=Accessor('manufacturer.name'), verbose_name='Manufacturer') class Meta(BaseTable.Meta): model = InventoryItem fields = ('pk', 'device', 'name', 'manufacturer', 'part_id', 'serial', 'asset_tag', 'description') # # Virtual chassis # class VirtualChassisTable(BaseTable): pk = ToggleColumn() master = tables.LinkColumn() member_count = tables.Column(verbose_name='Members') actions = tables.TemplateColumn( template_code=VIRTUALCHASSIS_ACTIONS, attrs={'td': {'class': 'text-right'}}, verbose_name='' ) class Meta(BaseTable.Meta): model = VirtualChassis fields = ('pk', 'master', 'domain', 'member_count', 'actions')