Sfoglia il codice sorgente

Fix YAML import for ModuleTypes

jeremystretch 4 anni fa
parent
commit
5bd223a468

+ 19 - 21
netbox/dcim/forms/object_import.py

@@ -50,23 +50,21 @@ class ModuleTypeImportForm(BootstrapMixin, forms.ModelForm):
 
 
 class ComponentTemplateImportForm(BootstrapMixin, forms.ModelForm):
 class ComponentTemplateImportForm(BootstrapMixin, forms.ModelForm):
 
 
-    def __init__(self, device_type, data=None, *args, **kwargs):
-
-        # Must pass the parent DeviceType on form initialization
-        data.update({
-            'device_type': device_type.pk,
-        })
-
-        super().__init__(data, *args, **kwargs)
-
     def clean_device_type(self):
     def clean_device_type(self):
+        # Limit fields referencing other components to the parent DeviceType
+        if data := self.cleaned_data['device_type']:
+            for field_name, field in self.fields.items():
+                if isinstance(field, forms.ModelChoiceField) and field_name not in ['device_type', 'module_type']:
+                    field.queryset = field.queryset.filter(device_type=data)
 
 
-        data = self.cleaned_data['device_type']
+        return data
 
 
-        # Limit fields referencing other components to the parent DeviceType
-        for field_name, field in self.fields.items():
-            if isinstance(field, forms.ModelChoiceField) and field_name != 'device_type':
-                field.queryset = field.queryset.filter(device_type=data)
+    def clean_module_type(self):
+        # Limit fields referencing other components to the parent ModuleType
+        if data := self.cleaned_data['module_type']:
+            for field_name, field in self.fields.items():
+                if isinstance(field, forms.ModelChoiceField) and field_name not in ['device_type', 'module_type']:
+                    field.queryset = field.queryset.filter(module_type=data)
 
 
         return data
         return data
 
 
@@ -76,7 +74,7 @@ class ConsolePortTemplateImportForm(ComponentTemplateImportForm):
     class Meta:
     class Meta:
         model = ConsolePortTemplate
         model = ConsolePortTemplate
         fields = [
         fields = [
-            'device_type', 'name', 'label', 'type', 'description',
+            'device_type', 'module_type', 'name', 'label', 'type', 'description',
         ]
         ]
 
 
 
 
@@ -85,7 +83,7 @@ class ConsoleServerPortTemplateImportForm(ComponentTemplateImportForm):
     class Meta:
     class Meta:
         model = ConsoleServerPortTemplate
         model = ConsoleServerPortTemplate
         fields = [
         fields = [
-            'device_type', 'name', 'label', 'type', 'description',
+            'device_type', 'module_type', 'name', 'label', 'type', 'description',
         ]
         ]
 
 
 
 
@@ -94,7 +92,7 @@ class PowerPortTemplateImportForm(ComponentTemplateImportForm):
     class Meta:
     class Meta:
         model = PowerPortTemplate
         model = PowerPortTemplate
         fields = [
         fields = [
-            'device_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description',
+            'device_type', 'module_type', 'name', 'label', 'type', 'maximum_draw', 'allocated_draw', 'description',
         ]
         ]
 
 
 
 
@@ -108,7 +106,7 @@ class PowerOutletTemplateImportForm(ComponentTemplateImportForm):
     class Meta:
     class Meta:
         model = PowerOutletTemplate
         model = PowerOutletTemplate
         fields = [
         fields = [
-            'device_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description',
+            'device_type', 'module_type', 'name', 'label', 'type', 'power_port', 'feed_leg', 'description',
         ]
         ]
 
 
 
 
@@ -120,7 +118,7 @@ class InterfaceTemplateImportForm(ComponentTemplateImportForm):
     class Meta:
     class Meta:
         model = InterfaceTemplate
         model = InterfaceTemplate
         fields = [
         fields = [
-            'device_type', 'name', 'label', 'type', 'mgmt_only', 'description',
+            'device_type', 'module_type', 'name', 'label', 'type', 'mgmt_only', 'description',
         ]
         ]
 
 
 
 
