Prechádzať zdrojové kódy

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 <jstretch@netboxlabs.com>
Renato Almeida de Oliveira 11 mesiacov pred
rodič
commit
bf1a9a6e2d
1 zmenil súbory, kde vykonal 36 pridanie a 18 odobranie
  1. 36 18
      netbox/dcim/forms/bulk_import.py

+ 36 - 18
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
 
 
 #