|
@@ -2,12 +2,13 @@ import logging
|
|
|
|
|
|
|
|
from cacheops import invalidate_obj
|
|
from cacheops import invalidate_obj
|
|
|
from django.contrib.contenttypes.models import ContentType
|
|
from django.contrib.contenttypes.models import ContentType
|
|
|
|
|
+from django.db.models import Q
|
|
|
from django.db.models.signals import post_save, post_delete, pre_delete
|
|
from django.db.models.signals import post_save, post_delete, pre_delete
|
|
|
from django.db import transaction
|
|
from django.db import transaction
|
|
|
from django.dispatch import receiver
|
|
from django.dispatch import receiver
|
|
|
|
|
|
|
|
from .choices import CableStatusChoices
|
|
from .choices import CableStatusChoices
|
|
|
-from .models import Cable, CablePath, Device, PathEndpoint, VirtualChassis
|
|
|
|
|
|
|
+from .models import Cable, CablePath, Device, PathEndpoint, Rack, RackGroup, VirtualChassis
|
|
|
|
|
|
|
|
|
|
|
|
|
def create_cablepath(node):
|
|
def create_cablepath(node):
|
|
@@ -36,6 +37,40 @@ def rebuild_paths(obj):
|
|
|
create_cablepath(cp.origin)
|
|
create_cablepath(cp.origin)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+#
|
|
|
|
|
+# Site/rack/device assignment
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+@receiver(post_save, sender=RackGroup)
|
|
|
|
|
+def handle_rackgroup_site_change(instance, created, **kwargs):
|
|
|
|
|
+ """
|
|
|
|
|
+ Update child RackGroups and Racks if Site assignment has changed. We intentionally recurse through each child
|
|
|
|
|
+ object instead of calling update() on the QuerySet to ensure the proper change records get created for each.
|
|
|
|
|
+ """
|
|
|
|
|
+ if not created:
|
|
|
|
|
+ for rackgroup in instance.get_children():
|
|
|
|
|
+ rackgroup.site = instance.site
|
|
|
|
|
+ rackgroup.save()
|
|
|
|
|
+ for rack in Rack.objects.filter(group=instance).exclude(site=instance.site):
|
|
|
|
|
+ rack.site = instance.site
|
|
|
|
|
+ rack.save()
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+@receiver(post_save, sender=Rack)
|
|
|
|
|
+def handle_rack_site_change(instance, created, **kwargs):
|
|
|
|
|
+ """
|
|
|
|
|
+ Update child Devices if Site assignment has changed.
|
|
|
|
|
+ """
|
|
|
|
|
+ if not created:
|
|
|
|
|
+ for device in Device.objects.filter(rack=instance).exclude(site=instance.site):
|
|
|
|
|
+ device.site = instance.site
|
|
|
|
|
+ device.save()
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
|
|
+#
|
|
|
|
|
+# Virtual chassis
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
@receiver(post_save, sender=VirtualChassis)
|
|
@receiver(post_save, sender=VirtualChassis)
|
|
|
def assign_virtualchassis_master(instance, created, **kwargs):
|
|
def assign_virtualchassis_master(instance, created, **kwargs):
|
|
|
"""
|
|
"""
|
|
@@ -60,6 +95,11 @@ def clear_virtualchassis_members(instance, **kwargs):
|
|
|
device.save()
|
|
device.save()
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
+#
|
|
|
|
|
+# Cables
|
|
|
|
|
+#
|
|
|
|
|
+
|
|
|
|
|
+
|
|
|
@receiver(post_save, sender=Cable)
|
|
@receiver(post_save, sender=Cable)
|
|
|
def update_connected_endpoints(instance, created, raw=False, **kwargs):
|
|
def update_connected_endpoints(instance, created, raw=False, **kwargs):
|
|
|
"""
|
|
"""
|