fix(wireless): Correct attribute check in WirelessLink signal handler

Fix typo in post_save signal checking `interface_b.cable` instead of
`interface_b.wireless_link`, preventing unnecessary re-saves.
Add regression test verifying interfaces aren't logged on link re-save.

Fixes #22183
This commit is contained in:
Martin Hauser 2026-05-13 19:39:21 +02:00 committed by Jeremy Stretch
parent f66e6f360a
commit 8c67d2449a
2 changed files with 62 additions and 1 deletions

View File

@ -29,7 +29,7 @@ def update_connected_interfaces(instance, created, raw=False, **kwargs):
logger.debug(f"Updating interface A for wireless link {instance}")
instance.interface_a.wireless_link = instance
instance.interface_a.save()
if instance.interface_b.cable != instance:
if instance.interface_b.wireless_link != instance:
logger.debug(f"Updating interface B for wireless link {instance}")
instance.interface_b.wireless_link = instance
instance.interface_b.save()

View File

@ -0,0 +1,61 @@
from uuid import uuid4
from django.contrib.contenttypes.models import ContentType
from django.test import RequestFactory, TestCase
from core.models import ObjectChange
from dcim.choices import InterfaceTypeChoices
from dcim.models import Interface
from netbox.context_managers import event_tracking
from users.models import User
from utilities.testing import create_test_device
from wireless.models import WirelessLink
class WirelessLinkTestCase(TestCase):
@classmethod
def setUpTestData(cls):
cls.device = create_test_device('Device 1')
cls.user = User.objects.create_user(username='testuser')
def test_resaving_wireless_link_does_not_log_connected_interfaces(self):
interface_a = Interface.objects.create(
device=self.device,
name='radio0',
type=InterfaceTypeChoices.TYPE_80211AC,
)
interface_b = Interface.objects.create(
device=self.device,
name='radio1',
type=InterfaceTypeChoices.TYPE_80211AC,
)
wireless_link = WirelessLink.objects.create(
interface_a=interface_a,
interface_b=interface_b,
ssid='LINK1',
)
interface_a.refresh_from_db()
interface_b.refresh_from_db()
self.assertEqual(interface_a.wireless_link, wireless_link)
self.assertEqual(interface_b.wireless_link, wireless_link)
# Reload the WirelessLink to avoid relying on FK objects cached during creation.
wireless_link = WirelessLink.objects.get(pk=wireless_link.pk)
request = RequestFactory().post('/')
request.id = uuid4()
request.user = self.user
with event_tracking(request):
wireless_link.snapshot()
wireless_link.save()
interface_type = ContentType.objects.get_for_model(Interface)
self.assertFalse(
ObjectChange.objects.filter(
changed_object_type=interface_type,
changed_object_id__in=(interface_a.pk, interface_b.pk),
).exists()
)