diff --git a/netbox/dcim/signals.py b/netbox/dcim/signals.py index 212c9b97c..1dbdca140 100644 --- a/netbox/dcim/signals.py +++ b/netbox/dcim/signals.py @@ -37,7 +37,7 @@ def rebuild_paths(obj): # -# Site/rack/device assignment +# Location/rack/device assignment # @receiver(post_save, sender=Location) @@ -47,18 +47,11 @@ def handle_location_site_change(instance, created, **kwargs): object instead of calling update() on the QuerySet to ensure the proper change records get created for each. """ if not created: - for location in instance.get_children(): - location.site = instance.site - location.save() - for rack in Rack.objects.filter(location=instance).exclude(site=instance.site): - rack.site = instance.site - rack.save() - for device in Device.objects.filter(location=instance).exclude(site=instance.site): - device.site = instance.site - device.save() - for powerpanel in PowerPanel.objects.filter(location=instance).exclude(site=instance.site): - powerpanel.site = instance.site - powerpanel.save() + instance.get_descendants().update(site=instance.site) + locations = instance.get_descendants(include_self=True).values_list('pk', flat=True) + Rack.objects.filter(location__in=locations).update(site=instance.site) + Device.objects.filter(location__in=locations).update(site=instance.site) + PowerPanel.objects.filter(location__in=locations).update(site=instance.site) @receiver(post_save, sender=Rack) @@ -67,10 +60,7 @@ def handle_rack_site_change(instance, created, **kwargs): Update child Devices if Site or Location assignment has changed. """ if not created: - for device in Device.objects.filter(rack=instance).exclude(site=instance.site, location=instance.location): - device.site = instance.site - device.location = instance.location - device.save() + Device.objects.filter(rack=instance).update(site=instance.site, location=instance.location) #