diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 0365dca33..2d100d5a1 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -154,14 +154,14 @@ class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer class CircuitGroupAssignmentSerializer(CircuitGroupAssignmentSerializer_): - circuit = CircuitSerializer(nested=True) + member = CircuitSerializer(nested=True) class Meta: model = CircuitGroupAssignment fields = [ - 'id', 'url', 'display_url', 'display', 'group', 'circuit', 'priority', 'tags', 'created', 'last_updated', + 'id', 'url', 'display_url', 'display', 'group', 'member', 'priority', 'tags', 'created', 'last_updated', ] - brief_fields = ('id', 'url', 'display', 'group', 'circuit', 'priority') + brief_fields = ('id', 'url', 'display', 'group', 'member', 'priority') class VirtualCircuitSerializer(NetBoxModelSerializer): diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index 825df9558..a3a4a3fc6 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -366,22 +366,22 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): label=_('Search'), ) provider_id = django_filters.ModelMultipleChoiceFilter( - field_name='circuit__provider', + field_name='member__provider', queryset=Provider.objects.all(), label=_('Provider (ID)'), ) provider = django_filters.ModelMultipleChoiceFilter( - field_name='circuit__provider__slug', + field_name='member__provider__slug', queryset=Provider.objects.all(), to_field_name='slug', label=_('Provider (slug)'), ) - circuit_id = django_filters.ModelMultipleChoiceFilter( + member_id = django_filters.ModelMultipleChoiceFilter( queryset=Circuit.objects.all(), label=_('Circuit (ID)'), ) - circuit = django_filters.ModelMultipleChoiceFilter( - field_name='circuit__cid', + member = django_filters.ModelMultipleChoiceFilter( + field_name='member__cid', queryset=Circuit.objects.all(), to_field_name='cid', label=_('Circuit (CID)'), @@ -405,7 +405,7 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): if not value.strip(): return queryset return queryset.filter( - Q(circuit__cid__icontains=value) | + Q(member__cid__icontains=value) | Q(group__name__icontains=value) ) diff --git a/netbox/circuits/forms/bulk_edit.py b/netbox/circuits/forms/bulk_edit.py index 021635a1a..b8e6094f9 100644 --- a/netbox/circuits/forms/bulk_edit.py +++ b/netbox/circuits/forms/bulk_edit.py @@ -279,7 +279,7 @@ class CircuitGroupBulkEditForm(NetBoxModelBulkEditForm): class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): - circuit = DynamicModelChoiceField( + member = DynamicModelChoiceField( label=_('Circuit'), queryset=Circuit.objects.all(), required=False @@ -292,7 +292,7 @@ class CircuitGroupAssignmentBulkEditForm(NetBoxModelBulkEditForm): model = CircuitGroupAssignment fieldsets = ( - FieldSet('circuit', 'priority'), + FieldSet('member', 'priority'), ) nullable_fields = ('priority',) diff --git a/netbox/circuits/forms/bulk_import.py b/netbox/circuits/forms/bulk_import.py index 7f5ffde6e..b7e33981c 100644 --- a/netbox/circuits/forms/bulk_import.py +++ b/netbox/circuits/forms/bulk_import.py @@ -182,7 +182,7 @@ class CircuitGroupAssignmentImportForm(NetBoxModelImportForm): class Meta: model = CircuitGroupAssignment - fields = ('circuit', 'group', 'priority') + fields = ('member', 'group', 'priority') class VirtualCircuitImportForm(NetBoxModelImportForm): diff --git a/netbox/circuits/forms/filtersets.py b/netbox/circuits/forms/filtersets.py index 47ce24d97..1359b7a6a 100644 --- a/netbox/circuits/forms/filtersets.py +++ b/netbox/circuits/forms/filtersets.py @@ -277,14 +277,14 @@ class CircuitGroupAssignmentFilterForm(NetBoxModelFilterSetForm): model = CircuitGroupAssignment fieldsets = ( FieldSet('q', 'filter_id', 'tag'), - FieldSet('provider_id', 'circuit_id', 'group_id', 'priority', name=_('Assignment')), + FieldSet('provider_id', 'member_id', 'group_id', 'priority', name=_('Assignment')), ) provider_id = DynamicModelMultipleChoiceField( queryset=Provider.objects.all(), required=False, label=_('Provider') ) - circuit_id = DynamicModelMultipleChoiceField( + member_id = DynamicModelMultipleChoiceField( queryset=Circuit.objects.all(), required=False, label=_('Circuit') diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index e43c37525..d443b1030 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -251,7 +251,7 @@ class CircuitGroupAssignmentForm(NetBoxModelForm): label=_('Group'), queryset=CircuitGroup.objects.all(), ) - circuit = DynamicModelChoiceField( + member = DynamicModelChoiceField( label=_('Circuit'), queryset=Circuit.objects.all(), selector=True @@ -260,7 +260,7 @@ class CircuitGroupAssignmentForm(NetBoxModelForm): class Meta: model = CircuitGroupAssignment fields = [ - 'group', 'circuit', 'priority', 'tags', + 'group', 'member', 'priority', 'tags', ] diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index f2703b207..3aab58393 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -121,7 +121,7 @@ class CircuitGroupType(OrganizationalObjectType): ) class CircuitGroupAssignmentType(TagsMixin, BaseObjectType): group: Annotated["CircuitGroupType", strawberry.lazy('circuits.graphql.types')] - circuit: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')] + member: Annotated["CircuitType", strawberry.lazy('circuits.graphql.types')] @strawberry_django.type( diff --git a/netbox/circuits/migrations/0051_alter_circuitgroupassignment_options_and_more.py b/netbox/circuits/migrations/0051_alter_circuitgroupassignment_options_and_more.py new file mode 100644 index 000000000..d30bc44d7 --- /dev/null +++ b/netbox/circuits/migrations/0051_alter_circuitgroupassignment_options_and_more.py @@ -0,0 +1,32 @@ +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0050_virtual_circuits'), + ('extras', '0122_charfield_null_choices'), + ] + + operations = [ + migrations.AlterModelOptions( + name='circuitgroupassignment', + options={'ordering': ('group', 'member', 'priority', 'pk')}, + ), + migrations.RemoveConstraint( + model_name='circuitgroupassignment', + name='circuits_circuitgroupassignment_unique_circuit_group', + ), + migrations.RenameField( + model_name='circuitgroupassignment', + old_name='circuit', + new_name='member', + ), + migrations.AddConstraint( + model_name='circuitgroupassignment', + constraint=models.UniqueConstraint( + fields=('member', 'group'), + name='circuits_circuitgroupassignment_unique_member_group' + ), + ), + ] diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 5e910b5d5..847f24d57 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -177,15 +177,15 @@ class CircuitGroup(OrganizationalModel): class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, ChangeLoggedModel): """ - Assignment of a Circuit to a CircuitGroup with an optional priority. + Assignment of a physical or virtual circuit to a CircuitGroup with an optional priority. """ - circuit = models.ForeignKey( + member = models.ForeignKey( Circuit, on_delete=models.CASCADE, related_name='assignments' ) group = models.ForeignKey( - CircuitGroup, + to='circuits.CircuitGroup', on_delete=models.CASCADE, related_name='assignments' ) @@ -197,16 +197,15 @@ class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, null=True ) prerequisite_models = ( - 'circuits.Circuit', 'circuits.CircuitGroup', ) class Meta: - ordering = ('group', 'circuit', 'priority', 'pk') + ordering = ('group', 'member', 'priority', 'pk') constraints = ( models.UniqueConstraint( - fields=('circuit', 'group'), - name='%(app_label)s_%(class)s_unique_circuit_group' + fields=('member', 'group'), + name='%(app_label)s_%(class)s_unique_member_group' ), ) verbose_name = _('Circuit group assignment') diff --git a/netbox/circuits/tables/circuits.py b/netbox/circuits/tables/circuits.py index dedb1534b..a02291c58 100644 --- a/netbox/circuits/tables/circuits.py +++ b/netbox/circuits/tables/circuits.py @@ -188,11 +188,11 @@ class CircuitGroupAssignmentTable(NetBoxTable): linkify=True ) provider = tables.Column( - accessor='circuit__provider', + accessor='member__provider', verbose_name=_('Provider'), linkify=True ) - circuit = tables.Column( + member = tables.Column( verbose_name=_('Circuit'), linkify=True ) @@ -206,6 +206,6 @@ class CircuitGroupAssignmentTable(NetBoxTable): class Meta(NetBoxTable.Meta): model = CircuitGroupAssignment fields = ( - 'pk', 'id', 'group', 'provider', 'circuit', 'priority', 'created', 'last_updated', 'actions', 'tags', + 'pk', 'id', 'group', 'provider', 'member', 'priority', 'created', 'last_updated', 'actions', 'tags', ) - default_columns = ('pk', 'group', 'provider', 'circuit', 'priority') + default_columns = ('pk', 'group', 'provider', 'member', 'priority') diff --git a/netbox/circuits/tests/test_api.py b/netbox/circuits/tests/test_api.py index 92fbbdedf..640b865bd 100644 --- a/netbox/circuits/tests/test_api.py +++ b/netbox/circuits/tests/test_api.py @@ -295,7 +295,7 @@ class ProviderAccountTest(APIViewTestCases.APIViewTestCase): class CircuitGroupAssignmentTest(APIViewTestCases.APIViewTestCase): model = CircuitGroupAssignment - brief_fields = ['circuit', 'display', 'group', 'id', 'priority', 'url'] + brief_fields = ['display', 'group', 'id', 'member', 'priority', 'url'] bulk_update_data = { 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, } @@ -330,17 +330,17 @@ class CircuitGroupAssignmentTest(APIViewTestCases.APIViewTestCase): assignments = ( CircuitGroupAssignment( group=circuit_groups[0], - circuit=circuits[0], + member=circuits[0], priority=CircuitPriorityChoices.PRIORITY_PRIMARY ), CircuitGroupAssignment( group=circuit_groups[1], - circuit=circuits[1], + member=circuits[1], priority=CircuitPriorityChoices.PRIORITY_SECONDARY ), CircuitGroupAssignment( group=circuit_groups[2], - circuit=circuits[2], + member=circuits[2], priority=CircuitPriorityChoices.PRIORITY_TERTIARY ), ) @@ -349,17 +349,17 @@ class CircuitGroupAssignmentTest(APIViewTestCases.APIViewTestCase): cls.create_data = [ { 'group': circuit_groups[3].pk, - 'circuit': circuits[3].pk, + 'member': circuits[3].pk, 'priority': CircuitPriorityChoices.PRIORITY_PRIMARY, }, { 'group': circuit_groups[4].pk, - 'circuit': circuits[4].pk, + 'member': circuits[4].pk, 'priority': CircuitPriorityChoices.PRIORITY_SECONDARY, }, { 'group': circuit_groups[5].pk, - 'circuit': circuits[5].pk, + 'member': circuits[5].pk, 'priority': CircuitPriorityChoices.PRIORITY_TERTIARY, }, ] diff --git a/netbox/circuits/tests/test_filtersets.py b/netbox/circuits/tests/test_filtersets.py index 6b7866665..66b2d4b4d 100644 --- a/netbox/circuits/tests/test_filtersets.py +++ b/netbox/circuits/tests/test_filtersets.py @@ -671,17 +671,17 @@ class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): assignments = ( CircuitGroupAssignment( group=circuit_groups[0], - circuit=circuits[0], + member=circuits[0], priority=CircuitPriorityChoices.PRIORITY_PRIMARY ), CircuitGroupAssignment( group=circuit_groups[1], - circuit=circuits[1], + member=circuits[1], priority=CircuitPriorityChoices.PRIORITY_SECONDARY ), CircuitGroupAssignment( group=circuit_groups[2], - circuit=circuits[2], + member=circuits[2], priority=CircuitPriorityChoices.PRIORITY_TERTIARY ), ) @@ -694,11 +694,11 @@ class CircuitGroupAssignmentTestCase(TestCase, ChangeLoggedFilterSetTests): params = {'group': [groups[0].slug, groups[1].slug]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - def test_circuit(self): + def test_member(self): circuits = Circuit.objects.all()[:2] - params = {'circuit_id': [circuits[0].pk, circuits[1].pk]} + params = {'member_id': [circuits[0].pk, circuits[1].pk]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) - params = {'circuit': [circuits[0].cid, circuits[1].cid]} + params = {'member': [circuits[0].cid, circuits[1].cid]} self.assertEqual(self.filterset(params, self.queryset).qs.count(), 2) def test_provider(self): diff --git a/netbox/circuits/tests/test_views.py b/netbox/circuits/tests/test_views.py index 036bebe23..35abbeef7 100644 --- a/netbox/circuits/tests/test_views.py +++ b/netbox/circuits/tests/test_views.py @@ -497,17 +497,17 @@ class CircuitGroupAssignmentTestCase( assignments = ( CircuitGroupAssignment( group=circuit_groups[0], - circuit=circuits[0], + member=circuits[0], priority=CircuitPriorityChoices.PRIORITY_PRIMARY ), CircuitGroupAssignment( group=circuit_groups[1], - circuit=circuits[1], + member=circuits[1], priority=CircuitPriorityChoices.PRIORITY_SECONDARY ), CircuitGroupAssignment( group=circuit_groups[2], - circuit=circuits[2], + member=circuits[2], priority=CircuitPriorityChoices.PRIORITY_TERTIARY ), ) @@ -517,7 +517,7 @@ class CircuitGroupAssignmentTestCase( cls.form_data = { 'group': circuit_groups[3].pk, - 'circuit': circuits[3].pk, + 'member': circuits[3].pk, 'priority': CircuitPriorityChoices.PRIORITY_INACTIVE, 'tags': [t.pk for t in tags], } diff --git a/netbox/templates/circuits/circuitgroupassignment.html b/netbox/templates/circuits/circuitgroupassignment.html index bd277a5fc..f1bb9f5d4 100644 --- a/netbox/templates/circuits/circuitgroupassignment.html +++ b/netbox/templates/circuits/circuitgroupassignment.html @@ -22,9 +22,13 @@ {% trans "Group" %} {{ object.group|linkify }} + + {% trans "Provider" %} + {{ object.member.provider|linkify }} + {% trans "Circuit" %} - {{ object.circuit|linkify }} + {{ object.member|linkify }} {% trans "Priority" %}