signals.py 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. from django.db.models.signals import post_save, pre_delete
  2. from django.dispatch import receiver
  3. from .models import Cable, Device, VirtualChassis
  4. @receiver(post_save, sender=VirtualChassis)
  5. def assign_virtualchassis_master(instance, created, **kwargs):
  6. """
  7. When a VirtualChassis is created, automatically assign its master device to the VC.
  8. """
  9. if created:
  10. devices = Device.objects.filter(pk=instance.master.pk)
  11. for device in devices:
  12. device.virtual_chassis = instance
  13. device.vc_position = None
  14. device.save()
  15. @receiver(pre_delete, sender=VirtualChassis)
  16. def clear_virtualchassis_members(instance, **kwargs):
  17. """
  18. When a VirtualChassis is deleted, nullify the vc_position and vc_priority fields of its prior members.
  19. """
  20. devices = Device.objects.filter(virtual_chassis=instance.pk)
  21. for device in devices:
  22. device.vc_position = None
  23. device.vc_priority = None
  24. device.save()
  25. @receiver(post_save, sender=Cable)
  26. def update_connected_endpoints(instance, **kwargs):
  27. """
  28. When a Cable is saved, check for and update its two connected endpoints
  29. """
  30. # Cache the Cable on its two termination points
  31. if instance.termination_a.cable != instance:
  32. instance.termination_a.cable = instance
  33. instance.termination_a.save()
  34. if instance.termination_b.cable != instance:
  35. instance.termination_b.cable = instance
  36. instance.termination_b.save()
  37. # Check if this Cable has formed a complete path. If so, update both endpoints.
  38. endpoint_a, endpoint_b, path_status = instance.get_path_endpoints()
  39. if getattr(endpoint_a, 'is_path_endpoint', False) and getattr(endpoint_b, 'is_path_endpoint', False):
  40. endpoint_a.connected_endpoint = endpoint_b
  41. endpoint_a.connection_status = path_status
  42. endpoint_a.save()
  43. endpoint_b.connected_endpoint = endpoint_a
  44. endpoint_b.connection_status = path_status
  45. endpoint_b.save()
  46. @receiver(pre_delete, sender=Cable)
  47. def nullify_connected_endpoints(instance, **kwargs):
  48. """
  49. When a Cable is deleted, check for and update its two connected endpoints
  50. """
  51. endpoint_a, endpoint_b, _ = instance.get_path_endpoints()
  52. # Disassociate the Cable from its termination points
  53. if instance.termination_a is not None:
  54. instance.termination_a.cable = None
  55. instance.termination_a.save()
  56. if instance.termination_b is not None:
  57. instance.termination_b.cable = None
  58. instance.termination_b.save()
  59. # If this Cable was part of a complete path, tear it down
  60. if hasattr(endpoint_a, 'connected_endpoint') and hasattr(endpoint_b, 'connected_endpoint'):
  61. endpoint_a.connected_endpoint = None
  62. endpoint_a.connection_status = None
  63. endpoint_a.save()
  64. endpoint_b.connected_endpoint = None
  65. endpoint_b.connection_status = None
  66. endpoint_b.save()