signals.py 2.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. import logging
  2. from django.db.models.signals import post_delete, post_save
  3. from django.dispatch import receiver
  4. from dcim.exceptions import UnsupportedCablePath
  5. from dcim.models import CablePath, Interface
  6. from dcim.utils import create_cablepaths
  7. from utilities.exceptions import AbortRequest
  8. from .models import WirelessLink
  9. #
  10. # Wireless links
  11. #
  12. @receiver(post_save, sender=WirelessLink)
  13. def update_connected_interfaces(instance, created, raw=False, **kwargs):
  14. """
  15. When a WirelessLink is saved, save a reference to it on each connected interface.
  16. """
  17. logger = logging.getLogger('netbox.wireless.wirelesslink')
  18. if raw:
  19. logger.debug(f"Skipping endpoint updates for imported wireless link {instance}")
  20. return
  21. if instance.interface_a.wireless_link != instance:
  22. logger.debug(f"Updating interface A for wireless link {instance}")
  23. instance.interface_a.wireless_link = instance
  24. instance.interface_a.save()
  25. if instance.interface_b.cable != instance:
  26. logger.debug(f"Updating interface B for wireless link {instance}")
  27. instance.interface_b.wireless_link = instance
  28. instance.interface_b.save()
  29. # Create/update cable paths
  30. if created:
  31. for interface in (instance.interface_a, instance.interface_b):
  32. try:
  33. create_cablepaths([interface])
  34. except UnsupportedCablePath as e:
  35. raise AbortRequest(e)
  36. @receiver(post_delete, sender=WirelessLink)
  37. def nullify_connected_interfaces(instance, **kwargs):
  38. """
  39. When a WirelessLink is deleted, update its two connected Interfaces
  40. """
  41. logger = logging.getLogger('netbox.wireless.wirelesslink')
  42. if instance.interface_a is not None:
  43. logger.debug(f"Nullifying interface A for wireless link {instance}")
  44. Interface.objects.filter(pk=instance.interface_a.pk).update(wireless_link=None)
  45. if instance.interface_b is not None:
  46. logger.debug(f"Nullifying interface B for wireless link {instance}")
  47. Interface.objects.filter(pk=instance.interface_b.pk).update(wireless_link=None)
  48. # Delete and retrace any dependent cable paths
  49. for cablepath in CablePath.objects.filter(_nodes__contains=instance):
  50. cablepath.delete()