From 5b8d80a371981c4b13dacafc2c18134d102bc8d3 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Fri, 21 Nov 2025 10:06:43 -0500 Subject: [PATCH] Fix filterset tests --- netbox/dcim/filtersets.py | 36 ++++--- .../migrations/0221_m2m_port_assignments.py | 4 + netbox/dcim/models/base.py | 2 + netbox/dcim/tests/test_filtersets.py | 102 ++++++++---------- 4 files changed, 70 insertions(+), 74 deletions(-) diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 4a7463fdd..5bb8cf06d 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -884,10 +884,11 @@ class FrontPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCo choices=PortTypeChoices, null_value=None ) - # TODO - # rear_port_id = django_filters.ModelMultipleChoiceFilter( - # queryset=RearPortTemplate.objects.all() - # ) + rear_port_template_id = django_filters.ModelMultipleChoiceFilter( + field_name='rear_ports', + queryset=FrontPortTemplate.objects.all(), + label=_('Rear port template (ID)'), + ) class Meta: model = FrontPortTemplate @@ -899,10 +900,11 @@ class RearPortTemplateFilterSet(ChangeLoggedModelFilterSet, ModularDeviceTypeCom choices=PortTypeChoices, null_value=None ) - # TODO - # front_port_id = django_filters.ModelMultipleChoiceFilter( - # queryset=FrontPortTemplate.objects.all() - # ) + front_port_template_id = django_filters.ModelMultipleChoiceFilter( + field_name='front_ports', + queryset=FrontPortTemplate.objects.all(), + label=_('Front port template (ID)'), + ) class Meta: model = RearPortTemplate @@ -2106,10 +2108,11 @@ class FrontPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet) choices=PortTypeChoices, null_value=None ) - # TODO - # rear_port_id = django_filters.ModelMultipleChoiceFilter( - # queryset=RearPort.objects.all() - # ) + rear_port_id = django_filters.ModelMultipleChoiceFilter( + field_name='rear_ports', + queryset=RearPort.objects.all(), + label=_('Rear port (ID)'), + ) class Meta: model = FrontPort @@ -2124,10 +2127,11 @@ class RearPortFilterSet(ModularDeviceComponentFilterSet, CabledObjectFilterSet): choices=PortTypeChoices, null_value=None ) - # TODO - # front_port_id = django_filters.ModelMultipleChoiceFilter( - # queryset=FrontPort.objects.all() - # ) + front_port_id = django_filters.ModelMultipleChoiceFilter( + field_name='front_ports', + queryset=FrontPort.objects.all(), + label=_('Front port (ID)'), + ) class Meta: model = RearPort diff --git a/netbox/dcim/migrations/0221_m2m_port_assignments.py b/netbox/dcim/migrations/0221_m2m_port_assignments.py index 0af2016fc..e5b00aa1d 100644 --- a/netbox/dcim/migrations/0221_m2m_port_assignments.py +++ b/netbox/dcim/migrations/0221_m2m_port_assignments.py @@ -68,6 +68,7 @@ class Migration(migrations.Migration): ( 'front_port_position', models.PositiveSmallIntegerField( + default=1, validators=[ django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(1024) @@ -77,6 +78,7 @@ class Migration(migrations.Migration): ( 'rear_port_position', models.PositiveSmallIntegerField( + default=1, validators=[ django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(1024) @@ -127,6 +129,7 @@ class Migration(migrations.Migration): ( 'front_port_position', models.PositiveSmallIntegerField( + default=1, validators=[ django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(1024) @@ -136,6 +139,7 @@ class Migration(migrations.Migration): ( 'rear_port_position', models.PositiveSmallIntegerField( + default=1, validators=[ django.core.validators.MinValueValidator(1), django.core.validators.MaxValueValidator(1024), diff --git a/netbox/dcim/models/base.py b/netbox/dcim/models/base.py index 41ef27131..0689f1ff0 100644 --- a/netbox/dcim/models/base.py +++ b/netbox/dcim/models/base.py @@ -15,12 +15,14 @@ class PortAssignmentBase(models.Model): Base class for PortAssignment and PortAssignment Template """ front_port_position = models.PositiveSmallIntegerField( + default=1, validators=( MinValueValidator(PORT_POSITION_MIN), MaxValueValidator(PORT_POSITION_MAX), ), ) rear_port_position = models.PositiveSmallIntegerField( + default=1, validators=( MinValueValidator(PORT_POSITION_MIN), MaxValueValidator(PORT_POSITION_MAX), diff --git a/netbox/dcim/tests/test_filtersets.py b/netbox/dcim/tests/test_filtersets.py index 0ba777204..1b296766e 100644 --- a/netbox/dcim/tests/test_filtersets.py +++ b/netbox/dcim/tests/test_filtersets.py @@ -1355,22 +1355,15 @@ class DeviceTypeTestCase(TestCase, ChangeLoggedFilterSetTests): RearPortTemplate(device_type=device_types[1], name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C), ) RearPortTemplate.objects.bulk_create(rear_ports) - FrontPortTemplate.objects.bulk_create( - ( - FrontPortTemplate( - device_type=device_types[0], - name='Front Port 1', - type=PortTypeChoices.TYPE_8P8C, - rear_port=rear_ports[0], - ), - FrontPortTemplate( - device_type=device_types[1], - name='Front Port 2', - type=PortTypeChoices.TYPE_8P8C, - rear_port=rear_ports[1], - ), - ) + front_ports = ( + FrontPortTemplate(device_type=device_types[0], name='Front Port 1', type=PortTypeChoices.TYPE_8P8C), + FrontPortTemplate(device_type=device_types[1], name='Front Port 2', type=PortTypeChoices.TYPE_8P8C), ) + FrontPortTemplate.objects.bulk_create(front_ports) + PortAssignmentTemplate.objects.bulk_create([ + PortAssignmentTemplate(front_port=front_ports[0], rear_port=rear_ports[0]), + PortAssignmentTemplate(front_port=front_ports[1], rear_port=rear_ports[1]), + ]) ModuleBayTemplate.objects.bulk_create(( ModuleBayTemplate(device_type=device_types[0], name='Module Bay 1'), ModuleBayTemplate(device_type=device_types[1], name='Module Bay 2'), @@ -1626,22 +1619,15 @@ class ModuleTypeTestCase(TestCase, ChangeLoggedFilterSetTests): RearPortTemplate(module_type=module_types[1], name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C), ) RearPortTemplate.objects.bulk_create(rear_ports) - FrontPortTemplate.objects.bulk_create( - ( - FrontPortTemplate( - module_type=module_types[0], - name='Front Port 1', - type=PortTypeChoices.TYPE_8P8C, - rear_port=rear_ports[0], - ), - FrontPortTemplate( - module_type=module_types[1], - name='Front Port 2', - type=PortTypeChoices.TYPE_8P8C, - rear_port=rear_ports[1], - ), - ) + front_ports = ( + FrontPortTemplate(module_type=module_types[0], name='Front Port 1', type=PortTypeChoices.TYPE_8P8C), + FrontPortTemplate(module_type=module_types[1], name='Front Port 2', type=PortTypeChoices.TYPE_8P8C), ) + FrontPortTemplate.objects.bulk_create(front_ports) + PortAssignmentTemplate.objects.bulk_create([ + PortAssignmentTemplate(front_port=front_ports[0], rear_port=rear_ports[0]), + PortAssignmentTemplate(front_port=front_ports[1], rear_port=rear_ports[1]), + ]) def test_q(self): params = {'q': 'foobar1'} @@ -2057,11 +2043,10 @@ class FrontPortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, ) RearPortTemplate.objects.bulk_create(rear_ports) - FrontPortTemplate.objects.bulk_create(( + front_ports = ( FrontPortTemplate( device_type=device_types[0], name='Front Port 1', - rear_port=rear_ports[0], type=PortTypeChoices.TYPE_8P8C, color=ColorChoices.COLOR_RED, description='foobar1' @@ -2069,7 +2054,6 @@ class FrontPortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, FrontPortTemplate( device_type=device_types[1], name='Front Port 2', - rear_port=rear_ports[1], type=PortTypeChoices.TYPE_110_PUNCH, color=ColorChoices.COLOR_GREEN, description='foobar2' @@ -2077,12 +2061,17 @@ class FrontPortTemplateTestCase(TestCase, DeviceComponentTemplateFilterSetTests, FrontPortTemplate( device_type=device_types[2], name='Front Port 3', - rear_port=rear_ports[2], type=PortTypeChoices.TYPE_BNC, color=ColorChoices.COLOR_BLUE, description='foobar3' ), - )) + ) + FrontPortTemplate.objects.bulk_create(front_ports) + PortAssignmentTemplate.objects.bulk_create([ + PortAssignmentTemplate(front_port=front_ports[0], rear_port=rear_ports[0]), + PortAssignmentTemplate(front_port=front_ports[1], rear_port=rear_ports[1]), + PortAssignmentTemplate(front_port=front_ports[2], rear_port=rear_ports[2]), + ]) def test_name(self): params = {'name': ['Front Port 1', 'Front Port 2']} @@ -2752,10 +2741,15 @@ class DeviceTestCase(TestCase, ChangeLoggedFilterSetTests): RearPort(device=devices[1], name='Rear Port 2', type=PortTypeChoices.TYPE_8P8C), ) RearPort.objects.bulk_create(rear_ports) - FrontPort.objects.bulk_create(( - FrontPort(device=devices[0], name='Front Port 1', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[0]), - FrontPort(device=devices[1], name='Front Port 2', type=PortTypeChoices.TYPE_8P8C, rear_port=rear_ports[1]), - )) + front_ports = ( + FrontPort(device=devices[0], name='Front Port 1', type=PortTypeChoices.TYPE_8P8C), + FrontPort(device=devices[1], name='Front Port 2', type=PortTypeChoices.TYPE_8P8C), + ) + FrontPort.objects.bulk_create(front_ports) + PortAssignment.objects.bulk_create([ + PortAssignment(front_port=front_ports[0], rear_port=rear_ports[0]), + PortAssignment(front_port=front_ports[1], rear_port=rear_ports[1]), + ]) ModuleBay.objects.create(device=devices[0], name='Module Bay 1') ModuleBay.objects.create(device=devices[1], name='Module Bay 2') DeviceBay.objects.bulk_create(( @@ -5090,8 +5084,6 @@ class FrontPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil label='A', type=PortTypeChoices.TYPE_8P8C, color=ColorChoices.COLOR_RED, - rear_port=rear_ports[0], - rear_port_position=1, description='First', _site=devices[0].site, _location=devices[0].location, @@ -5104,8 +5096,6 @@ class FrontPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil label='B', type=PortTypeChoices.TYPE_110_PUNCH, color=ColorChoices.COLOR_GREEN, - rear_port=rear_ports[1], - rear_port_position=2, description='Second', _site=devices[1].site, _location=devices[1].location, @@ -5118,8 +5108,6 @@ class FrontPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil label='C', type=PortTypeChoices.TYPE_BNC, color=ColorChoices.COLOR_BLUE, - rear_port=rear_ports[2], - rear_port_position=3, description='Third', _site=devices[2].site, _location=devices[2].location, @@ -5130,8 +5118,6 @@ class FrontPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil name='Front Port 4', label='D', type=PortTypeChoices.TYPE_FC, - rear_port=rear_ports[3], - rear_port_position=1, _site=devices[3].site, _location=devices[3].location, _rack=devices[3].rack, @@ -5141,8 +5127,6 @@ class FrontPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil name='Front Port 5', label='E', type=PortTypeChoices.TYPE_FC, - rear_port=rear_ports[4], - rear_port_position=1, _site=devices[3].site, _location=devices[3].location, _rack=devices[3].rack, @@ -5152,14 +5136,20 @@ class FrontPortTestCase(TestCase, DeviceComponentFilterSetTests, ChangeLoggedFil name='Front Port 6', label='F', type=PortTypeChoices.TYPE_FC, - rear_port=rear_ports[5], - rear_port_position=1, _site=devices[3].site, _location=devices[3].location, _rack=devices[3].rack, ), ) FrontPort.objects.bulk_create(front_ports) + PortAssignment.objects.bulk_create([ + PortAssignment(front_port=front_ports[0], rear_port=rear_ports[0]), + PortAssignment(front_port=front_ports[1], rear_port=rear_ports[1], rear_port_position=2), + PortAssignment(front_port=front_ports[2], rear_port=rear_ports[2], rear_port_position=3), + PortAssignment(front_port=front_ports[3], rear_port=rear_ports[3]), + PortAssignment(front_port=front_ports[4], rear_port=rear_ports[4]), + PortAssignment(front_port=front_ports[5], rear_port=rear_ports[5]), + ]) # Cables Cable(a_terminations=[front_ports[0]], b_terminations=[front_ports[3]]).save() @@ -6420,13 +6410,9 @@ class CableTestCase(TestCase, ChangeLoggedFilterSetTests): console_server_port = ConsoleServerPort.objects.create(device=devices[0], name='Console Server Port 1') power_port = PowerPort.objects.create(device=devices[0], name='Power Port 1') power_outlet = PowerOutlet.objects.create(device=devices[0], name='Power Outlet 1') - rear_port = RearPort.objects.create(device=devices[0], name='Rear Port 1', positions=1) - front_port = FrontPort.objects.create( - device=devices[0], - name='Front Port 1', - rear_port=rear_port, - rear_port_position=1 - ) + rear_port = RearPort.objects.create(device=devices[0], name='Rear Port 1') + front_port = FrontPort.objects.create(device=devices[0], name='Front Port 1') + PortAssignment.objects.create(front_port=front_port, rear_port=rear_port) power_panel = PowerPanel.objects.create(name='Power Panel 1', site=sites[0]) power_feed = PowerFeed.objects.create(name='Power Feed 1', power_panel=power_panel)