diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index ef26e4ae8..e041d4c02 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -897,6 +897,7 @@ class InterfaceSerializer(NetBoxModelSerializer, CabledObjectSerializer, Connect ] def validate(self, data): + # Validate many-to-many VLAN assignments device = self.instance.device if self.instance else data.get('device') for vlan in data.get('tagged_vlans', []): diff --git a/netbox/dcim/models/device_component_templates.py b/netbox/dcim/models/device_component_templates.py index 3b136987d..20f99ecb2 100644 --- a/netbox/dcim/models/device_component_templates.py +++ b/netbox/dcim/models/device_component_templates.py @@ -120,6 +120,10 @@ class ModularComponentTemplateModel(ComponentTemplateModel): ), ) + def __init__(self, *args, **kwargs): + super().__init__(*args, **kwargs) + self.__original_device_type = self.device_type_id + def to_objectchange(self, action): objectchange = super().to_objectchange(action) if self.device_type is not None: @@ -131,6 +135,11 @@ class ModularComponentTemplateModel(ComponentTemplateModel): def clean(self): super().clean() + if self.pk is not None and self.__original_device_type != self.device_type_id: + raise ValidationError({ + "device": "device_type field is read-only and not updatable." + }) + # A component template must belong to a DeviceType *or* to a ModuleType if self.device_type and self.module_type: raise ValidationError( diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 992f88560..5b0442dff 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -80,7 +80,7 @@ class ComponentModel(NetBoxModel): def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) - self.__original_device = self.device + self.__original_device = self.device_id def __str__(self): if self.label: @@ -95,7 +95,7 @@ class ComponentModel(NetBoxModel): def clean(self): super().clean() - if self.pk is None and self.__original_device != self.device: + if self.pk is not None and self.__original_device != self.device_id: raise ValidationError({ "device": "Device field is read-only and not updatable." })