Coverage for wireless/signals.py: 22%

39 statements  

« prev     ^ index     » next       coverage.py v7.15.2, created at 2026-10-10 18:35 +0000

1import logging 

2 

3from django.db.models.signals import post_delete, post_save 

4from django.dispatch import receiver 

5 

6from dcim.exceptions import UnsupportedCablePath 

7from dcim.models import CablePath, Interface 

8from dcim.utils import create_cablepaths 

9from utilities.exceptions import AbortRequest 

10 

11from .models import WirelessLink 

12 

13# 

14# Wireless links 

15# 

16 

17 

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 

27 

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() 

36 

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) 

44 

45 

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') 

52 

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) 

59 

60 # Delete and retrace any dependent cable paths 

61 for cablepath in CablePath.objects.filter(_nodes__contains=instance): 

62 cablepath.delete()