Dropped 'Panel' from FrontPanelPort/RearPanelPort names

This commit is contained in:
Jeremy Stretch 2018-10-25 12:08:13 -04:00
parent e79a156e1f
commit b19e2037af
18 changed files with 355 additions and 355 deletions

View File

@ -6,9 +6,9 @@ from circuits.models import Circuit, CircuitTermination
from dcim.constants import * from dcim.constants import *
from dcim.models import ( from dcim.models import (
ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBayTemplate, DeviceType, DeviceRole, FrontPanelPort, FrontPanelPortTemplate, Interface, InterfaceTemplate, DeviceBayTemplate, DeviceType, DeviceRole, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
RackGroup, RackReservation, RackRole, RearPanelPort, RearPanelPortTemplate, Region, Site, VirtualChassis, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
) )
from extras.api.customfields import CustomFieldModelSerializer from extras.api.customfields import CustomFieldModelSerializer
from ipam.models import IPAddress, VLAN from ipam.models import IPAddress, VLAN
@ -302,45 +302,45 @@ class InterfaceTemplateSerializer(ValidatedModelSerializer):
# #
# Rear panel port templates # Rear port templates
# #
class RearPanelPortTemplateSerializer(ValidatedModelSerializer): class RearPortTemplateSerializer(ValidatedModelSerializer):
device_type = NestedDeviceTypeSerializer() device_type = NestedDeviceTypeSerializer()
type = ChoiceField(choices=PANELPORT_TYPE_CHOICES) type = ChoiceField(choices=PORT_TYPE_CHOICES)
class Meta: class Meta:
model = RearPanelPortTemplate model = RearPortTemplate
fields = ['id', 'device_type', 'name', 'type', 'positions'] fields = ['id', 'device_type', 'name', 'type', 'positions']
class NestedRearPanelPortTemplateSerializer(WritableNestedSerializer): class NestedRearPortTemplateSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearpanelporttemplate-detail') url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearporttemplate-detail')
class Meta: class Meta:
model = RearPanelPortTemplate model = RearPortTemplate
fields = ['id', 'url', 'name'] fields = ['id', 'url', 'name']
# #
# Front panel port templates # Front port templates
# #
class FrontPanelPortTemplateSerializer(ValidatedModelSerializer): class FrontPortTemplateSerializer(ValidatedModelSerializer):
device_type = NestedDeviceTypeSerializer() device_type = NestedDeviceTypeSerializer()
type = ChoiceField(choices=PANELPORT_TYPE_CHOICES) type = ChoiceField(choices=PORT_TYPE_CHOICES)
rear_port = NestedRearPanelPortTemplateSerializer() rear_port = NestedRearPortTemplateSerializer()
class Meta: class Meta:
model = FrontPanelPortTemplate model = FrontPortTemplate
fields = ['id', 'device_type', 'name', 'type', 'rear_port', 'rear_port_position'] fields = ['id', 'device_type', 'name', 'type', 'rear_port', 'rear_port_position']
class NestedFrontPanelPortTemplateSerializer(WritableNestedSerializer): class NestedFrontPortTemplateSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontpanelporttemplate-detail') url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontporttemplate-detail')
class Meta: class Meta:
model = FrontPanelPortTemplate model = FrontPortTemplate
fields = ['id', 'url', 'name'] fields = ['id', 'url', 'name']
@ -703,47 +703,47 @@ class InterfaceSerializer(TaggitSerializer, IsConnectedMixin, ValidatedModelSeri
# #
# Rear panel ports # Rear ports
# #
class RearPanelPortSerializer(ValidatedModelSerializer): class RearPortSerializer(ValidatedModelSerializer):
device = NestedDeviceSerializer() device = NestedDeviceSerializer()
type = ChoiceField(choices=PANELPORT_TYPE_CHOICES) type = ChoiceField(choices=PORT_TYPE_CHOICES)
tags = TagListSerializerField(required=False) tags = TagListSerializerField(required=False)
class Meta: class Meta:
model = RearPanelPort model = RearPort
fields = ['id', 'device', 'name', 'type', 'positions', 'tags'] fields = ['id', 'device', 'name', 'type', 'positions', 'tags']
class NestedRearPanelPortSerializer(WritableNestedSerializer): class NestedRearPortSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearpanelport-detail') url = serializers.HyperlinkedIdentityField(view_name='dcim-api:rearport-detail')
class Meta: class Meta:
model = RearPanelPort model = RearPort
fields = ['id', 'url', 'name'] fields = ['id', 'url', 'name']
# #
# Front panel ports # Front ports
# #
class FrontPanelPortSerializer(ValidatedModelSerializer): class FrontPortSerializer(ValidatedModelSerializer):
device = NestedDeviceSerializer() device = NestedDeviceSerializer()
type = ChoiceField(choices=PANELPORT_TYPE_CHOICES) type = ChoiceField(choices=PORT_TYPE_CHOICES)
rear_port = NestedRearPanelPortSerializer() rear_port = NestedRearPortSerializer()
tags = TagListSerializerField(required=False) tags = TagListSerializerField(required=False)
class Meta: class Meta:
model = FrontPanelPort model = FrontPort
fields = ['id', 'device', 'name', 'type', 'rear_port', 'rear_port_position', 'tags'] fields = ['id', 'device', 'name', 'type', 'rear_port', 'rear_port_position', 'tags']
class NestedFrontPanelPortSerializer(WritableNestedSerializer): class NestedFrontPortSerializer(WritableNestedSerializer):
url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontpanelport-detail') url = serializers.HyperlinkedIdentityField(view_name='dcim-api:frontport-detail')
class Meta: class Meta:
model = FrontPanelPort model = FrontPort
fields = ['id', 'url', 'name'] fields = ['id', 'url', 'name']

View File

@ -37,8 +37,8 @@ router.register(r'console-server-port-templates', views.ConsoleServerPortTemplat
router.register(r'power-port-templates', views.PowerPortTemplateViewSet) router.register(r'power-port-templates', views.PowerPortTemplateViewSet)
router.register(r'power-outlet-templates', views.PowerOutletTemplateViewSet) router.register(r'power-outlet-templates', views.PowerOutletTemplateViewSet)
router.register(r'interface-templates', views.InterfaceTemplateViewSet) router.register(r'interface-templates', views.InterfaceTemplateViewSet)
router.register(r'front-panel-port-templates', views.FrontPanelPortTemplateViewSet) router.register(r'front-port-templates', views.FrontPortTemplateViewSet)
router.register(r'rear-panel-port-templates', views.RearPanelPortTemplateViewSet) router.register(r'rear-port-templates', views.RearPortTemplateViewSet)
router.register(r'device-bay-templates', views.DeviceBayTemplateViewSet) router.register(r'device-bay-templates', views.DeviceBayTemplateViewSet)
# Devices # Devices
@ -52,8 +52,8 @@ router.register(r'console-server-ports', views.ConsoleServerPortViewSet)
router.register(r'power-ports', views.PowerPortViewSet) router.register(r'power-ports', views.PowerPortViewSet)
router.register(r'power-outlets', views.PowerOutletViewSet) router.register(r'power-outlets', views.PowerOutletViewSet)
router.register(r'interfaces', views.InterfaceViewSet) router.register(r'interfaces', views.InterfaceViewSet)
router.register(r'front-panel-ports', views.FrontPanelPortViewSet) router.register(r'front-ports', views.FrontPortViewSet)
router.register(r'rear-panel-ports', views.RearPanelPortViewSet) router.register(r'rear-ports', views.RearPortViewSet)
router.register(r'device-bays', views.DeviceBayViewSet) router.register(r'device-bays', views.DeviceBayViewSet)
router.register(r'inventory-items', views.InventoryItemViewSet) router.register(r'inventory-items', views.InventoryItemViewSet)

View File

@ -15,9 +15,9 @@ from rest_framework.viewsets import GenericViewSet, ViewSet
from dcim import filters from dcim import filters
from dcim.models import ( from dcim.models import (
ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBayTemplate, DeviceRole, DeviceType, FrontPanelPort, FrontPanelPortTemplate, Interface, InterfaceTemplate, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
RackGroup, RackReservation, RackRole, RearPanelPort, RearPanelPortTemplate, Region, Site, VirtualChassis, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
) )
from extras.api.serializers import RenderedGraphSerializer from extras.api.serializers import RenderedGraphSerializer
from extras.api.views import CustomFieldModelViewSet from extras.api.views import CustomFieldModelViewSet
@ -191,16 +191,16 @@ class InterfaceTemplateViewSet(ModelViewSet):
filter_class = filters.InterfaceTemplateFilter filter_class = filters.InterfaceTemplateFilter
class FrontPanelPortTemplateViewSet(ModelViewSet): class FrontPortTemplateViewSet(ModelViewSet):
queryset = FrontPanelPortTemplate.objects.select_related('device_type__manufacturer') queryset = FrontPortTemplate.objects.select_related('device_type__manufacturer')
serializer_class = serializers.FrontPanelPortTemplateSerializer serializer_class = serializers.FrontPortTemplateSerializer
filter_class = filters.FrontPanelPortTemplateFilter filter_class = filters.FrontPortTemplateFilter
class RearPanelPortTemplateViewSet(ModelViewSet): class RearPortTemplateViewSet(ModelViewSet):
queryset = RearPanelPortTemplate.objects.select_related('device_type__manufacturer') queryset = RearPortTemplate.objects.select_related('device_type__manufacturer')
serializer_class = serializers.RearPanelPortTemplateSerializer serializer_class = serializers.RearPortTemplateSerializer
filter_class = filters.RearPanelPortTemplateFilter filter_class = filters.RearPortTemplateFilter
class DeviceBayTemplateViewSet(ModelViewSet): class DeviceBayTemplateViewSet(ModelViewSet):
@ -369,16 +369,16 @@ class InterfaceViewSet(ModelViewSet):
return Response(serializer.data) return Response(serializer.data)
class FrontPanelPortViewSet(ModelViewSet): class FrontPortViewSet(ModelViewSet):
queryset = FrontPanelPort.objects.select_related('device__device_type__manufacturer', 'rear_port') queryset = FrontPort.objects.select_related('device__device_type__manufacturer', 'rear_port')
serializer_class = serializers.FrontPanelPortSerializer serializer_class = serializers.FrontPortSerializer
filter_class = filters.FrontPanelPortFilter filter_class = filters.FrontPortFilter
class RearPanelPortViewSet(ModelViewSet): class RearPortViewSet(ModelViewSet):
queryset = RearPanelPort.objects.select_related('device__device_type__manufacturer') queryset = RearPort.objects.select_related('device__device_type__manufacturer')
serializer_class = serializers.RearPanelPortSerializer serializer_class = serializers.RearPortSerializer
filter_class = filters.RearPanelPortFilter filter_class = filters.RearPortFilter
class DeviceBayViewSet(ModelViewSet): class DeviceBayViewSet(ModelViewSet):

View File

@ -209,32 +209,32 @@ IFACE_MODE_CHOICES = [
[IFACE_MODE_TAGGED_ALL, 'Tagged All'], [IFACE_MODE_TAGGED_ALL, 'Tagged All'],
] ]
# Patch panel port types # Pass-through port types
PANELPORT_TYPE_8P8C = 1000 PORT_TYPE_8P8C = 1000
PANELPORT_TYPE_ST = 2000 PORT_TYPE_ST = 2000
PANELPORT_TYPE_SC_SIMPLEX = 2100 PORT_TYPE_SC_SIMPLEX = 2100
PANELPORT_TYPE_SC_DUPLEX = 2110 PORT_TYPE_SC_DUPLEX = 2110
PANELPORT_TYPE_FC = 2200 PORT_TYPE_FC = 2200
PANELPORT_TYPE_LC = 2300 PORT_TYPE_LC = 2300
PANELPORT_TYPE_MTRJ = 2400 PORT_TYPE_MTRJ = 2400
PANELPORT_TYPE_MPO = 2500 PORT_TYPE_MPO = 2500
PANELPORT_TYPE_CHOICES = [ PORT_TYPE_CHOICES = [
[ [
'Copper', 'Copper',
[ [
[PANELPORT_TYPE_8P8C, '8P8C'], [PORT_TYPE_8P8C, '8P8C'],
], ],
], ],
[ [
'Fiber Optic', 'Fiber Optic',
[ [
[PANELPORT_TYPE_ST, 'ST'], [PORT_TYPE_ST, 'ST'],
[PANELPORT_TYPE_SC_SIMPLEX, 'SC (Simplex)'], [PORT_TYPE_SC_SIMPLEX, 'SC (Simplex)'],
[PANELPORT_TYPE_SC_DUPLEX, 'SC (Duplex)'], [PORT_TYPE_SC_DUPLEX, 'SC (Duplex)'],
[PANELPORT_TYPE_FC, 'FC'], [PORT_TYPE_FC, 'FC'],
[PANELPORT_TYPE_LC, 'LC'], [PORT_TYPE_LC, 'LC'],
[PANELPORT_TYPE_MTRJ, 'MTRJ'], [PORT_TYPE_MTRJ, 'MTRJ'],
[PANELPORT_TYPE_MPO, 'MPO'], [PORT_TYPE_MPO, 'MPO'],
] ]
] ]
] ]
@ -285,7 +285,7 @@ CONNECTION_STATUS_CHOICES = [
# Cable endpoint types # Cable endpoint types
CABLE_TERMINATION_TYPES = [ CABLE_TERMINATION_TYPES = [
'consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport', 'consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontport', 'rearport',
] ]
# Cable types # Cable types
@ -304,16 +304,16 @@ CABLE_TERMINATION_TYPE_CHOICES = {
'powerport': ('power-ports', 'Power port'), 'powerport': ('power-ports', 'Power port'),
'poweroutlet': ('power-outlets', 'Power outlet'), 'poweroutlet': ('power-outlets', 'Power outlet'),
'interface': ('interfaces', 'Interface'), 'interface': ('interfaces', 'Interface'),
'frontpanelport': ('front-panel-ports', 'Front panel port'), 'frontport': ('front-ports', 'Front panel port'),
'rearpanelport': ('rear-panel-ports', 'Rear panel port'), 'rearport': ('rear-ports', 'Rear panel port'),
} }
COMPATIBLE_TERMINATION_TYPES = { COMPATIBLE_TERMINATION_TYPES = {
'consoleport': ['consoleserverport', 'frontpanelport', 'rearpanelport'], 'consoleport': ['consoleserverport', 'frontport', 'rearport'],
'consoleserverport': ['consoleport', 'frontpanelport', 'rearpanelport'], 'consoleserverport': ['consoleport', 'frontport', 'rearport'],
'powerport': ['poweroutlet'], 'powerport': ['poweroutlet'],
'poweroutlet': ['powerport'], 'poweroutlet': ['powerport'],
'interface': ['interface', 'frontpanelport', 'rearpanelport'], 'interface': ['interface', 'frontport', 'rearport'],
'frontpanelport': ['consoleport', 'consoleserverport', 'interface', 'frontpanelport', 'rearpanelport'], 'frontport': ['consoleport', 'consoleserverport', 'interface', 'frontport', 'rearport'],
'rearpanelport': ['consoleport', 'consoleserverport', 'interface', 'frontpanelport', 'rearpanelport'], 'rearport': ['consoleport', 'consoleserverport', 'interface', 'frontport', 'rearport'],
} }

View File

@ -14,9 +14,9 @@ from .constants import (
) )
from .models import ( from .models import (
Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBayTemplate, DeviceRole, DeviceType, FrontPanelPort, FrontPanelPortTemplate, Interface, InterfaceTemplate, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
InventoryItem, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, InventoryItem, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
RackGroup, RackReservation, RackRole, RearPanelPort, RearPanelPortTemplate, Region, Site, VirtualChassis, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
) )
@ -368,17 +368,17 @@ class InterfaceTemplateFilter(DeviceTypeComponentFilterSet):
fields = ['name', 'form_factor', 'mgmt_only'] fields = ['name', 'form_factor', 'mgmt_only']
class FrontPanelPortTemplateFilter(DeviceTypeComponentFilterSet): class FrontPortTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = FrontPanelPortTemplate model = FrontPortTemplate
fields = ['name', 'type'] fields = ['name', 'type']
class RearPanelPortTemplateFilter(DeviceTypeComponentFilterSet): class RearPortTemplateFilter(DeviceTypeComponentFilterSet):
class Meta: class Meta:
model = RearPanelPortTemplate model = RearPortTemplate
fields = ['name', 'type'] fields = ['name', 'type']
@ -681,17 +681,17 @@ class InterfaceFilter(django_filters.FilterSet):
return queryset.none() return queryset.none()
class FrontPanelPortFilter(DeviceComponentFilterSet): class FrontPortFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = FrontPanelPort model = FrontPort
fields = ['name', 'type'] fields = ['name', 'type']
class RearPanelPortFilter(DeviceComponentFilterSet): class RearPortFilter(DeviceComponentFilterSet):
class Meta: class Meta:
model = RearPanelPort model = RearPort
fields = ['name', 'type'] fields = ['name', 'type']

