From fa70430942856e1f9ed0a0534bbbbeec2e8f4754 Mon Sep 17 00:00:00 2001 From: Jeremy Stretch Date: Wed, 26 Nov 2025 15:04:43 -0500 Subject: [PATCH] Enable defining port mappings when importing device/module types --- netbox/dcim/forms/object_import.py | 20 ++++++++++++++++++++ netbox/dcim/tests/test_views.py | 27 +++++++++++++++++++++++++-- netbox/dcim/views.py | 2 ++ 3 files changed, 47 insertions(+), 2 deletions(-) diff --git a/netbox/dcim/forms/object_import.py b/netbox/dcim/forms/object_import.py index a0de2ad24..3b6a6e648 100644 --- a/netbox/dcim/forms/object_import.py +++ b/netbox/dcim/forms/object_import.py @@ -13,6 +13,7 @@ __all__ = ( 'InterfaceTemplateImportForm', 'InventoryItemTemplateImportForm', 'ModuleBayTemplateImportForm', + 'PortTemplateMappingImportForm', 'PowerOutletTemplateImportForm', 'PowerPortTemplateImportForm', 'RearPortTemplateImportForm', @@ -134,6 +135,25 @@ class RearPortTemplateImportForm(forms.ModelForm): ] +class PortTemplateMappingImportForm(forms.ModelForm): + front_port = forms.ModelChoiceField( + label=_('Front port'), + queryset=FrontPortTemplate.objects.all(), + to_field_name='name', + ) + rear_port = forms.ModelChoiceField( + label=_('Rear port'), + queryset=RearPortTemplate.objects.all(), + to_field_name='name', + ) + + class Meta: + model = PortTemplateMapping + fields = [ + 'front_port', 'front_port_position', 'rear_port', 'rear_port_position', + ] + + class ModuleBayTemplateImportForm(forms.ModelForm): class Meta: diff --git a/netbox/dcim/tests/test_views.py b/netbox/dcim/tests/test_views.py index 1bf8ed99c..52b02d982 100644 --- a/netbox/dcim/tests/test_views.py +++ b/netbox/dcim/tests/test_views.py @@ -865,12 +865,16 @@ rear-ports: front-ports: - name: Front Port 1 type: 8p8c - rear_port: Rear Port 1 - name: Front Port 2 type: 8p8c - rear_port: Rear Port 2 - name: Front Port 3 type: 8p8c +port-mappings: + - front_port: Front Port 1 + rear_port: Rear Port 1 + - front_port: Front Port 2 + rear_port: Rear Port 2 + - front_port: Front Port 3 rear_port: Rear Port 3 module-bays: - name: Module Bay 1 @@ -971,6 +975,12 @@ inventory-items: fp1 = FrontPortTemplate.objects.first() self.assertEqual(fp1.name, 'Front Port 1') + self.assertEqual(device_type.port_mappings.count(), 3) + mapping1 = PortTemplateMapping.objects.first() + self.assertEqual(mapping1.device_type, device_type) + self.assertEqual(mapping1.front_port, fp1) + self.assertEqual(mapping1.rear_port, rp1) + self.assertEqual(device_type.modulebaytemplates.count(), 3) mb1 = ModuleBayTemplate.objects.first() self.assertEqual(mb1.name, 'Module Bay 1') @@ -1394,6 +1404,13 @@ front-ports: type: 8p8c - name: Front Port 3 type: 8p8c +port-mappings: + - front_port: Front Port 1 + rear_port: Rear Port 1 + - front_port: Front Port 2 + rear_port: Rear Port 2 + - front_port: Front Port 3 + rear_port: Rear Port 3 module-bays: - name: Module Bay 1 position: 1 @@ -1471,6 +1488,12 @@ module-bays: fp1 = FrontPortTemplate.objects.first() self.assertEqual(fp1.name, 'Front Port 1') + self.assertEqual(module_type.port_mappings.count(), 3) + mapping1 = PortTemplateMapping.objects.first() + self.assertEqual(mapping1.module_type, module_type) + self.assertEqual(mapping1.front_port, fp1) + self.assertEqual(mapping1.rear_port, rp1) + self.assertEqual(module_type.modulebaytemplates.count(), 3) mb1 = ModuleBayTemplate.objects.first() self.assertEqual(mb1.name, 'Module Bay 1') diff --git a/netbox/dcim/views.py b/netbox/dcim/views.py index ca2f11537..b78685f5b 100644 --- a/netbox/dcim/views.py +++ b/netbox/dcim/views.py @@ -1516,6 +1516,7 @@ class DeviceTypeImportView(generic.BulkImportView): 'interfaces': forms.InterfaceTemplateImportForm, 'rear-ports': forms.RearPortTemplateImportForm, 'front-ports': forms.FrontPortTemplateImportForm, + 'port-mappings': forms.PortTemplateMappingImportForm, 'module-bays': forms.ModuleBayTemplateImportForm, 'device-bays': forms.DeviceBayTemplateImportForm, 'inventory-items': forms.InventoryItemTemplateImportForm, @@ -1820,6 +1821,7 @@ class ModuleTypeImportView(generic.BulkImportView): 'interfaces': forms.InterfaceTemplateImportForm, 'rear-ports': forms.RearPortTemplateImportForm, 'front-ports': forms.FrontPortTemplateImportForm, + 'port-mappings': forms.PortTemplateMappingImportForm, 'module-bays': forms.ModuleBayTemplateImportForm, }