diff --git a/netbox/circuits/migrations/0047_circuittermination__scope.py b/netbox/circuits/migrations/0047_circuittermination__scope.py index 26d28ba74..1fc434e88 100644 --- a/netbox/circuits/migrations/0047_circuittermination__scope.py +++ b/netbox/circuits/migrations/0047_circuittermination__scope.py @@ -15,6 +15,11 @@ def copy_site_assignments(apps, schema_editor): scope_id=models.F('site_id') ) + ProviderNetwork = apps.get_model('circuits', 'ProviderNetwork') + CircuitTermination.objects.filter(provider_network__isnull=False).update( + scope_type=ContentType.objects.get_for_model(ProviderNetwork), + scope_id=models.F('provider_network_id') + ) class Migration(migrations.Migration): @@ -42,11 +47,6 @@ class Migration(migrations.Migration): to='contenttypes.contenttype', ), ), - migrations.RenameField( - model_name='circuittermination', - old_name='provider_network', - new_name='_provider_network', - ), # Copy over existing site assignments migrations.RunPython( diff --git a/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py b/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py index 31b61c8ca..aa9e55d02 100644 --- a/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py +++ b/netbox/circuits/migrations/0048_circuitterminations_cached_relations.py @@ -82,4 +82,9 @@ class Migration(migrations.Migration): model_name='circuittermination', name='site', ), + migrations.RenameField( + model_name='circuittermination', + old_name='provider_network', + new_name='_provider_network', + ), ] diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 6c1427ac7..c90c0bd8a 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -340,10 +340,8 @@ class CircuitTermination( super().clean() # Must define either site *or* provider network - if self.scope is None and self.provider_network is None: + if self.scope is None: raise ValidationError(_("A circuit termination must attach to either a scope or a provider network.")) - if self.scope and self.provider_network: - raise ValidationError(_("A circuit termination cannot attach to both a scope and a provider network.")) def save(self, *args, **kwargs): # Cache objects associated with the terminating object (for filtering) diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 4af58f3c1..008ed3324 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -182,9 +182,9 @@ class CircuitTerminationTest(APIViewTestCases.APIViewTestCase): circuit_terminations = ( CircuitTermination(circuit=circuits[0], term_side=SIDE_A, scope=sites[0]), - CircuitTermination(circuit=circuits[0], term_side=SIDE_Z, provider_network=provider_networks[0]), + CircuitTermination(circuit=circuits[0], term_side=SIDE_Z, scope=provider_networks[0]), CircuitTermination(circuit=circuits[1], term_side=SIDE_A, scope=sites[1]), - CircuitTermination(circuit=circuits[1], term_side=SIDE_Z, provider_network=provider_networks[1]), + CircuitTermination(circuit=circuits[1], term_side=SIDE_Z, scope=provider_networks[1]), ) CircuitTermination.objects.bulk_create(circuit_terminations) @@ -199,7 +199,8 @@ class CircuitTerminationTest(APIViewTestCases.APIViewTestCase): { 'circuit': circuits[2].pk, 'term_side': SIDE_Z, - 'provider_network': provider_networks[0].pk, + 'scope_type': 'circuits.providernetwork', + 'scope_id': provider_networks[0].pk, 'port_speed': 200000, }, ] diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index c7282c192..4e4f2d34c 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -238,9 +238,9 @@ class CircuitTestCase(TestCase, ChangeLoggedFilterSetTests): CircuitTermination(circuit=circuits[0], scope=sites[0], term_side='A'), CircuitTermination(circuit=circuits[1], scope=sites[1], term_side='A'), CircuitTermination(circuit=circuits[2], scope=sites[2], term_side='A'), - CircuitTermination(circuit=circuits[3], provider_network=provider_networks[0], term_side='A'), - CircuitTermination(circuit=circuits[4], provider_network=provider_networks[1], term_side='A'), - CircuitTermination(circuit=circuits[5], provider_network=provider_networks[2], term_side='A'), + CircuitTermination(circuit=circuits[3], scope=provider_networks[0], term_side='A'), + CircuitTermination(circuit=circuits[4], scope=provider_networks[1], term_side='A'), + CircuitTermination(circuit=circuits[5], scope=provider_networks[2], term_side='A'), )) for ct in circuit_terminations: ct.save() @@ -393,10 +393,10 @@ class CircuitTerminationTestCase(TestCase, ChangeLoggedFilterSetTests): CircuitTermination(circuit=circuits[1], scope=sites[2], term_side='Z', port_speed=2000, upstream_speed=2000, xconnect_id='JKL'), CircuitTermination(circuit=circuits[2], scope=sites[2], term_side='A', port_speed=3000, upstream_speed=3000, xconnect_id='MNO'), CircuitTermination(circuit=circuits[2], scope=sites[0], term_side='Z', port_speed=3000, upstream_speed=3000, xconnect_id='PQR'), - CircuitTermination(circuit=circuits[3], provider_network=provider_networks[0], term_side='A'), - CircuitTermination(circuit=circuits[4], provider_network=provider_networks[1], term_side='A'), - CircuitTermination(circuit=circuits[5], provider_network=provider_networks[2], term_side='A'), - CircuitTermination(circuit=circuits[6], provider_network=provider_networks[0], term_side='A', mark_connected=True), + CircuitTermination(circuit=circuits[3], scope=provider_networks[0], term_side='A'), + CircuitTermination(circuit=circuits[4], scope=provider_networks[1], term_side='A'), + CircuitTermination(circuit=circuits[5], scope=provider_networks[2], term_side='A'), + CircuitTermination(circuit=circuits[6], scope=provider_networks[0], term_side='A', mark_connected=True), )) for ct in circuit_terminations: ct.save() diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index fde31e3dd..2438c73a1 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -347,7 +347,7 @@ class ProviderNetworkTestCase(ViewTestCases.PrimaryObjectViewTestCase): } -class CircuitTerminationTestCase(ViewTestCases.PrimaryObjectViewTestCase): +class TestCase(ViewTestCases.PrimaryObjectViewTestCase): model = CircuitTermination @classmethod diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 6eebb05eb..c04df1203 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -158,7 +158,7 @@ class ProviderNetworkView(GetRelatedModelsMixin, generic.ObjectView): instance, extra=( ( - Circuit.objects.restrict(request.user, 'view').filter(terminations__provider_network=instance), + Circuit.objects.restrict(request.user, 'view').filter(terminations___provider_network=instance), 'provider_network_id', ), ), @@ -258,7 +258,7 @@ class CircuitTypeBulkDeleteView(generic.BulkDeleteView): class CircuitListView(generic.ObjectListView): queryset = Circuit.objects.prefetch_related( 'tenant__group', 'termination_a___site', 'termination_z___site', - 'termination_a__provider_network', 'termination_z__provider_network', + 'termination_a___provider_network', 'termination_z___provider_network', ) filterset = filtersets.CircuitFilterSet filterset_form = forms.CircuitFilterForm @@ -299,7 +299,7 @@ class CircuitBulkImportView(generic.BulkImportView): class CircuitBulkEditView(generic.BulkEditView): queryset = Circuit.objects.prefetch_related( 'termination_a___site', 'termination_z___site', - 'termination_a__provider_network', 'termination_z__provider_network', + 'termination_a___provider_network', 'termination_z___provider_network', ) filterset = filtersets.CircuitFilterSet table = tables.CircuitTable @@ -309,7 +309,7 @@ class CircuitBulkEditView(generic.BulkEditView): class CircuitBulkDeleteView(generic.BulkDeleteView): queryset = Circuit.objects.prefetch_related( 'termination_a___site', 'termination_z___site', - 'termination_a__provider_network', 'termination_z__provider_network', + 'termination_a___provider_network', 'termination_z___provider_network', ) filterset = filtersets.CircuitFilterSet table = tables.CircuitTable diff --git a/netbox/dcim/models/cables.py b/netbox/dcim/models/cables.py index 351a53f5c..68360bc18 100644 --- a/netbox/dcim/models/cables.py +++ b/netbox/dcim/models/cables.py @@ -344,7 +344,7 @@ class CableTermination(ChangeLoggedModel): ) # A CircuitTermination attached to a ProviderNetwork cannot have a Cable - if self.termination_type.model == 'circuittermination' and self.termination.provider_network is not None: + if self.termination_type.model == 'circuittermination' and self.termination._provider_network is not None: raise ValidationError(_("Circuit terminations attached to a provider network may not be cabled.")) def save(self, *args, **kwargs): @@ -690,11 +690,11 @@ class CablePath(models.Model): ).first() if circuit_termination is None: break - elif circuit_termination.provider_network: + elif circuit_termination._provider_network: # Circuit terminates to a ProviderNetwork path.extend([ [object_to_path_node(circuit_termination)], - [object_to_path_node(circuit_termination.provider_network)], + [object_to_path_node(circuit_termination._provider_network)], ]) is_complete = True break diff --git a/netbox/dcim/tests/test_cablepaths.py b/netbox/dcim/tests/test_cablepaths.py index c800c16d2..985030725 100644 --- a/netbox/dcim/tests/test_cablepaths.py +++ b/netbox/dcim/tests/test_cablepaths.py @@ -1366,7 +1366,7 @@ class CablePathTestCase(TestCase): interface1 = Interface.objects.create(device=self.device, name='Interface 1') providernetwork = ProviderNetwork.objects.create(name='Provider Network 1', provider=self.circuit.provider) circuittermination1 = CircuitTermination.objects.create(circuit=self.circuit, scope=self.site, term_side='A') - circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, provider_network=providernetwork, term_side='Z') + circuittermination2 = CircuitTermination.objects.create(circuit=self.circuit, scope=providernetwork, term_side='Z') # Create cable 1 cable1 = Cable( diff --git a/netbox/dcim/tests/test_models.py b/netbox/dcim/tests/test_models.py index a6243540e..4886bb255 100644 --- a/netbox/dcim/tests/test_models.py +++ b/netbox/dcim/tests/test_models.py @@ -764,7 +764,7 @@ class CableTestCase(TestCase): circuit2 = Circuit.objects.create(provider=provider, type=circuittype, cid='2') CircuitTermination.objects.create(circuit=circuit1, scope=site, term_side='A') CircuitTermination.objects.create(circuit=circuit1, scope=site, term_side='Z') - CircuitTermination.objects.create(circuit=circuit2, provider_network=provider_network, term_side='A') + CircuitTermination.objects.create(circuit=circuit2, scope=provider_network, term_side='A') def test_cable_creation(self): """