@@ -136,7 +134,7 @@ class FrontPortTemplateImportForm(ComponentTemplateImportForm):
     class Meta:
     class Meta:
         model = FrontPortTemplate
         model = FrontPortTemplate
         fields = [
         fields = [
-            'device_type', 'name', 'type', 'rear_port', 'rear_port_position', 'label', 'description',
+            'device_type', 'module_type', 'name', 'type', 'rear_port', 'rear_port_position', 'label', 'description',
         ]
         ]
 
 
 
 
@@ -148,7 +146,7 @@ class RearPortTemplateImportForm(ComponentTemplateImportForm):
     class Meta:
     class Meta:
         model = RearPortTemplate
         model = RearPortTemplate
         fields = [
         fields = [
-            'device_type', 'name', 'type', 'positions', 'label', 'description',
+            'device_type', 'module_type', 'name', 'type', 'positions', 'label', 'description',
         ]
         ]
 
 
 
 

+ 8 - 0
netbox/dcim/views.py

@@ -892,6 +892,10 @@ class DeviceTypeImportView(generic.ObjectImportView):
         ('device-bays', forms.DeviceBayTemplateImportForm),
         ('device-bays', forms.DeviceBayTemplateImportForm),
     ))
     ))
 
 
+    def prep_related_object_data(self, parent, data):
+        data.update({'device_type': parent})
+        return data
+
 
 
 class DeviceTypeBulkEditView(generic.BulkEditView):
 class DeviceTypeBulkEditView(generic.BulkEditView):
     queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
     queryset = DeviceType.objects.prefetch_related('manufacturer').annotate(
@@ -1009,6 +1013,10 @@ class ModuleTypeImportView(generic.ObjectImportView):
         ('front-ports', forms.FrontPortTemplateImportForm),
         ('front-ports', forms.FrontPortTemplateImportForm),
     ))
     ))
 
 
+    def prep_related_object_data(self, parent, data):
+        data.update({'module_type': parent})
+        return data
+
 
 
 class ModuleTypeBulkEditView(generic.BulkEditView):
 class ModuleTypeBulkEditView(generic.BulkEditView):
     queryset = ModuleType.objects.prefetch_related('manufacturer').annotate(
     queryset = ModuleType.objects.prefetch_related('manufacturer').annotate(

+ 9 - 2
netbox/netbox/views/generic/object_views.py

@@ -319,6 +319,13 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
     def get_required_permission(self):
     def get_required_permission(self):
         return get_permission_for_model(self.queryset.model, 'add')
         return get_permission_for_model(self.queryset.model, 'add')
 
 
+    def prep_related_object_data(self, parent, data):
+        """
+        Hook to modify the data for related objects before it's passed to the related object form (for example, to
+        assign a parent object).
+        """
+        return data
+
     def _create_object(self, model_form):
     def _create_object(self, model_form):
 
 
         # Save the primary object
         # Save the primary object
@@ -333,8 +340,8 @@ class ObjectImportView(GetReturnURLMixin, ObjectPermissionRequiredMixin, View):
 
 
             related_obj_pks = []
             related_obj_pks = []
             for i, rel_obj_data in enumerate(model_form.data.get(field_name, list())):
             for i, rel_obj_data in enumerate(model_form.data.get(field_name, list())):
-
-                f = related_object_form(obj, rel_obj_data)
+                rel_obj_data = self.prep_related_object_data(obj, rel_obj_data)
+                f = related_object_form(rel_obj_data)
 
 
                 for subfield_name, field in f.fields.items():
                 for subfield_name, field in f.fields.items():
                     if subfield_name not in rel_obj_data and hasattr(field, 'initial'):
                     if subfield_name not in rel_obj_data and hasattr(field, 'initial'):