Simplify nested port assignment representation

This commit is contained in:
Jeremy Stretch
2025-11-21 13:41:25 -05:00
parent 66bbfa7a88
commit 85d4066501
3 changed files with 94 additions and 40 deletions

View File

@@ -295,13 +295,16 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect
class RearPortAssignmentSerializer(serializers.ModelSerializer): class RearPortAssignmentSerializer(serializers.ModelSerializer):
position = serializers.IntegerField(
source='rear_port_position'
)
front_port = serializers.PrimaryKeyRelatedField( front_port = serializers.PrimaryKeyRelatedField(
queryset=FrontPort.objects.all(), queryset=FrontPort.objects.all(),
) )
class Meta: class Meta:
model = PortAssignment model = PortAssignment
fields = ('id', 'rear_port_position', 'front_port', 'front_port_position') fields = ('position', 'front_port', 'front_port_position')
class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer):
@@ -352,13 +355,16 @@ class RearPortSerializer(NetBoxModelSerializer, CabledObjectSerializer):
class FrontPortAssignmentSerializer(serializers.ModelSerializer): class FrontPortAssignmentSerializer(serializers.ModelSerializer):
position = serializers.IntegerField(
source='front_port_position'
)
rear_port = serializers.PrimaryKeyRelatedField( rear_port = serializers.PrimaryKeyRelatedField(
queryset=RearPort.objects.all(), queryset=RearPort.objects.all(),
) )
class Meta: class Meta:
model = PortAssignment model = PortAssignment
fields = ('id', 'front_port_position', 'rear_port', 'rear_port_position') fields = ('position', 'rear_port', 'rear_port_position')
class FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer): class FrontPortSerializer(NetBoxModelSerializer, CabledObjectSerializer):

View File

@@ -207,13 +207,16 @@ class InterfaceTemplateSerializer(ComponentTemplateSerializer):
class RearPortTemplateAssignmentSerializer(serializers.ModelSerializer): class RearPortTemplateAssignmentSerializer(serializers.ModelSerializer):
position = serializers.IntegerField(
source='rear_port_position'
)
front_port = serializers.PrimaryKeyRelatedField( front_port = serializers.PrimaryKeyRelatedField(
queryset=FrontPortTemplate.objects.all(), queryset=FrontPortTemplate.objects.all(),
) )
class Meta: class Meta:
model = PortAssignmentTemplate model = PortAssignmentTemplate
fields = ('id', 'rear_port_position', 'front_port', 'front_port_position') fields = ('position', 'front_port', 'front_port_position')
class RearPortTemplateSerializer(ComponentTemplateSerializer): class RearPortTemplateSerializer(ComponentTemplateSerializer):
@@ -268,13 +271,16 @@ class RearPortTemplateSerializer(ComponentTemplateSerializer):
class FrontPortTemplateAssignmentSerializer(serializers.ModelSerializer): class FrontPortTemplateAssignmentSerializer(serializers.ModelSerializer):
position = serializers.IntegerField(
source='front_port_position'
)
rear_port = serializers.PrimaryKeyRelatedField( rear_port = serializers.PrimaryKeyRelatedField(
queryset=RearPortTemplate.objects.all(), queryset=RearPortTemplate.objects.all(),
) )
class Meta: class Meta:
model = PortAssignmentTemplate model = PortAssignmentTemplate
fields = ('id', 'front_port_position', 'rear_port', 'rear_port_position') fields = ('position', 'rear_port', 'rear_port_position')
class FrontPortTemplateSerializer(ComponentTemplateSerializer): class FrontPortTemplateSerializer(ComponentTemplateSerializer):

View File

