From 77d205d65f561c8660ca62baac345187db28223c Mon Sep 17 00:00:00 2001 From: Arthur Date: Mon, 16 Oct 2023 14:11:50 -0700 Subject: [PATCH 1/3] 14033 raise validation error if A and B term go to same object --- netbox/dcim/forms/connections.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/netbox/dcim/forms/connections.py b/netbox/dcim/forms/connections.py index 854c5ebedd4..28677f9773b 100644 --- a/netbox/dcim/forms/connections.py +++ b/netbox/dcim/forms/connections.py @@ -103,4 +103,10 @@ def clean(self): self.instance.a_terminations = self.cleaned_data['a_terminations'] self.instance.b_terminations = self.cleaned_data['b_terminations'] + if a_type == b_type and self.instance.a_terminations and self.instance.b_terminations: + if self.instance.a_terminations.intersection(self.instance.b_terminations): + raise forms.ValidationError( + _("A and B terminations cannot connect to the same object.") + ) + return _CableForm From 002cb3c89623cb011d2791b459354cca77022ea2 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 17 Oct 2023 07:21:14 -0700 Subject: [PATCH 2/3] 14033 move check to cable model clean --- netbox/dcim/forms/connections.py | 6 ------ netbox/dcim/models/cables.py | 6 ++++++ 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/netbox/dcim/forms/connections.py b/netbox/dcim/forms/connections.py index 28677f9773b..854c5ebedd4 100644 --- a/netbox/dcim/forms/connections.py +++ b/netbox/dcim/forms/connections.py @@ -103,10 +103,4 @@ def clean(self): self.instance.a_terminations = self.cleaned_data['a_terminations'] self.instance.b_terminations = self.cleaned_data['b_terminations'] - if a_type == b_type and self.instance.a_terminations and self.instance.b_terminations: - if self.instance.a_terminations.intersection(self.instance.b_terminations): - raise forms.ValidationError( - _("A and B terminations cannot connect to the same object.") - ) - return _CableForm diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 751bca2719e..4283f74a86a 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -180,6 +180,12 @@ def clean(self): if b_type not in COMPATIBLE_TERMINATION_TYPES.get(a_type): raise ValidationError(f"Incompatible termination types: {a_type} and {b_type}") + if a_type == b_type: + if (set(self.a_terminations) & set(self.b_terminations)): + raise ValidationError( + _("A and B terminations cannot connect to the same object.") + ) + # Run clean() on any new CableTerminations for termination in self.a_terminations: CableTermination(cable=self, cable_end='A', termination=termination).clean() From 88078dfb35720de62f70f6b83a904ccb383d332e Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 17 Oct 2023 08:04:52 -0700 Subject: [PATCH 3/3] 14033 fix tests --- netbox/dcim/models/cables.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 4283f74a86a..f240659dd33 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -181,7 +181,12 @@ def clean(self): raise ValidationError(f"Incompatible termination types: {a_type} and {b_type}") if a_type == b_type: - if (set(self.a_terminations) & set(self.b_terminations)): + # can't directly use self.a_terminations here as possible they + # don't have pk yet + a_pks = set(obj.pk for obj in self.a_terminations if obj.pk) + b_pks = set(obj.pk for obj in self.b_terminations if obj.pk) + + if (a_pks & b_pks): raise ValidationError( _("A and B terminations cannot connect to the same object.") )