|
@@ -17,10 +17,12 @@ from extras.ui.panels import CustomFieldsPanel, ImageAttachmentsPanel, TagsPanel
|
|
|
from extras.views import ObjectConfigContextView, ObjectRenderConfigView
|
|
from extras.views import ObjectConfigContextView, ObjectRenderConfigView
|
|
|
from ipam.models import ASN, VLAN, IPAddress, Prefix, VLANGroup
|
|
from ipam.models import ASN, VLAN, IPAddress, Prefix, VLANGroup
|
|
|
from ipam.tables import VLANTranslationRuleTable
|
|
from ipam.tables import VLANTranslationRuleTable
|
|
|
|
|
+from ipam.ui.panels import FHRPGroupAssignmentsPanel
|
|
|
from netbox.object_actions import *
|
|
from netbox.object_actions import *
|
|
|
from netbox.ui import actions, layout
|
|
from netbox.ui import actions, layout
|
|
|
from netbox.ui.panels import (
|
|
from netbox.ui.panels import (
|
|
|
CommentsPanel,
|
|
CommentsPanel,
|
|
|
|
|
+ ContextTablePanel,
|
|
|
JSONPanel,
|
|
JSONPanel,
|
|
|
NestedGroupObjectPanel,
|
|
NestedGroupObjectPanel,
|
|
|
ObjectsTablePanel,
|
|
ObjectsTablePanel,
|
|
@@ -1577,7 +1579,7 @@ class ModuleTypeProfileListView(generic.ObjectListView):
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(ModuleTypeProfile)
|
|
@register_model_view(ModuleTypeProfile)
|
|
|
-class ModuleTypeProfileView(GetRelatedModelsMixin, generic.ObjectView):
|
|
|
|
|
|
|
+class ModuleTypeProfileView(generic.ObjectView):
|
|
|
template_name = 'generic/object.html'
|
|
template_name = 'generic/object.html'
|
|
|
queryset = ModuleTypeProfile.objects.all()
|
|
queryset = ModuleTypeProfile.objects.all()
|
|
|
layout = layout.SimpleLayout(
|
|
layout = layout.SimpleLayout(
|
|
@@ -2555,6 +2557,7 @@ class DeviceView(generic.ObjectView):
|
|
|
vc_members = []
|
|
vc_members = []
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
|
|
+ 'virtual_chassis': instance.virtual_chassis,
|
|
|
'vc_members': vc_members,
|
|
'vc_members': vc_members,
|
|
|
'svg_extra': f'highlight=id:{instance.pk}',
|
|
'svg_extra': f'highlight=id:{instance.pk}',
|
|
|
}
|
|
}
|
|
@@ -2907,6 +2910,28 @@ class ConsolePortListView(generic.ObjectListView):
|
|
|
@register_model_view(ConsolePort)
|
|
@register_model_view(ConsolePort)
|
|
|
class ConsolePortView(generic.ObjectView):
|
|
class ConsolePortView(generic.ObjectView):
|
|
|
queryset = ConsolePort.objects.all()
|
|
queryset = ConsolePort.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.ConsolePortPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ panels.ConnectionPanel(
|
|
|
|
|
+ trace_url_name='dcim:consoleport_trace',
|
|
|
|
|
+ connect_options=[
|
|
|
|
|
+ {
|
|
|
|
|
+ 'a_type': 'dcim.consoleport',
|
|
|
|
|
+ 'b_type': 'dcim.consoleserverport',
|
|
|
|
|
+ 'label': _('Console Server Port'),
|
|
|
|
|
+ },
|
|
|
|
|
+ {'a_type': 'dcim.consoleport', 'b_type': 'dcim.frontport', 'label': _('Front Port')},
|
|
|
|
|
+ {'a_type': 'dcim.consoleport', 'b_type': 'dcim.rearport', 'label': _('Rear Port')},
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ panels.InventoryItemsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(ConsolePort, 'add', detail=False)
|
|
@register_model_view(ConsolePort, 'add', detail=False)
|
|
@@ -2978,6 +3003,24 @@ class ConsoleServerPortListView(generic.ObjectListView):
|
|
|
@register_model_view(ConsoleServerPort)
|
|
@register_model_view(ConsoleServerPort)
|
|
|
class ConsoleServerPortView(generic.ObjectView):
|
|
class ConsoleServerPortView(generic.ObjectView):
|
|
|
queryset = ConsoleServerPort.objects.all()
|
|
queryset = ConsoleServerPort.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.ConsoleServerPortPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ panels.ConnectionPanel(
|
|
|
|
|
+ trace_url_name='dcim:consoleserverport_trace',
|
|
|
|
|
+ connect_options=[
|
|
|
|
|
+ {'a_type': 'dcim.consoleserverport', 'b_type': 'dcim.consoleport', 'label': _('Console Port')},
|
|
|
|
|
+ {'a_type': 'dcim.consoleserverport', 'b_type': 'dcim.frontport', 'label': _('Front Port')},
|
|
|
|
|
+ {'a_type': 'dcim.consoleserverport', 'b_type': 'dcim.rearport', 'label': _('Rear Port')},
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ panels.InventoryItemsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(ConsoleServerPort, 'add', detail=False)
|
|
@register_model_view(ConsoleServerPort, 'add', detail=False)
|
|
@@ -3049,6 +3092,23 @@ class PowerPortListView(generic.ObjectListView):
|
|
|
@register_model_view(PowerPort)
|
|
@register_model_view(PowerPort)
|
|
|
class PowerPortView(generic.ObjectView):
|
|
class PowerPortView(generic.ObjectView):
|
|
|
queryset = PowerPort.objects.all()
|
|
queryset = PowerPort.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.PowerPortPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ panels.ConnectionPanel(
|
|
|
|
|
+ trace_url_name='dcim:powerport_trace',
|
|
|
|
|
+ connect_options=[
|
|
|
|
|
+ {'a_type': 'dcim.powerport', 'b_type': 'dcim.poweroutlet', 'label': _('Power Outlet')},
|
|
|
|
|
+ {'a_type': 'dcim.powerport', 'b_type': 'dcim.powerfeed', 'label': _('Power Feed')},
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ panels.InventoryItemsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(PowerPort, 'add', detail=False)
|
|
@register_model_view(PowerPort, 'add', detail=False)
|
|
@@ -3120,6 +3180,22 @@ class PowerOutletListView(generic.ObjectListView):
|
|
|
@register_model_view(PowerOutlet)
|
|
@register_model_view(PowerOutlet)
|
|
|
class PowerOutletView(generic.ObjectView):
|
|
class PowerOutletView(generic.ObjectView):
|
|
|
queryset = PowerOutlet.objects.all()
|
|
queryset = PowerOutlet.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.PowerOutletPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ panels.ConnectionPanel(
|
|
|
|
|
+ trace_url_name='dcim:poweroutlet_trace',
|
|
|
|
|
+ connect_options=[
|
|
|
|
|
+ {'a_type': 'dcim.poweroutlet', 'b_type': 'dcim.powerport', 'label': _('Power Port')},
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ panels.InventoryItemsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(PowerOutlet, 'add', detail=False)
|
|
@register_model_view(PowerOutlet, 'add', detail=False)
|
|
@@ -3191,6 +3267,45 @@ class InterfaceListView(generic.ObjectListView):
|
|
|
@register_model_view(Interface)
|
|
@register_model_view(Interface)
|
|
|
class InterfaceView(generic.ObjectView):
|
|
class InterfaceView(generic.ObjectView):
|
|
|
queryset = Interface.objects.all()
|
|
queryset = Interface.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.InterfacePanel(),
|
|
|
|
|
+ panels.RelatedInterfacesPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ ContextTablePanel('vdc_table', title=_('Virtual Device Contexts')),
|
|
|
|
|
+ panels.InterfaceAddressingPanel(),
|
|
|
|
|
+ panels.VirtualCircuitPanel(),
|
|
|
|
|
+ panels.InterfaceConnectionPanel(),
|
|
|
|
|
+ panels.InterfaceWirelessPanel(),
|
|
|
|
|
+ panels.WirelessLANsPanel(),
|
|
|
|
|
+ FHRPGroupAssignmentsPanel(),
|
|
|
|
|
+ panels.InventoryItemsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ bottom_panels=[
|
|
|
|
|
+ ObjectsTablePanel(
|
|
|
|
|
+ model='ipam.IPAddress',
|
|
|
|
|
+ filters={'interface_id': lambda ctx: ctx['object'].pk},
|
|
|
|
|
+ title=_('IP Addresses'),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ObjectsTablePanel(
|
|
|
|
|
+ model='dcim.MACAddress',
|
|
|
|
|
+ filters={'interface_id': lambda ctx: ctx['object'].pk},
|
|
|
|
|
+ title=_('MAC Addresses'),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ObjectsTablePanel(
|
|
|
|
|
+ model='ipam.VLAN',
|
|
|
|
|
+ filters={'interface_id': lambda ctx: ctx['object'].pk},
|
|
|
|
|
+ title=_('VLANs'),
|
|
|
|
|
+ ),
|
|
|
|
|
+ ContextTablePanel('lag_interfaces_table', title=_('LAG Members')),
|
|
|
|
|
+ ContextTablePanel('vlan_translation_table', title=_('VLAN Translation')),
|
|
|
|
|
+ ContextTablePanel('bridge_interfaces_table', title=_('Bridged Interfaces')),
|
|
|
|
|
+ ContextTablePanel('child_interfaces_table', title=_('Child Interfaces')),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
def get_extra_context(self, request, instance):
|
|
|
# Get assigned VDCs
|
|
# Get assigned VDCs
|
|
@@ -3205,30 +3320,29 @@ class InterfaceView(generic.ObjectView):
|
|
|
vdc_table.configure(request)
|
|
vdc_table.configure(request)
|
|
|
|
|
|
|
|
# Get bridge interfaces
|
|
# Get bridge interfaces
|
|
|
- bridge_interfaces = Interface.objects.restrict(request.user, 'view').filter(bridge=instance)
|
|
|
|
|
bridge_interfaces_table = tables.InterfaceTable(
|
|
bridge_interfaces_table = tables.InterfaceTable(
|
|
|
- bridge_interfaces,
|
|
|
|
|
|
|
+ Interface.objects.restrict(request.user, 'view').filter(bridge=instance),
|
|
|
exclude=('device', 'parent'),
|
|
exclude=('device', 'parent'),
|
|
|
orderable=False
|
|
orderable=False
|
|
|
)
|
|
)
|
|
|
bridge_interfaces_table.configure(request)
|
|
bridge_interfaces_table.configure(request)
|
|
|
|
|
|
|
|
# Get child interfaces
|
|
# Get child interfaces
|
|
|
- child_interfaces = Interface.objects.restrict(request.user, 'view').filter(parent=instance)
|
|
|
|
|
child_interfaces_table = tables.InterfaceTable(
|
|
child_interfaces_table = tables.InterfaceTable(
|
|
|
- child_interfaces,
|
|
|
|
|
|
|
+ Interface.objects.restrict(request.user, 'view').filter(parent=instance),
|
|
|
exclude=('device', 'parent'),
|
|
exclude=('device', 'parent'),
|
|
|
orderable=False
|
|
orderable=False
|
|
|
)
|
|
)
|
|
|
child_interfaces_table.configure(request)
|
|
child_interfaces_table.configure(request)
|
|
|
|
|
|
|
|
- # Get LAG interfaces
|
|
|
|
|
- lag_interfaces = Interface.objects.restrict(request.user, 'view').filter(lag=instance)
|
|
|
|
|
- lag_interfaces_table = tables.InterfaceLAGMemberTable(
|
|
|
|
|
- lag_interfaces,
|
|
|
|
|
- orderable=False
|
|
|
|
|
- )
|
|
|
|
|
- lag_interfaces_table.configure(request)
|
|
|
|
|
|
|
+ # Get LAG members (only for LAG interfaces)
|
|
|
|
|
+ lag_interfaces_table = None
|
|
|
|
|
+ if instance.is_lag:
|
|
|
|
|
+ lag_interfaces_table = tables.InterfaceLAGMemberTable(
|
|
|
|
|
+ Interface.objects.restrict(request.user, 'view').filter(lag=instance),
|
|
|
|
|
+ orderable=False
|
|
|
|
|
+ )
|
|
|
|
|
+ lag_interfaces_table.configure(request)
|
|
|
|
|
|
|
|
# Get VLAN translation rules
|
|
# Get VLAN translation rules
|
|
|
vlan_translation_table = None
|
|
vlan_translation_table = None
|
|
@@ -3241,7 +3355,6 @@ class InterfaceView(generic.ObjectView):
|
|
|
|
|
|
|
|
return {
|
|
return {
|
|
|
'vdc_table': vdc_table,
|
|
'vdc_table': vdc_table,
|
|
|
- 'bridge_interfaces': bridge_interfaces,
|
|
|
|
|
'bridge_interfaces_table': bridge_interfaces_table,
|
|
'bridge_interfaces_table': bridge_interfaces_table,
|
|
|
'child_interfaces_table': child_interfaces_table,
|
|
'child_interfaces_table': child_interfaces_table,
|
|
|
'lag_interfaces_table': lag_interfaces_table,
|
|
'lag_interfaces_table': lag_interfaces_table,
|
|
@@ -3329,6 +3442,33 @@ class FrontPortListView(generic.ObjectListView):
|
|
|
@register_model_view(FrontPort)
|
|
@register_model_view(FrontPort)
|
|
|
class FrontPortView(generic.ObjectView):
|
|
class FrontPortView(generic.ObjectView):
|
|
|
queryset = FrontPort.objects.all()
|
|
queryset = FrontPort.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.FrontPortPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ panels.InventoryItemsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ panels.ConnectionPanel(
|
|
|
|
|
+ trace_url_name='dcim:frontport_trace',
|
|
|
|
|
+ show_endpoints=False,
|
|
|
|
|
+ connect_options=[
|
|
|
|
|
+ {'a_type': 'dcim.frontport', 'b_type': 'dcim.interface', 'label': _('Interface')},
|
|
|
|
|
+ {'a_type': 'dcim.frontport', 'b_type': 'dcim.consoleserverport', 'label': _('Console Server Port')},
|
|
|
|
|
+ {'a_type': 'dcim.frontport', 'b_type': 'dcim.consoleport', 'label': _('Console Port')},
|
|
|
|
|
+ {'a_type': 'dcim.frontport', 'b_type': 'dcim.frontport', 'label': _('Front Port')},
|
|
|
|
|
+ {'a_type': 'dcim.frontport', 'b_type': 'dcim.rearport', 'label': _('Rear Port')},
|
|
|
|
|
+ {
|
|
|
|
|
+ 'a_type': 'dcim.frontport',
|
|
|
|
|
+ 'b_type': 'circuits.circuittermination',
|
|
|
|
|
+ 'label': _('Circuit Termination'),
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ TemplatePanel('dcim/panels/front_port_mappings.html'),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
def get_extra_context(self, request, instance):
|
|
|
return {
|
|
return {
|
|
@@ -3405,6 +3545,31 @@ class RearPortListView(generic.ObjectListView):
|
|
|
@register_model_view(RearPort)
|
|
@register_model_view(RearPort)
|
|
|
class RearPortView(generic.ObjectView):
|
|
class RearPortView(generic.ObjectView):
|
|
|
queryset = RearPort.objects.all()
|
|
queryset = RearPort.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.RearPortPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ panels.InventoryItemsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ panels.ConnectionPanel(
|
|
|
|
|
+ trace_url_name='dcim:rearport_trace',
|
|
|
|
|
+ show_endpoints=False,
|
|
|
|
|
+ connect_options=[
|
|
|
|
|
+ {'a_type': 'dcim.rearport', 'b_type': 'dcim.interface', 'label': _('Interface')},
|
|
|
|
|
+ {'a_type': 'dcim.rearport', 'b_type': 'dcim.frontport', 'label': _('Front Port')},
|
|
|
|
|
+ {'a_type': 'dcim.rearport', 'b_type': 'dcim.rearport', 'label': _('Rear Port')},
|
|
|
|
|
+ {
|
|
|
|
|
+ 'a_type': 'dcim.rearport',
|
|
|
|
|
+ 'b_type': 'circuits.circuittermination',
|
|
|
|
|
+ 'label': _('Circuit Termination'),
|
|
|
|
|
+ },
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ TemplatePanel('dcim/panels/rear_port_mappings.html'),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
def get_extra_context(self, request, instance):
|
|
|
return {
|
|
return {
|
|
@@ -3481,6 +3646,19 @@ class ModuleBayListView(generic.ObjectListView):
|
|
|
@register_model_view(ModuleBay)
|
|
@register_model_view(ModuleBay)
|
|
|
class ModuleBayView(generic.ObjectView):
|
|
class ModuleBayView(generic.ObjectView):
|
|
|
queryset = ModuleBay.objects.all()
|
|
queryset = ModuleBay.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.ModuleBayPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ Panel(
|
|
|
|
|
+ title=_('Installed Module'),
|
|
|
|
|
+ template_name='dcim/panels/installed_module.html',
|
|
|
|
|
+ ),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(ModuleBay, 'add', detail=False)
|
|
@register_model_view(ModuleBay, 'add', detail=False)
|
|
@@ -3543,6 +3721,19 @@ class DeviceBayListView(generic.ObjectListView):
|
|
|
@register_model_view(DeviceBay)
|
|
@register_model_view(DeviceBay)
|
|
|
class DeviceBayView(generic.ObjectView):
|
|
class DeviceBayView(generic.ObjectView):
|
|
|
queryset = DeviceBay.objects.all()
|
|
queryset = DeviceBay.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.DeviceBayPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ Panel(
|
|
|
|
|
+ title=_('Installed Device'),
|
|
|
|
|
+ template_name='dcim/panels/installed_device.html',
|
|
|
|
|
+ ),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(DeviceBay, 'add', detail=False)
|
|
@register_model_view(DeviceBay, 'add', detail=False)
|
|
@@ -3686,6 +3877,13 @@ class InventoryItemListView(generic.ObjectListView):
|
|
|
@register_model_view(InventoryItem)
|
|
@register_model_view(InventoryItem)
|
|
|
class InventoryItemView(generic.ObjectView):
|
|
class InventoryItemView(generic.ObjectView):
|
|
|
queryset = InventoryItem.objects.all()
|
|
queryset = InventoryItem.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.InventoryItemPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(InventoryItem, 'edit')
|
|
@register_model_view(InventoryItem, 'edit')
|
|
@@ -3767,12 +3965,23 @@ class InventoryItemRoleListView(generic.ObjectListView):
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(InventoryItemRole)
|
|
@register_model_view(InventoryItemRole)
|
|
|
-class InventoryItemRoleView(generic.ObjectView):
|
|
|
|
|
|
|
+class InventoryItemRoleView(GetRelatedModelsMixin, generic.ObjectView):
|
|
|
queryset = InventoryItemRole.objects.all()
|
|
queryset = InventoryItemRole.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.InventoryItemRolePanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ RelatedObjectsPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ CommentsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
def get_extra_context(self, request, instance):
|
|
|
return {
|
|
return {
|
|
|
- 'inventoryitem_count': InventoryItem.objects.filter(role=instance).count(),
|
|
|
|
|
|
|
+ 'related_models': self.get_related_models(request, instance),
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -3940,6 +4149,24 @@ class CableListView(generic.ObjectListView):
|
|
|
@register_model_view(Cable)
|
|
@register_model_view(Cable)
|
|
|
class CableView(generic.ObjectView):
|
|
class CableView(generic.ObjectView):
|
|
|
queryset = Cable.objects.all()
|
|
queryset = Cable.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.CablePanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ CommentsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ Panel(
|
|
|
|
|
+ title=_('Termination A'),
|
|
|
|
|
+ template_name='dcim/panels/cable_termination_a.html',
|
|
|
|
|
+ ),
|
|
|
|
|
+ Panel(
|
|
|
|
|
+ title=_('Termination B'),
|
|
|
|
|
+ template_name='dcim/panels/cable_termination_b.html',
|
|
|
|
|
+ ),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(Cable, 'add', detail=False)
|
|
@register_model_view(Cable, 'add', detail=False)
|
|
@@ -4072,12 +4299,23 @@ class VirtualChassisListView(generic.ObjectListView):
|
|
|
@register_model_view(VirtualChassis)
|
|
@register_model_view(VirtualChassis)
|
|
|
class VirtualChassisView(generic.ObjectView):
|
|
class VirtualChassisView(generic.ObjectView):
|
|
|
queryset = VirtualChassis.objects.all()
|
|
queryset = VirtualChassis.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.VirtualChassisPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ panels.VirtualChassisMembersPanel(),
|
|
|
|
|
+ CommentsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
def get_extra_context(self, request, instance):
|
|
|
- members = Device.objects.restrict(request.user).filter(virtual_chassis=instance)
|
|
|
|
|
-
|
|
|
|
|
|
|
+ vc_members = Device.objects.restrict(request.user).filter(virtual_chassis=instance).order_by('vc_position')
|
|
|
return {
|
|
return {
|
|
|
- 'members': members,
|
|
|
|
|
|
|
+ 'virtual_chassis': instance,
|
|
|
|
|
+ 'vc_members': vc_members,
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
@@ -4317,6 +4555,27 @@ class PowerPanelListView(generic.ObjectListView):
|
|
|
@register_model_view(PowerPanel)
|
|
@register_model_view(PowerPanel)
|
|
|
class PowerPanelView(GetRelatedModelsMixin, generic.ObjectView):
|
|
class PowerPanelView(GetRelatedModelsMixin, generic.ObjectView):
|
|
|
queryset = PowerPanel.objects.all()
|
|
queryset = PowerPanel.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.PowerPanelPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ CommentsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ RelatedObjectsPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ ImageAttachmentsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ bottom_panels=[
|
|
|
|
|
+ ObjectsTablePanel(
|
|
|
|
|
+ model='dcim.PowerFeed',
|
|
|
|
|
+ filters={'power_panel_id': lambda ctx: ctx['object'].pk},
|
|
|
|
|
+ actions=[
|
|
|
|
|
+ actions.AddObject('dcim.PowerFeed', url_params={'power_panel': lambda ctx: ctx['object'].pk}),
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
def get_extra_context(self, request, instance):
|
|
|
return {
|
|
return {
|
|
@@ -4380,6 +4639,23 @@ class PowerFeedListView(generic.ObjectListView):
|
|
|
@register_model_view(PowerFeed)
|
|
@register_model_view(PowerFeed)
|
|
|
class PowerFeedView(generic.ObjectView):
|
|
class PowerFeedView(generic.ObjectView):
|
|
|
queryset = PowerFeed.objects.all()
|
|
queryset = PowerFeed.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.PowerFeedPanel(),
|
|
|
|
|
+ panels.PowerFeedElectricalPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ panels.ConnectionPanel(
|
|
|
|
|
+ trace_url_name='dcim:powerfeed_trace',
|
|
|
|
|
+ connect_options=[
|
|
|
|
|
+ {'a_type': 'dcim.powerfeed', 'b_type': 'dcim.powerport', 'label': _('Power Port')},
|
|
|
|
|
+ ],
|
|
|
|
|
+ ),
|
|
|
|
|
+ CommentsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(PowerFeed, 'add', detail=False)
|
|
@register_model_view(PowerFeed, 'add', detail=False)
|
|
@@ -4448,6 +4724,23 @@ class VirtualDeviceContextListView(generic.ObjectListView):
|
|
|
@register_model_view(VirtualDeviceContext)
|
|
@register_model_view(VirtualDeviceContext)
|
|
|
class VirtualDeviceContextView(GetRelatedModelsMixin, generic.ObjectView):
|
|
class VirtualDeviceContextView(GetRelatedModelsMixin, generic.ObjectView):
|
|
|
queryset = VirtualDeviceContext.objects.all()
|
|
queryset = VirtualDeviceContext.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.VirtualDeviceContextPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ RelatedObjectsPanel(),
|
|
|
|
|
+ CommentsPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ bottom_panels=[
|
|
|
|
|
+ ObjectsTablePanel(
|
|
|
|
|
+ model='dcim.Interface',
|
|
|
|
|
+ filters={'vdc_id': lambda ctx: ctx['object'].pk},
|
|
|
|
|
+ ),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
def get_extra_context(self, request, instance):
|
|
def get_extra_context(self, request, instance):
|
|
|
return {
|
|
return {
|
|
@@ -4516,6 +4809,16 @@ class MACAddressListView(generic.ObjectListView):
|
|
|
@register_model_view(MACAddress)
|
|
@register_model_view(MACAddress)
|
|
|
class MACAddressView(generic.ObjectView):
|
|
class MACAddressView(generic.ObjectView):
|
|
|
queryset = MACAddress.objects.all()
|
|
queryset = MACAddress.objects.all()
|
|
|
|
|
+ layout = layout.SimpleLayout(
|
|
|
|
|
+ left_panels=[
|
|
|
|
|
+ panels.MACAddressPanel(),
|
|
|
|
|
+ TagsPanel(),
|
|
|
|
|
+ CustomFieldsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ right_panels=[
|
|
|
|
|
+ CommentsPanel(),
|
|
|
|
|
+ ],
|
|
|
|
|
+ )
|
|
|
|
|
|
|
|
|
|
|
|
|
@register_model_view(MACAddress, 'add', detail=False)
|
|
@register_model_view(MACAddress, 'add', detail=False)
|