@@ -973,25 +973,20 @@ class FrontPortTemplateTest(APIViewTestCases.APIViewTestCase):
RearPortTemplate(device_type=devicetype, name='Rear Port Template 2', type=PortTypeChoices.TYPE_8P8C), RearPortTemplate(device_type=devicetype, name='Rear Port Template 2', type=PortTypeChoices.TYPE_8P8C),
RearPortTemplate(device_type=devicetype, name='Rear Port Template 3', type=PortTypeChoices.TYPE_8P8C), RearPortTemplate(device_type=devicetype, name='Rear Port Template 3', type=PortTypeChoices.TYPE_8P8C),
RearPortTemplate(device_type=devicetype, name='Rear Port Template 4', type=PortTypeChoices.TYPE_8P8C), RearPortTemplate(device_type=devicetype, name='Rear Port Template 4', type=PortTypeChoices.TYPE_8P8C),
RearPortTemplate(module_type=moduletype, name='Rear Port Template 5', type=PortTypeChoices.TYPE_8P8C), RearPortTemplate(device_type=devicetype, name='Rear Port Template 5', type=PortTypeChoices.TYPE_8P8C),
RearPortTemplate(module_type=moduletype, name='Rear Port Template 6', type=PortTypeChoices.TYPE_8P8C), RearPortTemplate(device_type=devicetype, name='Rear Port Template 6', type=PortTypeChoices.TYPE_8P8C),
RearPortTemplate(module_type=moduletype, name='Rear Port Template 7', type=PortTypeChoices.TYPE_8P8C),
RearPortTemplate(module_type=moduletype, name='Rear Port Template 8', type=PortTypeChoices.TYPE_8P8C),
) )
RearPortTemplate.objects.bulk_create(rear_port_templates) RearPortTemplate.objects.bulk_create(rear_port_templates)
front_port_templates = ( front_port_templates = (
FrontPortTemplate(device_type=devicetype, name='Front Port Template 1', type=PortTypeChoices.TYPE_8P8C), FrontPortTemplate(device_type=devicetype, name='Front Port Template 1', type=PortTypeChoices.TYPE_8P8C),
FrontPortTemplate(device_type=devicetype, name='Front Port Template 2', type=PortTypeChoices.TYPE_8P8C), FrontPortTemplate(device_type=devicetype, name='Front Port Template 2', type=PortTypeChoices.TYPE_8P8C),
FrontPortTemplate(module_type=moduletype, name='Front Port Template 5', type=PortTypeChoices.TYPE_8P8C), FrontPortTemplate(module_type=moduletype, name='Front Port Template 3', type=PortTypeChoices.TYPE_8P8C),
FrontPortTemplate(module_type=moduletype, name='Front Port Template 6', type=PortTypeChoices.TYPE_8P8C),
) )
FrontPortTemplate.objects.bulk_create(front_port_templates) FrontPortTemplate.objects.bulk_create(front_port_templates)
PortAssignmentTemplate.objects.bulk_create([ PortAssignmentTemplate.objects.bulk_create([
PortAssignmentTemplate(front_port=front_port_templates[0], rear_port=rear_port_templates[0]), PortAssignmentTemplate(front_port=front_port_templates[0], rear_port=rear_port_templates[0]),
PortAssignmentTemplate(front_port=front_port_templates[1], rear_port=rear_port_templates[1]), PortAssignmentTemplate(front_port=front_port_templates[1], rear_port=rear_port_templates[1]),
PortAssignmentTemplate(front_port=front_port_templates[2], rear_port=rear_port_templates[4]), PortAssignmentTemplate(front_port=front_port_templates[2], rear_port=rear_port_templates[2]),
PortAssignmentTemplate(front_port=front_port_templates[3], rear_port=rear_port_templates[5]),
]) ])
cls.create_data = [ cls.create_data = [
@@ -1001,8 +996,8 @@ class FrontPortTemplateTest(APIViewTestCases.APIViewTestCase):
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'rear_ports': [ 'rear_ports': [
{ {
'front_port_position': 1, 'position': 1,
'rear_port': rear_port_templates[2].pk, 'rear_port': rear_port_templates[3].pk,
'rear_port_position': 1, 'rear_port_position': 1,
}, },
], ],
@@ -1013,8 +1008,8 @@ class FrontPortTemplateTest(APIViewTestCases.APIViewTestCase):
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'rear_ports': [ 'rear_ports': [
{ {
'front_port_position': 1, 'position': 1,
'rear_port': rear_port_templates[3].pk, 'rear_port': rear_port_templates[4].pk,
'rear_port_position': 1, 'rear_port_position': 1,
}, },
], ],
@@ -1025,20 +1020,8 @@ class FrontPortTemplateTest(APIViewTestCases.APIViewTestCase):
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'rear_ports': [ 'rear_ports': [
{ {
'front_port_position': 1, 'position': 1,
'rear_port': rear_port_templates[6].pk, 'rear_port': rear_port_templates[5].pk,
'rear_port_position': 1,
},
],
},
{
'module_type': moduletype.pk,
'name': 'Front Port Template 8',
'type': PortTypeChoices.TYPE_8P8C,
'rear_ports': [
{
'front_port_position': 1,
'rear_port': rear_port_templates[7].pk,
'rear_port_position': 1, 'rear_port_position': 1,
}, },
], ],
@@ -1063,33 +1046,63 @@ class RearPortTemplateTest(APIViewTestCases.APIViewTestCase):
manufacturer=manufacturer, model='Module Type 1' manufacturer=manufacturer, model='Module Type 1'
) )
front_port_templates = (
FrontPortTemplate(device_type=devicetype, name='Front Port Template 1', type=PortTypeChoices.TYPE_8P8C),
FrontPortTemplate(device_type=devicetype, name='Front Port Template 2', type=PortTypeChoices.TYPE_8P8C),
FrontPortTemplate(module_type=moduletype, name='Front Port Template 3', type=PortTypeChoices.TYPE_8P8C),
FrontPortTemplate(module_type=moduletype, name='Front Port Template 4', type=PortTypeChoices.TYPE_8P8C),
FrontPortTemplate(module_type=moduletype, name='Front Port Template 5', type=PortTypeChoices.TYPE_8P8C),
FrontPortTemplate(module_type=moduletype, name='Front Port Template 6', type=PortTypeChoices.TYPE_8P8C),
)
FrontPortTemplate.objects.bulk_create(front_port_templates)
rear_port_templates = ( rear_port_templates = (
RearPortTemplate(device_type=devicetype, name='Rear Port Template 1', type=PortTypeChoices.TYPE_8P8C), RearPortTemplate(device_type=devicetype, name='Rear Port Template 1', type=PortTypeChoices.TYPE_8P8C),
RearPortTemplate(device_type=devicetype, name='Rear Port Template 2', type=PortTypeChoices.TYPE_8P8C), RearPortTemplate(device_type=devicetype, name='Rear Port Template 2', type=PortTypeChoices.TYPE_8P8C),
RearPortTemplate(device_type=devicetype, name='Rear Port Template 3', type=PortTypeChoices.TYPE_8P8C), RearPortTemplate(device_type=devicetype, name='Rear Port Template 3', type=PortTypeChoices.TYPE_8P8C),
) )
RearPortTemplate.objects.bulk_create(rear_port_templates) RearPortTemplate.objects.bulk_create(rear_port_templates)
PortAssignmentTemplate.objects.bulk_create([
PortAssignmentTemplate(front_port=front_port_templates[0], rear_port=rear_port_templates[0]),
PortAssignmentTemplate(front_port=front_port_templates[1], rear_port=rear_port_templates[1]),
PortAssignmentTemplate(front_port=front_port_templates[2], rear_port=rear_port_templates[2]),
])
cls.create_data = [ cls.create_data = [
{ {
'device_type': devicetype.pk, 'device_type': devicetype.pk,
'name': 'Rear Port Template 4', 'name': 'Rear Port Template 4',
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'front_ports': [
{
'position': 1,
'front_port': front_port_templates[3].pk,
'front_port_position': 1,
},
],
}, },
{ {
'device_type': devicetype.pk, 'device_type': devicetype.pk,
'name': 'Rear Port Template 5', 'name': 'Rear Port Template 5',
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'front_ports': [
{
'position': 1,
'front_port': front_port_templates[4].pk,
'front_port_position': 1,
},
],
}, },
{ {
'module_type': moduletype.pk, 'module_type': moduletype.pk,
'name': 'Rear Port Template 6', 'name': 'Rear Port Template 6',
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
}, 'front_ports': [
{ {
'module_type': moduletype.pk, 'position': 1,
'name': 'Rear Port Template 7', 'front_port': front_port_templates[5].pk,
'type': PortTypeChoices.TYPE_8P8C, 'front_port_position': 1,
},
],
}, },
] ]
@@ -2021,7 +2034,6 @@ class FrontPortTest(APIViewTestCases.APIViewTestCase):
RearPort(device=device, name='Rear Port 6', type=PortTypeChoices.TYPE_8P8C), RearPort(device=device, name='Rear Port 6', type=PortTypeChoices.TYPE_8P8C),
) )
RearPort.objects.bulk_create(rear_ports) RearPort.objects.bulk_create(rear_ports)
front_ports = ( front_ports = (
FrontPort(device=device, name='Front Port 1', type=PortTypeChoices.TYPE_8P8C), FrontPort(device=device, name='Front Port 1', type=PortTypeChoices.TYPE_8P8C),
FrontPort(device=device, name='Front Port 2', type=PortTypeChoices.TYPE_8P8C), FrontPort(device=device, name='Front Port 2', type=PortTypeChoices.TYPE_8P8C),
@@ -2041,7 +2053,7 @@ class FrontPortTest(APIViewTestCases.APIViewTestCase):
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'rear_ports': [ 'rear_ports': [
{ {
'front_port_position': 1, 'position': 1,
'rear_port': rear_ports[3].pk, 'rear_port': rear_ports[3].pk,
'rear_port_position': 1, 'rear_port_position': 1,
}, },
@@ -2053,7 +2065,7 @@ class FrontPortTest(APIViewTestCases.APIViewTestCase):
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'rear_ports': [ 'rear_ports': [
{ {
'front_port_position': 1, 'position': 1,
'rear_port': rear_ports[4].pk, 'rear_port': rear_ports[4].pk,
'rear_port_position': 1, 'rear_port_position': 1,
}, },
@@ -2065,7 +2077,7 @@ class FrontPortTest(APIViewTestCases.APIViewTestCase):
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'rear_ports': [ 'rear_ports': [
{ {
'front_port_position': 1, 'position': 1,
'rear_port': rear_ports[5].pk, 'rear_port': rear_ports[5].pk,
'rear_port_position': 1, 'rear_port_position': 1,
}, },
@@ -2106,6 +2118,15 @@ class RearPortTest(APIViewTestCases.APIViewTestCase):
role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000') role = DeviceRole.objects.create(name='Test Device Role 1', slug='test-device-role-1', color='ff0000')
device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site) device = Device.objects.create(device_type=devicetype, role=role, name='Device 1', site=site)
front_ports = (
FrontPort(device=device, name='Front Port 1', type=PortTypeChoices.TYPE_8P8C),
FrontPort(device=device, name='Front Port 2', type=PortTypeChoices.TYPE_8P8C),
FrontPort(device=device, name='Front Port 3', type=PortTypeChoices.TYPE_8P8C),
FrontPort(device=device, name='Front Port 4', type=PortTypeChoices.TYPE_8P8C),
FrontPort(device=device, name='Front Port 5', type=PortTypeChoices.TYPE_8P8C),
FrontPort(device=device, name='Front Port 6', type=PortTypeChoices.TYPE_8P8C),
)
FrontPort.objects.bulk_create(front_ports)
rear_ports = ( rear_ports = (
RearPort(device=device, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C), RearPort(device=device, name='Rear Port 1', type=PortTypeChoices.TYPE_8P8C),
RearPort(device=device, name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C), RearPort(device=device, name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C),
@@ -2118,16 +2139,37 @@ class RearPortTest(APIViewTestCases.APIViewTestCase):
'device': device.pk, 'device': device.pk,
'name': 'Rear Port 4', 'name': 'Rear Port 4',
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'front_ports': [
{
'position': 1,
'front_port': front_ports[3].pk,
'front_port_position': 1,
},
],
}, },
{ {
'device': device.pk, 'device': device.pk,
'name': 'Rear Port 5', 'name': 'Rear Port 5',
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'front_ports': [
{
'position': 1,
'front_port': front_ports[4].pk,
'front_port_position': 1,
},
],
}, },
{ {
'device': device.pk, 'device': device.pk,
'name': 'Rear Port 6', 'name': 'Rear Port 6',
'type': PortTypeChoices.TYPE_8P8C, 'type': PortTypeChoices.TYPE_8P8C,
'front_ports': [
{
'position': 1,
'front_port': front_ports[5].pk,
'front_port_position': 1,
},
],
}, },
] ]