From bf1a9a6e2d3c4d3f28ee5c5dab5b0e12c8685d80 Mon Sep 17 00:00:00 2001 From: Renato Almeida de Oliveira Date: Wed, 19 Mar 2025 10:56:42 -0300 Subject: [PATCH] Fixes: #18833 Inventory Item Bulk Import - 'InventoryItemImportForm' has no field named 'component_id'. (#18874) * Refactor InventoryItemImportForm clean method * Add super().clean(); renamed content_type; simplified component creation * Fix missing component_name issue * Update netbox/dcim/forms/bulk_import.py --------- Co-authored-by: Jeremy Stretch --- netbox/dcim/forms/bulk_import.py | 54 +++++++++++++++++++++----------- 1 file changed, 36 insertions(+), 18 deletions(-) diff --git a/netbox/dcim/forms/bulk_import.py b/netbox/dcim/forms/bulk_import.py index 92f7220da..cb36e94bf 100644 --- a/netbox/dcim/forms/bulk_import.py +++ b/netbox/dcim/forms/bulk_import.py @@ -1161,27 +1161,45 @@ class InventoryItemImportForm(NetBoxModelImportForm): else: self.fields['parent'].queryset = InventoryItem.objects.none() - def clean_component_name(self): - content_type = self.cleaned_data.get('component_type') - component_name = self.cleaned_data.get('component_name') + def clean(self): + super().clean() + cleaned_data = self.cleaned_data + component_type = cleaned_data.get('component_type') + component_name = cleaned_data.get('component_name') device = self.cleaned_data.get("device") - if not device and hasattr(self, 'instance') and hasattr(self.instance, 'device'): - device = self.instance.device - - if not all([device, content_type, component_name]): - return None - - model = content_type.model_class() - try: - component = model.objects.get(device=device, name=component_name) - self.instance.component = component - except ObjectDoesNotExist: - raise forms.ValidationError( - _("Component not found: {device} - {component_name}").format( - device=device, component_name=component_name + if component_type: + if device is None: + cleaned_data.pop('component_type', None) + if component_name is None: + cleaned_data.pop('component_type', None) + raise forms.ValidationError( + _("Component name must be specified when component type is specified") ) - ) + if all([device, component_name]): + try: + model = component_type.model_class() + self.instance.component = model.objects.get(device=device, name=component_name) + except ObjectDoesNotExist: + cleaned_data.pop('component_type', None) + cleaned_data.pop('component_name', None) + raise forms.ValidationError( + _("Component not found: {device} - {component_name}").format( + device=device, component_name=component_name + ) + ) + else: + cleaned_data.pop('component_type', None) + if not component_name: + raise forms.ValidationError( + _("Component name must be specified when component type is specified") + ) + else: + if component_name: + raise forms.ValidationError( + _("Component type must be specified when component name is specified") + ) + return cleaned_data #