View File

@ -27,9 +27,9 @@ from virtualization.models import Cluster
from .constants import * from .constants import *
from .models import ( from .models import (
Cable, DeviceBay, DeviceBayTemplate, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Cable, DeviceBay, DeviceBayTemplate, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate,
Device, DeviceRole, DeviceType, FrontPanelPort, FrontPanelPortTemplate, Interface, InterfaceTemplate, Manufacturer, Device, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate, Manufacturer,
InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, RackGroup,
RackReservation, RackRole, RearPanelPort, RearPanelPortTemplate, Region, Site, VirtualChassis, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
) )
DEVICE_BY_PK_RE = r'{\d+\}' DEVICE_BY_PK_RE = r'{\d+\}'
@ -702,22 +702,22 @@ class InterfaceTemplateBulkEditForm(BootstrapMixin, BulkEditForm):
nullable_fields = [] nullable_fields = []
class FrontPanelPortTemplateForm(BootstrapMixin, forms.ModelForm): class FrontPortTemplateForm(BootstrapMixin, forms.ModelForm):
class Meta: class Meta:
model = FrontPanelPortTemplate model = FrontPortTemplate
fields = ['device_type', 'name', 'type', 'rear_port', 'rear_port_position'] fields = ['device_type', 'name', 'type', 'rear_port', 'rear_port_position']
widgets = { widgets = {
'device_type': forms.HiddenInput(), 'device_type': forms.HiddenInput(),
} }
class FrontPanelPortTemplateCreateForm(ComponentForm): class FrontPortTemplateCreateForm(ComponentForm):
name_pattern = ExpandableNameField( name_pattern = ExpandableNameField(
label='Name' label='Name'
) )
type = forms.ChoiceField( type = forms.ChoiceField(
choices=PANELPORT_TYPE_CHOICES choices=PORT_TYPE_CHOICES
) )
rear_port_set = forms.MultipleChoiceField( rear_port_set = forms.MultipleChoiceField(
choices=[], choices=[],
@ -727,17 +727,17 @@ class FrontPanelPortTemplateCreateForm(ComponentForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(FrontPanelPortTemplateCreateForm, self).__init__(*args, **kwargs) super(FrontPortTemplateCreateForm, self).__init__(*args, **kwargs)
# Determine which rear port positions are occupied. These will be excluded from the list of available mappings. # Determine which rear port positions are occupied. These will be excluded from the list of available mappings.
occupied_port_positions = [ occupied_port_positions = [
(front_port.rear_port_id, front_port.rear_port_position) (front_port.rear_port_id, front_port.rear_port_position)
for front_port in self.parent.front_panel_port_templates.all() for front_port in self.parent.front_port_templates.all()
] ]
# Populate rear port choices # Populate rear port choices
choices = [] choices = []
rear_ports = natsorted(RearPanelPortTemplate.objects.filter(device_type=self.parent), key=attrgetter('name')) rear_ports = natsorted(RearPortTemplate.objects.filter(device_type=self.parent), key=attrgetter('name'))
for rear_port in rear_ports: for rear_port in rear_ports:
for i in range(1, rear_port.positions + 1): for i in range(1, rear_port.positions + 1):
if (rear_port.pk, i) not in occupied_port_positions: if (rear_port.pk, i) not in occupied_port_positions:
@ -768,22 +768,22 @@ class FrontPanelPortTemplateCreateForm(ComponentForm):
} }
class RearPanelPortTemplateForm(BootstrapMixin, forms.ModelForm): class RearPortTemplateForm(BootstrapMixin, forms.ModelForm):
class Meta: class Meta:
model = RearPanelPortTemplate model = RearPortTemplate
fields = ['device_type', 'name', 'type', 'positions'] fields = ['device_type', 'name', 'type', 'positions']
widgets = { widgets = {
'device_type': forms.HiddenInput(), 'device_type': forms.HiddenInput(),
} }
class RearPanelPortTemplateCreateForm(ComponentForm): class RearPortTemplateCreateForm(ComponentForm):
name_pattern = ExpandableNameField( name_pattern = ExpandableNameField(
label='Name' label='Name'
) )
type = forms.ChoiceField( type = forms.ChoiceField(
choices=PANELPORT_TYPE_CHOICES choices=PORT_TYPE_CHOICES
) )
positions = forms.IntegerField( positions = forms.IntegerField(
min_value=1, min_value=1,
@ -2018,27 +2018,27 @@ class InterfaceBulkDisconnectForm(ConfirmationForm):
# #
# Front panel ports # Front pass-through ports
# #
class FrontPanelPortForm(BootstrapMixin, forms.ModelForm): class FrontPortForm(BootstrapMixin, forms.ModelForm):
tags = TagField(required=False) tags = TagField(required=False)
class Meta: class Meta:
model = FrontPanelPort model = FrontPort
fields = ['device', 'name', 'type', 'rear_port', 'rear_port_position', 'tags'] fields = ['device', 'name', 'type', 'rear_port', 'rear_port_position', 'tags']
widgets = { widgets = {
'device': forms.HiddenInput(), 'device': forms.HiddenInput(),
} }
# TODO: Merge with FrontPanelPortTemplateCreateForm to remove duplicate logic # TODO: Merge with FrontPortTemplateCreateForm to remove duplicate logic
class FrontPanelPortCreateForm(ComponentForm): class FrontPortCreateForm(ComponentForm):
name_pattern = ExpandableNameField( name_pattern = ExpandableNameField(
label='Name' label='Name'
) )
type = forms.ChoiceField( type = forms.ChoiceField(
choices=PANELPORT_TYPE_CHOICES choices=PORT_TYPE_CHOICES
) )
rear_port_set = forms.MultipleChoiceField( rear_port_set = forms.MultipleChoiceField(
choices=[], choices=[],
@ -2048,17 +2048,17 @@ class FrontPanelPortCreateForm(ComponentForm):
def __init__(self, *args, **kwargs): def __init__(self, *args, **kwargs):
super(FrontPanelPortCreateForm, self).__init__(*args, **kwargs) super(FrontPortCreateForm, self).__init__(*args, **kwargs)
# Determine which rear port positions are occupied. These will be excluded from the list of available mappings. # Determine which rear port positions are occupied. These will be excluded from the list of available mappings.
occupied_port_positions = [ occupied_port_positions = [
(front_port.rear_port_id, front_port.rear_port_position) (front_port.rear_port_id, front_port.rear_port_position)
for front_port in self.parent.front_panel_port_templates.all() for front_port in self.parent.front_port_templates.all()
] ]
# Populate rear port choices # Populate rear port choices
choices = [] choices = []
rear_ports = natsorted(RearPanelPort.objects.filter(device=self.parent), key=attrgetter('name')) rear_ports = natsorted(RearPort.objects.filter(device=self.parent), key=attrgetter('name'))
for rear_port in rear_ports: for rear_port in rear_ports:
for i in range(1, rear_port.positions + 1): for i in range(1, rear_port.positions + 1):
if (rear_port.pk, i) not in occupied_port_positions: if (rear_port.pk, i) not in occupied_port_positions:
@ -2089,34 +2089,34 @@ class FrontPanelPortCreateForm(ComponentForm):
} }
class FrontPanelPortBulkRenameForm(BulkRenameForm): class FrontPortBulkRenameForm(BulkRenameForm):
pk = forms.ModelMultipleChoiceField( pk = forms.ModelMultipleChoiceField(
queryset=FrontPanelPort.objects.all(), queryset=FrontPort.objects.all(),
widget=forms.MultipleHiddenInput widget=forms.MultipleHiddenInput
) )
# #
# Rear panel ports # Rear pass-through ports
# #
class RearPanelPortForm(BootstrapMixin, forms.ModelForm): class RearPortForm(BootstrapMixin, forms.ModelForm):
tags = TagField(required=False) tags = TagField(required=False)
class Meta: class Meta:
model = RearPanelPort model = RearPort
fields = ['device', 'name', 'type', 'positions', 'tags'] fields = ['device', 'name', 'type', 'positions', 'tags']
widgets = { widgets = {
'device': forms.HiddenInput(), 'device': forms.HiddenInput(),
} }
class RearPanelPortCreateForm(ComponentForm): class RearPortCreateForm(ComponentForm):
name_pattern = ExpandableNameField( name_pattern = ExpandableNameField(
label='Name' label='Name'
) )
type = forms.ChoiceField( type = forms.ChoiceField(
choices=PANELPORT_TYPE_CHOICES choices=PORT_TYPE_CHOICES
) )
positions = forms.IntegerField( positions = forms.IntegerField(
min_value=1, min_value=1,
@ -2126,9 +2126,9 @@ class RearPanelPortCreateForm(ComponentForm):
) )
class RearPanelPortBulkRenameForm(BulkRenameForm): class RearPortBulkRenameForm(BulkRenameForm):
pk = forms.ModelMultipleChoiceField( pk = forms.ModelMultipleChoiceField(
queryset=RearPanelPort.objects.all(), queryset=RearPort.objects.all(),
widget=forms.MultipleHiddenInput widget=forms.MultipleHiddenInput
) )

View File

@ -15,20 +15,20 @@ class Migration(migrations.Migration):
operations = [ operations = [
migrations.CreateModel( migrations.CreateModel(
name='FrontPanelPort', name='FrontPort',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
('name', models.CharField(max_length=64)), ('name', models.CharField(max_length=64)),
('type', models.PositiveSmallIntegerField()), ('type', models.PositiveSmallIntegerField()),
('rear_port_position', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(64)])), ('rear_port_position', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(64)])),
('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='front_panel_ports', to='dcim.Device')), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='front_ports', to='dcim.Device')),
], ],
options={ options={
'ordering': ['device', 'name'], 'ordering': ['device', 'name'],
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='FrontPanelPortTemplate', name='FrontPortTemplate',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
('name', models.CharField(max_length=64)), ('name', models.CharField(max_length=64)),
@ -40,13 +40,13 @@ class Migration(migrations.Migration):
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='RearPanelPort', name='RearPort',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
('name', models.CharField(max_length=64)), ('name', models.CharField(max_length=64)),
('type', models.PositiveSmallIntegerField()), ('type', models.PositiveSmallIntegerField()),
('positions', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(64)])), ('positions', models.PositiveSmallIntegerField(default=1, validators=[django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(64)])),
('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rear_panel_ports', to='dcim.Device')), ('device', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rear_ports', to='dcim.Device')),
('tags', taggit.managers.TaggableManager(through='taggit.TaggedItem', to='taggit.Tag')), ('tags', taggit.managers.TaggableManager(through='taggit.TaggedItem', to='taggit.Tag')),
], ],
options={ options={
@ -54,7 +54,7 @@ class Migration(migrations.Migration):
}, },
), ),
migrations.CreateModel( migrations.CreateModel(
name='RearPanelPortTemplate', name='RearPortTemplate',
fields=[ fields=[
('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)), ('id', models.AutoField(auto_created=True, primary_key=True, serialize=False)),
('name', models.CharField(max_length=64)), ('name', models.CharField(max_length=64)),
@ -71,44 +71,44 @@ class Migration(migrations.Migration):
field=models.BooleanField(default=False), field=models.BooleanField(default=False),
), ),
migrations.AddField( migrations.AddField(
model_name='rearpanelporttemplate', model_name='rearporttemplate',
name='device_type', name='device_type',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rear_panel_port_templates', to='dcim.DeviceType'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='rear_port_templates', to='dcim.DeviceType'),
), ),
migrations.AddField( migrations.AddField(
model_name='frontpanelporttemplate', model_name='frontporttemplate',
name='device_type', name='device_type',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='front_panel_port_templates', to='dcim.DeviceType'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='front_port_templates', to='dcim.DeviceType'),
), ),
migrations.AddField( migrations.AddField(
model_name='frontpanelporttemplate', model_name='frontporttemplate',
name='rear_port', name='rear_port',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='front_panel_port_templates', to='dcim.RearPanelPortTemplate'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='front_port_templates', to='dcim.RearPortTemplate'),
), ),
migrations.AddField( migrations.AddField(
model_name='frontpanelport', model_name='frontport',
name='rear_port', name='rear_port',
field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='front_panel_ports', to='dcim.RearPanelPort'), field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, related_name='front_ports', to='dcim.RearPort'),
), ),
migrations.AddField( migrations.AddField(
model_name='frontpanelport', model_name='frontport',
name='tags', name='tags',
field=taggit.managers.TaggableManager(through='taggit.TaggedItem', to='taggit.Tag'), field=taggit.managers.TaggableManager(through='taggit.TaggedItem', to='taggit.Tag'),
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='rearpanelporttemplate', name='rearporttemplate',
unique_together={('device_type', 'name')}, unique_together={('device_type', 'name')},
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='rearpanelport', name='rearport',
unique_together={('device', 'name')}, unique_together={('device', 'name')},
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='frontpanelporttemplate', name='frontporttemplate',
unique_together={('rear_port', 'rear_port_position'), ('device_type', 'name')}, unique_together={('rear_port', 'rear_port_position'), ('device_type', 'name')},
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(
name='frontpanelport', name='frontport',
unique_together={('device', 'name'), ('rear_port', 'rear_port_position')}, unique_together={('device', 'name'), ('rear_port', 'rear_port_position')},
), ),
] ]

