diff --git a/docs/release-notes/version-2.9.md b/docs/release-notes/version-2.9.md index 517e35244..2147f423d 100644 --- a/docs/release-notes/version-2.9.md +++ b/docs/release-notes/version-2.9.md @@ -13,6 +13,7 @@ * [#5350](https://github.com/netbox-community/netbox/issues/5350) - Filter available racks by selected group when creating a rack reservation * [#5355](https://github.com/netbox-community/netbox/issues/5355) - Limit rack groups by selected site when editing a rack * [#5356](https://github.com/netbox-community/netbox/issues/5356) - Populate manufacturer field when adding a device component template +* [#5360](https://github.com/netbox-community/netbox/issues/5360) - Clear VLAN assignments when setting interface mode to none --- diff --git a/netbox/dcim/models/device_components.py b/netbox/dcim/models/device_components.py index 502e6e2ce..d596b6ca5 100644 --- a/netbox/dcim/models/device_components.py +++ b/netbox/dcim/models/device_components.py @@ -589,6 +589,18 @@ class BaseInterface(models.Model): class Meta: abstract = True + def save(self, *args, **kwargs): + + # Remove untagged VLAN assignment for non-802.1Q interfaces + if not self.mode: + self.untagged_vlan = None + + # Only "tagged" interfaces may have tagged VLANs assigned. ("tagged all" implies all VLANs are assigned.) + if self.pk and self.mode != InterfaceModeChoices.MODE_TAGGED: + self.tagged_vlans.clear() + + return super().save(*args, **kwargs) + @extras_features('graphs', 'export_templates', 'webhooks') class Interface(CableTermination, ComponentModel, BaseInterface): @@ -724,18 +736,6 @@ class Interface(CableTermination, ComponentModel, BaseInterface): "device, or it must be global".format(self.untagged_vlan) }) - def save(self, *args, **kwargs): - - # Remove untagged VLAN assignment for non-802.1Q interfaces - if self.mode is None: - self.untagged_vlan = None - - # Only "tagged" interfaces may have tagged VLANs assigned. ("tagged all" implies all VLANs are assigned.) - if self.pk and self.mode != InterfaceModeChoices.MODE_TAGGED: - self.tagged_vlans.clear() - - return super().save(*args, **kwargs) - @property def connected_endpoint(self): """ diff --git a/netbox/virtualization/models.py b/netbox/virtualization/models.py index 39f579e30..7a8bd7595 100644 --- a/netbox/virtualization/models.py +++ b/netbox/virtualization/models.py @@ -464,18 +464,6 @@ class VMInterface(BaseInterface): "virtual machine, or it must be global".format(self.untagged_vlan) }) - def save(self, *args, **kwargs): - - # Remove untagged VLAN assignment for non-802.1Q interfaces - if self.mode is None: - self.untagged_vlan = None - - # Only "tagged" interfaces may have tagged VLANs assigned. ("tagged all" implies all VLANs are assigned.) - if self.pk and self.mode != InterfaceModeChoices.MODE_TAGGED: - self.tagged_vlans.clear() - - return super().save(*args, **kwargs) - def to_objectchange(self, action): # Annotate the parent VirtualMachine return ObjectChange(