Coverage for wireless/signals.py: 22%
39 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
« prev ^ index » next coverage.py v7.15.2, created at 2026-10-10 18:35 +0000
1import logging
3from django.db.models.signals import post_delete, post_save
4from django.dispatch import receiver
6from dcim.exceptions import UnsupportedCablePath
7from dcim.models import CablePath, Interface
8from dcim.utils import create_cablepaths
9from utilities.exceptions import AbortRequest
11from .models import WirelessLink
13#
14# Wireless links
15#
18@receiver(post_save, sender=WirelessLink)
19def update_connected_interfaces(instance, created, raw=False, **kwargs):
20 """
21 When a WirelessLink is saved, save a reference to it on each connected interface.
22 """
23 logger = logging.getLogger('netbox.wireless.wirelesslink')
24 if raw:
25 logger.debug(f"Skipping endpoint updates for imported wireless link {instance}")
26 return
28 if instance.interface_a.wireless_link != instance:
29 logger.debug(f"Updating interface A for wireless link {instance}")
30 instance.interface_a.wireless_link = instance
31 instance.interface_a.save()
32 if instance.interface_b.wireless_link != instance:
33 logger.debug(f"Updating interface B for wireless link {instance}")
34 instance.interface_b.wireless_link = instance
35 instance.interface_b.save()
37 # Create/update cable paths
38 if created:
39 for interface in (instance.interface_a, instance.interface_b):
40 try:
41 create_cablepaths([interface])
42 except UnsupportedCablePath as e:
43 raise AbortRequest(e)
46@receiver(post_delete, sender=WirelessLink)
47def nullify_connected_interfaces(instance, **kwargs):
48 """
49 When a WirelessLink is deleted, update its two connected Interfaces
50 """
51 logger = logging.getLogger('netbox.wireless.wirelesslink')
53 if instance.interface_a is not None:
54 logger.debug(f"Nullifying interface A for wireless link {instance}")
55 Interface.objects.filter(pk=instance.interface_a.pk).update(wireless_link=None)
56 if instance.interface_b is not None:
57 logger.debug(f"Nullifying interface B for wireless link {instance}")
58 Interface.objects.filter(pk=instance.interface_b.pk).update(wireless_link=None)
60 # Delete and retrace any dependent cable paths
61 for cablepath in CablePath.objects.filter(_nodes__contains=instance):
62 cablepath.delete()