View File

@ -105,7 +105,7 @@ class Migration(migrations.Migration):
dependencies = [ dependencies = [
('contenttypes', '0002_remove_content_type_name'), ('contenttypes', '0002_remove_content_type_name'),
('dcim', '0065_patch_panel_ports'), ('dcim', '0065_front_rear_ports'),
] ]
operations = [ operations = [
@ -123,8 +123,8 @@ class Migration(migrations.Migration):
('status', models.BooleanField(default=True)), ('status', models.BooleanField(default=True)),
('label', models.CharField(blank=True, max_length=100)), ('label', models.CharField(blank=True, max_length=100)),
('color', utilities.fields.ColorField(blank=True, max_length=6)), ('color', utilities.fields.ColorField(blank=True, max_length=6)),
('termination_a_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')), ('termination_a_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontport', 'rearport']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
('termination_b_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontpanelport', 'rearpanelport']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')), ('termination_b_type', models.ForeignKey(limit_choices_to={'model__in': ['consoleport', 'consoleserverport', 'interface', 'poweroutlet', 'powerport', 'frontport', 'rearport']}, on_delete=django.db.models.deletion.PROTECT, related_name='+', to='contenttypes.ContentType')),
], ],
), ),
migrations.AlterUniqueTogether( migrations.AlterUniqueTogether(

View File

@ -869,7 +869,7 @@ class DeviceType(ChangeLoggedModel, CustomFieldModel):
}) })
if not self.is_patch_panel and ( if not self.is_patch_panel and (
self.front_panel_port_templates.exists() or self.rear_panel_port_templates.exists() self.front_port_templates.exists() or self.rear_port_templates.exists()
): ):
raise ValidationError({ raise ValidationError({
'is_patch_panel': "Must delete all patch panel port templates associated with this device before " 'is_patch_panel': "Must delete all patch panel port templates associated with this device before "
@ -1015,25 +1015,25 @@ class InterfaceTemplate(ComponentTemplateModel):
return self.name return self.name
class FrontPanelPortTemplate(ComponentTemplateModel): class FrontPortTemplate(ComponentTemplateModel):
""" """
A template for a front patch panel port on a new Device. Template for a pass-through port on the front of a new Device.
""" """
device_type = models.ForeignKey( device_type = models.ForeignKey(
to='dcim.DeviceType', to='dcim.DeviceType',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='front_panel_port_templates' related_name='front_port_templates'
) )
name = models.CharField( name = models.CharField(
max_length=64 max_length=64
) )
type = models.PositiveSmallIntegerField( type = models.PositiveSmallIntegerField(
choices=PANELPORT_TYPE_CHOICES choices=PORT_TYPE_CHOICES
) )
rear_port = models.ForeignKey( rear_port = models.ForeignKey(
to='dcim.RearPanelPortTemplate', to='dcim.RearPortTemplate',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='front_panel_port_templates' related_name='front_port_templates'
) )
rear_port_position = models.PositiveSmallIntegerField( rear_port_position = models.PositiveSmallIntegerField(
default=1, default=1,
@ -1067,20 +1067,20 @@ class FrontPanelPortTemplate(ComponentTemplateModel):
) )
class RearPanelPortTemplate(ComponentTemplateModel): class RearPortTemplate(ComponentTemplateModel):
""" """
A template for a rear patch panel port on a new Device. Template for a pass-through port on the rear of a new Device.
""" """
device_type = models.ForeignKey( device_type = models.ForeignKey(
to='dcim.DeviceType', to='dcim.DeviceType',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='rear_panel_port_templates' related_name='rear_port_templates'
) )
name = models.CharField( name = models.CharField(
max_length=64 max_length=64
) )
type = models.PositiveSmallIntegerField( type = models.PositiveSmallIntegerField(
choices=PANELPORT_TYPE_CHOICES choices=PORT_TYPE_CHOICES
) )
positions = models.PositiveSmallIntegerField( positions = models.PositiveSmallIntegerField(
default=1, default=1,
@ -1512,22 +1512,22 @@ class Device(ChangeLoggedModel, ConfigContextModel, CustomFieldModel):
[Interface(device=self, name=template.name, form_factor=template.form_factor, [Interface(device=self, name=template.name, form_factor=template.form_factor,
mgmt_only=template.mgmt_only) for template in self.device_type.interface_templates.all()] mgmt_only=template.mgmt_only) for template in self.device_type.interface_templates.all()]
) )
RearPanelPort.objects.bulk_create([ RearPort.objects.bulk_create([
RearPanelPort( RearPort(
device=self, device=self,
name=template.name, name=template.name,
type=template.type, type=template.type,
positions=template.positions positions=template.positions
) for template in self.device_type.rear_panel_port_templates.all() ) for template in self.device_type.rear_port_templates.all()
]) ])
FrontPanelPort.objects.bulk_create([ FrontPort.objects.bulk_create([
FrontPanelPort( FrontPort(
device=self, device=self,
name=template.name, name=template.name,
type=template.type, type=template.type,
rear_port=RearPanelPort.objects.get(device=self, name=template.rear_port.name), rear_port=RearPort.objects.get(device=self, name=template.rear_port.name),
rear_port_position=template.rear_port_position, rear_port_position=template.rear_port_position,
) for template in self.device_type.front_panel_port_templates.all() ) for template in self.device_type.front_port_templates.all()
]) ])
DeviceBay.objects.bulk_create( DeviceBay.objects.bulk_create(
[DeviceBay(device=self, name=template.name) for template in [DeviceBay(device=self, name=template.name) for template in
@ -2046,28 +2046,28 @@ class Interface(ComponentModel):
# #
# Patch panel ports # Pass-through ports
# #
class FrontPanelPort(ComponentModel): class FrontPort(ComponentModel):
""" """
A port on the front of a patch panel. A pass-through port on the front of a Device.
""" """
device = models.ForeignKey( device = models.ForeignKey(
to='dcim.Device', to='dcim.Device',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='front_panel_ports' related_name='front_ports'
) )
name = models.CharField( name = models.CharField(
max_length=64 max_length=64
) )
type = models.PositiveSmallIntegerField( type = models.PositiveSmallIntegerField(
choices=PANELPORT_TYPE_CHOICES choices=PORT_TYPE_CHOICES
) )
rear_port = models.ForeignKey( rear_port = models.ForeignKey(
to='dcim.RearPanelPort', to='dcim.RearPort',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='front_panel_ports' related_name='front_ports'
) )
rear_port_position = models.PositiveSmallIntegerField( rear_port_position = models.PositiveSmallIntegerField(
default=1, default=1,
@ -2103,20 +2103,20 @@ class FrontPanelPort(ComponentModel):
) )
class RearPanelPort(ComponentModel): class RearPort(ComponentModel):
""" """
A port on the rear of a patch panel. A pass-through port on the rear of a Device.
""" """
device = models.ForeignKey( device = models.ForeignKey(
to='dcim.Device', to='dcim.Device',
on_delete=models.CASCADE, on_delete=models.CASCADE,
related_name='rear_panel_ports' related_name='rear_ports'
) )
name = models.CharField( name = models.CharField(
max_length=64 max_length=64
) )
type = models.PositiveSmallIntegerField( type = models.PositiveSmallIntegerField(
choices=PANELPORT_TYPE_CHOICES choices=PORT_TYPE_CHOICES
) )
positions = models.PositiveSmallIntegerField( positions = models.PositiveSmallIntegerField(
default=1, default=1,
@ -2380,23 +2380,23 @@ class Cable(ChangeLoggedModel):
def trace_cable(termination, position=1): def trace_cable(termination, position=1):
# Given a front port, follow the cable connected to the corresponding rear port/position # Given a front port, follow the cable connected to the corresponding rear port/position
if isinstance(termination, FrontPanelPort): if isinstance(termination, FrontPort):
peer_port = termination.rear_port peer_port = termination.rear_port
position = termination.rear_port_position position = termination.rear_port_position
# Given a rear port/position, follow the cable connected to the corresponding front port # Given a rear port/position, follow the cable connected to the corresponding front port
elif isinstance(termination, RearPanelPort): elif isinstance(termination, RearPort):
if position not in range(1, termination.positions + 1): if position not in range(1, termination.positions + 1):
raise Exception("Invalid position for {} ({} positions): {})".format( raise Exception("Invalid position for {} ({} positions): {})".format(
termination, termination.positions, position termination, termination.positions, position
)) ))
peer_port = FrontPanelPort.objects.get( peer_port = FrontPort.objects.get(
rear_port=termination, rear_port=termination,
rear_port_position=position, rear_port_position=position,
) )
position=1 position=1
# Termination is not a panel port, so we've reached the end of the path # Termination is not a pass-through port, so we've reached the end of the path
else: else:
return termination return termination

View File

@ -5,9 +5,9 @@ from tenancy.tables import COL_TENANT
from utilities.tables import BaseTable, BooleanColumn, ToggleColumn from utilities.tables import BaseTable, BooleanColumn, ToggleColumn
from .models import ( from .models import (
Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBayTemplate, DeviceRole, DeviceType, FrontPanelPort, FrontPanelPortTemplate, Interface, InterfaceTemplate, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
InventoryItem, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, InventoryItem, Manufacturer, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
RackGroup, RackReservation, RearPanelPort, RearPanelPortTemplate, Region, Site, VirtualChassis, RackGroup, RackReservation, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
) )
REGION_LINK = """ REGION_LINK = """
@ -416,20 +416,20 @@ class InterfaceTemplateTable(BaseTable):
empty_text = "None" empty_text = "None"
class FrontPanelPortTemplateTable(BaseTable): class FrontPortTemplateTable(BaseTable):
pk = ToggleColumn() pk = ToggleColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = FrontPanelPortTemplate model = FrontPortTemplate
fields = ('pk', 'name', 'type', 'rear_port', 'rear_port_position') fields = ('pk', 'name', 'type', 'rear_port', 'rear_port_position')
empty_text = "None" empty_text = "None"
class RearPanelPortTemplateTable(BaseTable): class RearPortTemplateTable(BaseTable):
pk = ToggleColumn() pk = ToggleColumn()
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = RearPanelPortTemplate model = RearPortTemplate
fields = ('pk', 'name', 'type', 'positions') fields = ('pk', 'name', 'type', 'positions')
empty_text = "None" empty_text = "None"
@ -593,18 +593,18 @@ class InterfaceTable(BaseTable):
fields = ('name', 'form_factor', 'lag', 'enabled', 'mgmt_only', 'description') fields = ('name', 'form_factor', 'lag', 'enabled', 'mgmt_only', 'description')
class FrontPanelPortTable(BaseTable): class FrontPortTable(BaseTable):
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = FrontPanelPort model = FrontPort
fields = ('name', 'type', 'rear_port', 'rear_port_position') fields = ('name', 'type', 'rear_port', 'rear_port_position')
empty_text = "None" empty_text = "None"
class RearPanelPortTable(BaseTable): class RearPortTable(BaseTable):
class Meta(BaseTable.Meta): class Meta(BaseTable.Meta):
model = RearPanelPort model = RearPort
fields = ('name', 'type', 'positions') fields = ('name', 'type', 'positions')
empty_text = "None" empty_text = "None"

View File

@ -109,13 +109,13 @@ urlpatterns = [
url(r'^device-types/(?P<pk>\d+)/interfaces/edit/$', views.InterfaceTemplateBulkEditView.as_view(), name='devicetype_bulkedit_interface'), url(r'^device-types/(?P<pk>\d+)/interfaces/edit/$', views.InterfaceTemplateBulkEditView.as_view(), name='devicetype_bulkedit_interface'),
url(r'^device-types/(?P<pk>\d+)/interfaces/delete/$', views.InterfaceTemplateBulkDeleteView.as_view(), name='devicetype_delete_interface'), url(r'^device-types/(?P<pk>\d+)/interfaces/delete/$', views.InterfaceTemplateBulkDeleteView.as_view(), name='devicetype_delete_interface'),
# Front panel port templates # Front port templates
url(r'^device-types/(?P<pk>\d+)/front-panel-ports/add/$', views.FrontPanelPortTemplateCreateView.as_view(), name='devicetype_add_frontpanelport'), url(r'^device-types/(?P<pk>\d+)/front-ports/add/$', views.FrontPortTemplateCreateView.as_view(), name='devicetype_add_frontport'),
url(r'^device-types/(?P<pk>\d+)/front-panel-ports/delete/$', views.FrontPanelPortTemplateBulkDeleteView.as_view(), name='devicetype_delete_frontpanelport'), url(r'^device-types/(?P<pk>\d+)/front-ports/delete/$', views.FrontPortTemplateBulkDeleteView.as_view(), name='devicetype_delete_frontport'),
# Front panel port templates # Rear port templates
url(r'^device-types/(?P<pk>\d+)/rear-panel-ports/add/$', views.RearPanelPortTemplateCreateView.as_view(), name='devicetype_add_rearpanelport'), url(r'^device-types/(?P<pk>\d+)/rear-ports/add/$', views.RearPortTemplateCreateView.as_view(), name='devicetype_add_rearport'),
url(r'^device-types/(?P<pk>\d+)/rear-panel-ports/delete/$', views.RearPanelPortTemplateBulkDeleteView.as_view(), name='devicetype_delete_rearpanelport'), url(r'^device-types/(?P<pk>\d+)/rear-ports/delete/$', views.RearPortTemplateBulkDeleteView.as_view(), name='devicetype_delete_rearport'),
# Device bay templates # Device bay templates
url(r'^device-types/(?P<pk>\d+)/device-bays/add/$', views.DeviceBayTemplateCreateView.as_view(), name='devicetype_add_devicebay'), url(r'^device-types/(?P<pk>\d+)/device-bays/add/$', views.DeviceBayTemplateCreateView.as_view(), name='devicetype_add_devicebay'),
@ -215,21 +215,21 @@ urlpatterns = [
url(r'^interfaces/(?P<pk>\d+)/changelog/$', ObjectChangeLogView.as_view(), name='interface_changelog', kwargs={'model': Interface}), url(r'^interfaces/(?P<pk>\d+)/changelog/$', ObjectChangeLogView.as_view(), name='interface_changelog', kwargs={'model': Interface}),
url(r'^interfaces/rename/$', views.InterfaceBulkRenameView.as_view(), name='interface_bulk_rename'), url(r'^interfaces/rename/$', views.InterfaceBulkRenameView.as_view(), name='interface_bulk_rename'),
# Front panel ports # Front ports
# url(r'^devices/front-panel-ports/add/$', views.DeviceBulkAddFrontPanelPortView.as_view(), name='device_bulk_add_frontpanelport'), # url(r'^devices/front-ports/add/$', views.DeviceBulkAddFrontPortView.as_view(), name='device_bulk_add_frontport'),
url(r'^devices/(?P<pk>\d+)/front-panel-ports/add/$', views.FrontPanelPortCreateView.as_view(), name='frontpanelport_add'), url(r'^devices/(?P<pk>\d+)/front-ports/add/$', views.FrontPortCreateView.as_view(), name='frontport_add'),
url(r'^devices/(?P<pk>\d+)/front-panel-ports/delete/$', views.FrontPanelPortBulkDeleteView.as_view(), name='frontpanelport_bulk_delete'), url(r'^devices/(?P<pk>\d+)/front-ports/delete/$', views.FrontPortBulkDeleteView.as_view(), name='frontport_bulk_delete'),
url(r'^front-panel-ports/(?P<pk>\d+)/edit/$', views.FrontPanelPortEditView.as_view(), name='frontpanelport_edit'), url(r'^front-ports/(?P<pk>\d+)/edit/$', views.FrontPortEditView.as_view(), name='frontport_edit'),
url(r'^front-panel-ports/(?P<pk>\d+)/delete/$', views.FrontPanelPortDeleteView.as_view(), name='frontpanelport_delete'), url(r'^front-ports/(?P<pk>\d+)/delete/$', views.FrontPortDeleteView.as_view(), name='frontport_delete'),
url(r'^front-panel-ports/rename/$', views.FrontPanelPortBulkRenameView.as_view(), name='frontpanelport_bulk_rename'), url(r'^front-ports/rename/$', views.FrontPortBulkRenameView.as_view(), name='frontport_bulk_rename'),
# Rear panel ports # Rear ports
# url(r'^devices/rear-panel-ports/add/$', views.DeviceBulkAddRearPanelPortView.as_view(), name='device_bulk_add_rearpanelport'), # url(r'^devices/rear-ports/add/$', views.DeviceBulkAddRearPortView.as_view(), name='device_bulk_add_rearport'),
url(r'^devices/(?P<pk>\d+)/rear-panel-ports/add/$', views.RearPanelPortCreateView.as_view(), name='rearpanelport_add'), url(r'^devices/(?P<pk>\d+)/rear-ports/add/$', views.RearPortCreateView.as_view(), name='rearport_add'),
url(r'^devices/(?P<pk>\d+)/rear-panel-ports/delete/$', views.RearPanelPortBulkDeleteView.as_view(), name='rearpanelport_bulk_delete'), url(r'^devices/(?P<pk>\d+)/rear-ports/delete/$', views.RearPortBulkDeleteView.as_view(), name='rearport_bulk_delete'),
url(r'^rear-panel-ports/(?P<pk>\d+)/edit/$', views.RearPanelPortEditView.as_view(), name='rearpanelport_edit'), url(r'^rear-ports/(?P<pk>\d+)/edit/$', views.RearPortEditView.as_view(), name='rearport_edit'),
url(r'^rear-panel-ports/(?P<pk>\d+)/delete/$', views.RearPanelPortDeleteView.as_view(), name='rearpanelport_delete'), url(r'^rear-ports/(?P<pk>\d+)/delete/$', views.RearPortDeleteView.as_view(), name='rearport_delete'),
url(r'^rear-panel-ports/rename/$', views.RearPanelPortBulkRenameView.as_view(), name='rearpanelport_bulk_rename'), url(r'^rear-ports/rename/$', views.RearPortBulkRenameView.as_view(), name='rearport_bulk_rename'),
# Device bays # Device bays
url(r'^devices/device-bays/add/$', views.DeviceBulkAddDeviceBayView.as_view(), name='device_bulk_add_devicebay'), url(r'^devices/device-bays/add/$', views.DeviceBulkAddDeviceBayView.as_view(), name='device_bulk_add_devicebay'),

View File

@ -29,9 +29,9 @@ from . import filters, forms, tables
from .constants import CONNECTION_STATUS_CONNECTED from .constants import CONNECTION_STATUS_CONNECTED
from .models import ( from .models import (
Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay, Cable, ConsolePort, ConsolePortTemplate, ConsoleServerPort, ConsoleServerPortTemplate, Device, DeviceBay,
DeviceBayTemplate, DeviceRole, DeviceType, FrontPanelPort, FrontPanelPortTemplate, Interface, InterfaceTemplate, DeviceBayTemplate, DeviceRole, DeviceType, FrontPort, FrontPortTemplate, Interface, InterfaceTemplate,
Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack, Manufacturer, InventoryItem, Platform, PowerOutlet, PowerOutletTemplate, PowerPort, PowerPortTemplate, Rack,
RackGroup, RackReservation, RackRole, RearPanelPort, RearPanelPortTemplate, Region, Site, VirtualChassis, RackGroup, RackReservation, RackRole, RearPort, RearPortTemplate, Region, Site, VirtualChassis,
) )
@ -557,12 +557,12 @@ class DeviceTypeView(View):
).filter(device_type=devicetype)), ).filter(device_type=devicetype)),
orderable=False orderable=False
) )
front_panel_port_table = tables.FrontPanelPortTemplateTable( front_port_table = tables.FrontPortTemplateTable(
natsorted(FrontPanelPortTemplate.objects.filter(device_type=devicetype), key=attrgetter('name')), natsorted(FrontPortTemplate.objects.filter(device_type=devicetype), key=attrgetter('name')),
orderable=False orderable=False
) )
rear_panel_port_table = tables.RearPanelPortTemplateTable( rear_port_table = tables.RearPortTemplateTable(
natsorted(RearPanelPortTemplate.objects.filter(device_type=devicetype), key=attrgetter('name')), natsorted(RearPortTemplate.objects.filter(device_type=devicetype), key=attrgetter('name')),
orderable=False orderable=False
) )
devicebay_table = tables.DeviceBayTemplateTable( devicebay_table = tables.DeviceBayTemplateTable(
@ -575,8 +575,8 @@ class DeviceTypeView(View):
powerport_table.columns.show('pk') powerport_table.columns.show('pk')
poweroutlet_table.columns.show('pk') poweroutlet_table.columns.show('pk')
interface_table.columns.show('pk') interface_table.columns.show('pk')
front_panel_port_table.columns.show('pk') front_port_table.columns.show('pk')
rear_panel_port_table.columns.show('pk') rear_port_table.columns.show('pk')
devicebay_table.columns.show('pk') devicebay_table.columns.show('pk')
return render(request, 'dcim/devicetype.html', { return render(request, 'dcim/devicetype.html', {
@ -586,8 +586,8 @@ class DeviceTypeView(View):
'powerport_table': powerport_table, 'powerport_table': powerport_table,
'poweroutlet_table': poweroutlet_table, 'poweroutlet_table': poweroutlet_table,
'interface_table': interface_table, 'interface_table': interface_table,
'front_panel_port_table': front_panel_port_table, 'front_port_table': front_port_table,
'rear_panel_port_table': rear_panel_port_table, 'rear_port_table': rear_port_table,
'devicebay_table': devicebay_table, 'devicebay_table': devicebay_table,
}) })
@ -731,38 +731,38 @@ class InterfaceTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
table = tables.InterfaceTemplateTable table = tables.InterfaceTemplateTable
class FrontPanelPortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView): class FrontPortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
permission_required = 'dcim.add_frontpanelporttemplate' permission_required = 'dcim.add_frontporttemplate'
parent_model = DeviceType parent_model = DeviceType
parent_field = 'device_type' parent_field = 'device_type'
model = FrontPanelPortTemplate model = FrontPortTemplate
form = forms.FrontPanelPortTemplateCreateForm form = forms.FrontPortTemplateCreateForm
model_form = forms.FrontPanelPortTemplateForm model_form = forms.FrontPortTemplateForm
template_name = 'dcim/device_component_add.html' template_name = 'dcim/device_component_add.html'
class FrontPanelPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class FrontPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_frontpanelporttemplate' permission_required = 'dcim.delete_frontporttemplate'
queryset = FrontPanelPortTemplate.objects.all() queryset = FrontPortTemplate.objects.all()
parent_model = DeviceType parent_model = DeviceType
table = tables.FrontPanelPortTemplateTable table = tables.FrontPortTemplateTable
class RearPanelPortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView): class RearPortTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
permission_required = 'dcim.add_rearpanelporttemplate' permission_required = 'dcim.add_rearporttemplate'
parent_model = DeviceType parent_model = DeviceType
parent_field = 'device_type' parent_field = 'device_type'
model = RearPanelPortTemplate model = RearPortTemplate
form = forms.RearPanelPortTemplateCreateForm form = forms.RearPortTemplateCreateForm
model_form = forms.RearPanelPortTemplateForm model_form = forms.RearPortTemplateForm
template_name = 'dcim/device_component_add.html' template_name = 'dcim/device_component_add.html'
class RearPanelPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class RearPortTemplateBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_rearpanelporttemplate' permission_required = 'dcim.delete_rearporttemplate'
queryset = RearPanelPortTemplate.objects.all() queryset = RearPortTemplate.objects.all()
parent_model = DeviceType parent_model = DeviceType
table = tables.RearPanelPortTemplateTable table = tables.RearPortTemplateTable
class DeviceBayTemplateCreateView(PermissionRequiredMixin, ComponentCreateView): class DeviceBayTemplateCreateView(PermissionRequiredMixin, ComponentCreateView):
@ -903,11 +903,11 @@ class DeviceView(View):
'connected_endpoint__device', 'circuit_termination__circuit' 'connected_endpoint__device', 'circuit_termination__circuit'
).prefetch_related('ip_addresses') ).prefetch_related('ip_addresses')
# Front panel ports # Front ports
front_panel_ports = device.front_panel_ports.select_related('rear_port') front_ports = device.front_ports.select_related('rear_port')
# Rear panel ports # Rear ports
rear_panel_ports = device.rear_panel_ports.all() rear_ports = device.rear_ports.all()
# Device bays # Device bays
device_bays = natsorted( device_bays = natsorted(
@ -941,8 +941,8 @@ class DeviceView(View):
'poweroutlets': poweroutlets, 'poweroutlets': poweroutlets,
'interfaces': interfaces, 'interfaces': interfaces,
'device_bays': device_bays, 'device_bays': device_bays,
'front_panel_ports': front_panel_ports, 'front_ports': front_ports,
'rear_panel_ports': rear_panel_ports, 'rear_ports': rear_ports,
'services': services, 'services': services,
'secrets': secrets, 'secrets': secrets,
'vc_members': vc_members, 'vc_members': vc_members,
@ -1757,79 +1757,79 @@ class InterfaceBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
# #
# Front panel ports # Front ports
# #
class FrontPanelPortCreateView(PermissionRequiredMixin, ComponentCreateView): class FrontPortCreateView(PermissionRequiredMixin, ComponentCreateView):
permission_required = 'dcim.add_frontpanelport' permission_required = 'dcim.add_frontport'
parent_model = Device parent_model = Device
parent_field = 'device' parent_field = 'device'
model = FrontPanelPort model = FrontPort
form = forms.FrontPanelPortCreateForm form = forms.FrontPortCreateForm
model_form = forms.FrontPanelPortForm model_form = forms.FrontPortForm
template_name = 'dcim/device_component_add.html' template_name = 'dcim/device_component_add.html'
class FrontPanelPortEditView(PermissionRequiredMixin, ObjectEditView): class FrontPortEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'dcim.change_frontpanelport' permission_required = 'dcim.change_frontport'
model = FrontPanelPort model = FrontPort
model_form = forms.FrontPanelPortForm model_form = forms.FrontPortForm
class FrontPanelPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): class FrontPortDeleteView(PermissionRequiredMixin, ObjectDeleteView):
permission_required = 'dcim.delete_frontpanelport' permission_required = 'dcim.delete_frontport'
model = FrontPanelPort model = FrontPort
class FrontPanelPortBulkRenameView(PermissionRequiredMixin, BulkRenameView): class FrontPortBulkRenameView(PermissionRequiredMixin, BulkRenameView):
permission_required = 'dcim.change_frontpanelport' permission_required = 'dcim.change_frontport'
queryset = FrontPanelPort.objects.all() queryset = FrontPort.objects.all()
form = forms.FrontPanelPortBulkRenameForm form = forms.FrontPortBulkRenameForm
class FrontPanelPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class FrontPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_frontpanelport' permission_required = 'dcim.delete_frontport'
queryset = FrontPanelPort.objects.all() queryset = FrontPort.objects.all()
parent_model = Device parent_model = Device
table = tables.FrontPanelPortTable table = tables.FrontPortTable
# #
# Rear panel ports # Rear ports
# #
class RearPanelPortCreateView(PermissionRequiredMixin, ComponentCreateView): class RearPortCreateView(PermissionRequiredMixin, ComponentCreateView):
permission_required = 'dcim.add_rearpanelport' permission_required = 'dcim.add_rearport'
parent_model = Device parent_model = Device
parent_field = 'device' parent_field = 'device'
model = RearPanelPort model = RearPort
form = forms.RearPanelPortCreateForm form = forms.RearPortCreateForm
model_form = forms.RearPanelPortForm model_form = forms.RearPortForm
template_name = 'dcim/device_component_add.html' template_name = 'dcim/device_component_add.html'
class RearPanelPortEditView(PermissionRequiredMixin, ObjectEditView): class RearPortEditView(PermissionRequiredMixin, ObjectEditView):
permission_required = 'dcim.change_rearpanelport' permission_required = 'dcim.change_rearport'
model = RearPanelPort model = RearPort
model_form = forms.RearPanelPortForm model_form = forms.RearPortForm
class RearPanelPortDeleteView(PermissionRequiredMixin, ObjectDeleteView): class RearPortDeleteView(PermissionRequiredMixin, ObjectDeleteView):
permission_required = 'dcim.delete_rearpanelport' permission_required = 'dcim.delete_rearport'
model = RearPanelPort model = RearPort
class RearPanelPortBulkRenameView(PermissionRequiredMixin, BulkRenameView): class RearPortBulkRenameView(PermissionRequiredMixin, BulkRenameView):
permission_required = 'dcim.change_rearpanelport' permission_required = 'dcim.change_rearport'
queryset = RearPanelPort.objects.all() queryset = RearPort.objects.all()
form = forms.RearPanelPortBulkRenameForm form = forms.RearPortBulkRenameForm
class RearPanelPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView): class RearPortBulkDeleteView(PermissionRequiredMixin, BulkDeleteView):
permission_required = 'dcim.delete_rearpanelport' permission_required = 'dcim.delete_rearport'
queryset = RearPanelPort.objects.all() queryset = RearPort.objects.all()
parent_model = Device parent_model = Device
table = tables.RearPanelPortTable table = tables.RearPortTable
# #

View File

@ -689,7 +689,7 @@
</form> </form>
{% endif %} {% endif %}
{% endif %} {% endif %}
{% if front_panel_ports or device.device_type.is_patch_panel %} {% if front_ports or device.device_type.is_patch_panel %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<div class="panel panel-default"> <div class="panel panel-default">
@ -699,7 +699,7 @@
<table class="table table-hover table-headings panel-body component-list"> <table class="table table-hover table-headings panel-body component-list">
<thead> <thead>
<tr> <tr>
{% if perms.dcim.change_frontpanelport or perms.dcim.delete_frontpanelport %} {% if perms.dcim.change_frontport or perms.dcim.delete_frontport %}
<th class="pk"><input type="checkbox" class="toggle" title="Toggle all" /></th> <th class="pk"><input type="checkbox" class="toggle" title="Toggle all" /></th>
{% endif %} {% endif %}
<th>Name</th> <th>Name</th>
@ -710,8 +710,8 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for frontpanelport in front_panel_ports %} {% for frontport in front_ports %}
{% include 'dcim/inc/frontpanelport.html' %} {% include 'dcim/inc/frontport.html' %}
{% empty %} {% empty %}
<tr> <tr>
<td colspan="5" class="text-center text-muted">&mdash; No front panel ports defined &mdash;</td> <td colspan="5" class="text-center text-muted">&mdash; No front panel ports defined &mdash;</td>
@ -720,19 +720,19 @@
</tbody> </tbody>
</table> </table>
<div class="panel-footer"> <div class="panel-footer">
{% if front_panel_ports and perms.dcim.change_frontpanelport %} {% if front_ports and perms.dcim.change_frontport %}
<button type="submit" name="_rename" formaction="{% url 'dcim:frontpanelport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:frontport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
</button> </button>
{% endif %} {% endif %}
{% if front_panel_ports and perms.dcim.delete_frontpanelport %} {% if front_ports and perms.dcim.delete_frontport %}
<button type="submit" formaction="{% url 'dcim:frontpanelport_bulk_delete' pk=device.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs"> <button type="submit" formaction="{% url 'dcim:frontport_bulk_delete' pk=device.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete
</button> </button>
{% endif %} {% endif %}
{% if perms.dcim.add_frontpanelport %} {% if perms.dcim.add_frontport %}
<div class="pull-right"> <div class="pull-right">
<a href="{% url 'dcim:frontpanelport_add' pk=device.pk %}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:frontport_add' pk=device.pk %}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add front panel ports <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add front panel ports
</a> </a>
</div> </div>
@ -742,7 +742,7 @@
</div> </div>
</form> </form>
{% endif %} {% endif %}
{% if rear_panel_ports or device.device_type.is_patch_panel %} {% if rear_ports or device.device_type.is_patch_panel %}
<form method="post"> <form method="post">
{% csrf_token %} {% csrf_token %}
<div class="panel panel-default"> <div class="panel panel-default">
@ -752,7 +752,7 @@
<table class="table table-hover table-headings panel-body component-list"> <table class="table table-hover table-headings panel-body component-list">
<thead> <thead>
<tr> <tr>
{% if perms.dcim.change_rearpanelport or perms.dcim.delete_rearpanelport %} {% if perms.dcim.change_rearport or perms.dcim.delete_rearport %}
<th class="pk"><input type="checkbox" class="toggle" title="Toggle all" /></th> <th class="pk"><input type="checkbox" class="toggle" title="Toggle all" /></th>
{% endif %} {% endif %}
<th>Name</th> <th>Name</th>
@ -762,8 +762,8 @@
</tr> </tr>
</thead> </thead>
<tbody> <tbody>
{% for rearpanelport in rear_panel_ports %} {% for rearport in rear_ports %}
{% include 'dcim/inc/rearpanelport.html' %} {% include 'dcim/inc/rearport.html' %}
{% empty %} {% empty %}
<tr> <tr>
<td colspan="5" class="text-center text-muted">&mdash; No rear panel ports defined &mdash;</td> <td colspan="5" class="text-center text-muted">&mdash; No rear panel ports defined &mdash;</td>
@ -772,19 +772,19 @@
</tbody> </tbody>
</table> </table>
<div class="panel-footer"> <div class="panel-footer">
{% if rear_panel_ports and perms.dcim.change_rearpanelport %} {% if rear_ports and perms.dcim.change_rearport %}
<button type="submit" name="_rename" formaction="{% url 'dcim:rearpanelport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs"> <button type="submit" name="_rename" formaction="{% url 'dcim:rearport_bulk_rename' %}?return_url={{ device.get_absolute_url }}" class="btn btn-warning btn-xs">
<span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename <span class="glyphicon glyphicon-pencil" aria-hidden="true"></span> Rename
</button> </button>
{% endif %} {% endif %}
{% if rear_panel_ports and perms.dcim.delete_rearpanelport %} {% if rear_ports and perms.dcim.delete_rearport %}
<button type="submit" formaction="{% url 'dcim:rearpanelport_bulk_delete' pk=device.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs"> <button type="submit" formaction="{% url 'dcim:rearport_bulk_delete' pk=device.pk %}?return_url={{ device.get_absolute_url }}" class="btn btn-danger btn-xs">
<span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete <span class="glyphicon glyphicon-trash" aria-hidden="true"></span> Delete
</button> </button>
{% endif %} {% endif %}
{% if perms.dcim.add_rearpanelport %} {% if perms.dcim.add_rearport %}
<div class="pull-right"> <div class="pull-right">
<a href="{% url 'dcim:rearpanelport_add' pk=device.pk %}" class="btn btn-primary btn-xs"> <a href="{% url 'dcim:rearport_add' pk=device.pk %}" class="btn btn-primary btn-xs">
<span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add rear panel ports <span class="glyphicon glyphicon-plus" aria-hidden="true"></span> Add rear panel ports
</a> </a>
</div> </div>

View File

@ -201,11 +201,11 @@
{% if devicetype.is_pdu or poweroutlet_table.rows %} {% if devicetype.is_pdu or poweroutlet_table.rows %}
{% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:devicetype_add_poweroutlet' delete_url='dcim:devicetype_delete_poweroutlet' %} {% include 'dcim/inc/devicetype_component_table.html' with table=poweroutlet_table title='Power Outlets' add_url='dcim:devicetype_add_poweroutlet' delete_url='dcim:devicetype_delete_poweroutlet' %}
{% endif %} {% endif %}
{% if devicetype.is_patch_panel or front_panel_port_table.rows %} {% if devicetype.is_patch_panel or front_port_table.rows %}
{% include 'dcim/inc/devicetype_component_table.html' with table=front_panel_port_table title='Front Panel Ports' add_url='dcim:devicetype_add_frontpanelport' delete_url='dcim:devicetype_delete_frontpanelport' %} {% include 'dcim/inc/devicetype_component_table.html' with table=front_port_table title='Front Panel Ports' add_url='dcim:devicetype_add_frontport' delete_url='dcim:devicetype_delete_frontport' %}
{% endif %} {% endif %}
{% if devicetype.is_patch_panel or rear_panel_port_table.rows %} {% if devicetype.is_patch_panel or rear_port_table.rows %}
{% include 'dcim/inc/devicetype_component_table.html' with table=rear_panel_port_table title='Rear Panel Ports' add_url='dcim:devicetype_add_rearpanelport' delete_url='dcim:devicetype_delete_rearpanelport' %} {% include 'dcim/inc/devicetype_component_table.html' with table=rear_port_table title='Rear Panel Ports' add_url='dcim:devicetype_add_rearport' delete_url='dcim:devicetype_delete_rearport' %}
{% endif %} {% endif %}
</div> </div>
</div> </div>

View File

@ -1,25 +0,0 @@
<tr class="frontpanelport">
{% if perms.dcim.change_frontpanelport or perms.dcim.delete_frontpanelport %}
<td class="pk">
<input name="pk" type="checkbox" value="{{ frontpanelport.pk }}" />
</td>
{% endif %}
<td>
<i class="fa fa-fw fa-square-o"></i> {{ frontpanelport }}
</td>
<td>{{ frontpanelport.get_type_display }}</td>
<td>{{ frontpanelport.rear_port }}</td>
<td>{{ frontpanelport.rear_port_position }}</td>
<td class="text-right">
{% if perms.dcim.change_frontpanelport %}
<a href="{% url 'dcim:frontpanelport_edit' pk=frontpanelport.pk %}?return_url={{ device.get_absolute_url }}" title="Edit port" class="btn btn-info btn-xs">
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.dcim.delete_frontpanelport %}
<a href="{% url 'dcim:frontpanelport_delete' pk=frontpanelport.pk %}?return_url={{ device.get_absolute_url }}" title="Delete port" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</a>
{% endif %}
</td>
</tr>

View File

@ -0,0 +1,25 @@
<tr class="frontport">
{% if perms.dcim.change_frontport or perms.dcim.delete_frontport %}
<td class="pk">
<input name="pk" type="checkbox" value="{{ frontport.pk }}" />
</td>
{% endif %}
<td>
<i class="fa fa-fw fa-square-o"></i> {{ frontport }}
</td>
<td>{{ frontport.get_type_display }}</td>
<td>{{ frontport.rear_port }}</td>
<td>{{ frontport.rear_port_position }}</td>
<td class="text-right">
{% if perms.dcim.change_frontport %}
<a href="{% url 'dcim:frontport_edit' pk=frontport.pk %}?return_url={{ device.get_absolute_url }}" title="Edit port" class="btn btn-info btn-xs">
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.dcim.delete_frontport %}
<a href="{% url 'dcim:frontport_delete' pk=frontport.pk %}?return_url={{ device.get_absolute_url }}" title="Delete port" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</a>
{% endif %}
</td>
</tr>

View File

@ -1,24 +0,0 @@
<tr class="rearpanelport">
{% if perms.dcim.change_rearpanelport or perms.dcim.delete_rearpanelport %}
<td class="pk">
<input name="pk" type="checkbox" value="{{ rearpanelport.pk }}" />
</td>
{% endif %}
<td>
<i class="fa fa-fw fa-square-o"></i> {{ rearpanelport }}
</td>
<td>{{ rearpanelport.get_type_display }}</td>
<td>{{ rearpanelport.positions }}</td>
<td class="text-right">
{% if perms.dcim.change_rearpanelport %}
<a href="{% url 'dcim:rearpanelport_edit' pk=rearpanelport.pk %}?return_url={{ device.get_absolute_url }}" title="Edit port" class="btn btn-info btn-xs">
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.dcim.delete_rearpanelport %}
<a href="{% url 'dcim:rearpanelport_delete' pk=rearpanelport.pk %}?return_url={{ device.get_absolute_url }}" title="Delete port" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</a>
{% endif %}
</td>
</tr>

View File

@ -0,0 +1,24 @@
<tr class="rearport">
{% if perms.dcim.change_rearport or perms.dcim.delete_rearport %}
<td class="pk">
<input name="pk" type="checkbox" value="{{ rearport.pk }}" />
</td>
{% endif %}
<td>
<i class="fa fa-fw fa-square-o"></i> {{ rearport }}
</td>
<td>{{ rearport.get_type_display }}</td>
<td>{{ rearport.positions }}</td>
<td class="text-right">
{% if perms.dcim.change_rearport %}
<a href="{% url 'dcim:rearport_edit' pk=rearport.pk %}?return_url={{ device.get_absolute_url }}" title="Edit port" class="btn btn-info btn-xs">
<i class="glyphicon glyphicon-pencil" aria-hidden="true"></i>
</a>
{% endif %}
{% if perms.dcim.delete_rearport %}
<a href="{% url 'dcim:rearport_delete' pk=rearport.pk %}?return_url={{ device.get_absolute_url }}" title="Delete port" class="btn btn-danger btn-xs">
<i class="glyphicon glyphicon-trash" aria-hidden="true"></i>
</a>
{% endif %}
</td>
</tr>