diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index be93f33b9..3671d5a77 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -1154,7 +1154,6 @@ class VirtualChassis(PrimaryModel): }) def delete(self, *args, **kwargs): - # Check for LAG interfaces split across member chassis interfaces = Interface.objects.filter( device__in=self.members.all(), @@ -1168,6 +1167,13 @@ class VirtualChassis(PrimaryModel): "interfaces." ).format(self=self, interfaces=InterfaceSpeedChoices)) + # Clear vc_position and vc_priority on member devices BEFORE calling super().delete() + # This must be done here because on_delete=SET_NULL executes before pre_delete signal + for device in members_list: + device.vc_position = None + device.vc_priority = None + device.save() + return super().delete(*args, **kwargs) diff --git a/netbox/dcim/signals.py b/netbox/dcim/signals.py index 8f7d0d2eb..9295ddbdb 100644 --- a/netbox/dcim/signals.py +++ b/netbox/dcim/signals.py @@ -1,6 +1,6 @@ import logging -from django.db.models.signals import post_save, post_delete, pre_delete +from django.db.models.signals import post_save, post_delete from django.dispatch import receiver from dcim.choices import CableEndChoices, LinkStatusChoices @@ -85,18 +85,6 @@ def assign_virtualchassis_master(instance, created, **kwargs): master.save() -@receiver(pre_delete, sender=VirtualChassis) -def clear_virtualchassis_members(instance, **kwargs): - """ - When a VirtualChassis is deleted, nullify the vc_position and vc_priority fields of its prior members. - """ - devices = Device.objects.filter(virtual_chassis=instance.pk) - for device in devices: - device.vc_position = None - device.vc_priority = None - device.save() - - # # Cables #