diff --git a/netbox/core/tests/test_filtersets.py b/netbox/core/tests/test_filtersets.py index e6e52a8b3..8ff104142 100644 --- a/netbox/core/tests/test_filtersets.py +++ b/netbox/core/tests/test_filtersets.py @@ -1,8 +1,6 @@ -from datetime import datetime +from datetime import datetime, timezone from django.test import TestCase -from django.utils import timezone - from utilities.testing import ChangeLoggedFilterSetTests from ..choices import * from ..filtersets import * diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index d1c80d0be..6f84d5f21 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -317,10 +317,14 @@ class CableTermination(ChangeLoggedModel): super().clean() # Check for existing termination - existing_termination = CableTermination.objects.exclude(cable=self.cable).filter( + qs = existing_termination = CableTermination.objects.filter( termination_type=self.termination_type, termination_id=self.termination_id - ).first() + ) + if self.cable.pk: + qs = qs.exclude(cable=self.cable) + + existing_termination = qs.first() if existing_termination is not None: raise ValidationError( f"Duplicate termination found for {self.termination_type.app_label}.{self.termination_type.model} " diff --git a/netbox/dcim/models/devices.py b/netbox/dcim/models/devices.py index 4b9689a22..c2c5e4f29 100644 --- a/netbox/dcim/models/devices.py +++ b/netbox/dcim/models/devices.py @@ -1098,7 +1098,10 @@ class Device( :param if_master: If True, return VC member interfaces only if this Device is the VC master. """ - filter = Q(device=self) + if self.pk: + filter = Q(device=self) + else: + filter = Q() if self.virtual_chassis and (self.virtual_chassis.master == self or not if_master): filter |= Q(device__virtual_chassis=self.virtual_chassis, mgmt_only=False) return Interface.objects.filter(filter) diff --git a/netbox/extras/models/configs.py b/netbox/extras/models/configs.py index 425c1386a..6ea2167c2 100644 --- a/netbox/extras/models/configs.py +++ b/netbox/extras/models/configs.py @@ -182,7 +182,7 @@ class ConfigContextModel(models.Model): if not hasattr(self, 'config_context_data'): # The annotation is not available, so we fall back to manually querying for the config context objects - config_context_data = ConfigContext.objects.get_for_object(self, aggregate_data=True) + config_context_data = ConfigContext.objects.get_for_object(self, aggregate_data=True) or [] else: # The attribute may exist, but the annotated value could be None if there is no config context data config_context_data = self.config_context_data or []