diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index df9dd4566..c6cdab211 100644 --- a/netbox/circuits/api/serializers_/circuits.py +++ b/netbox/circuits/api/serializers_/circuits.py @@ -1,7 +1,7 @@ from rest_framework import serializers -from circuits.choices import CircuitStatusChoices -from circuits.models import Circuit, CircuitGroup, CircuitTermination, CircuitType +from circuits.choices import CircuitPriorityChoices, CircuitStatusChoices +from circuits.models import Circuit, CircuitGroup, CircuitGroupAssignment, CircuitTermination, CircuitType from dcim.api.serializers_.cables import CabledObjectSerializer from dcim.api.serializers_.sites import SiteSerializer from netbox.api.fields import ChoiceField, RelatedObjectCountField @@ -12,6 +12,7 @@ from .providers import ProviderAccountSerializer, ProviderNetworkSerializer, Pro __all__ = ( 'CircuitSerializer', + 'CircuitGroupAssignmentSerializer', 'CircuitGroupSerializer', 'CircuitTerminationSerializer', 'CircuitTypeSerializer', @@ -87,3 +88,17 @@ class CircuitGroupSerializer(NetBoxModelSerializer): 'tags', 'custom_fields', 'created', 'last_updated', ] brief_fields = ('id', 'url', 'display', 'name',) + + +class CircuitGroupAssignmentSerializer(NetBoxModelSerializer): + group = CircuitGroupSerializer(nested=True) + circuit = CircuitSerializer(nested=True) + priority = ChoiceField(choices=CircuitPriorityChoices, allow_blank=True, required=False, default=lambda: '') + + class Meta: + model = CircuitGroupAssignment + fields = [ + 'id', 'url', 'display_url', 'display', 'group', 'circuit', 'priority', + 'tags', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'group', 'circuit', 'priority') diff --git a/netbox/circuits/api/urls.py b/netbox/circuits/api/urls.py index 4b6de7a1f..00af3dec6 100644 --- a/netbox/circuits/api/urls.py +++ b/netbox/circuits/api/urls.py @@ -14,7 +14,8 @@ router.register('provider-networks', views.ProviderNetworkViewSet) router.register('circuit-types', views.CircuitTypeViewSet) router.register('circuits', views.CircuitViewSet) router.register('circuit-terminations', views.CircuitTerminationViewSet) -router.register('circuit-redundancy-groups', views.CircuitGroupViewSet) +router.register('circuit-groups', views.CircuitGroupViewSet) +router.register('circuit-group-assignments', views.CircuitGroupAssignmentViewSet) app_name = 'circuits-api' urlpatterns = router.urls diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index 80caa6fcd..8cce013d7 100644 --- a/netbox/circuits/api/views.py +++ b/netbox/circuits/api/views.py @@ -56,7 +56,7 @@ class CircuitTerminationViewSet(PassThroughPortMixin, NetBoxModelViewSet): # -# Circuits +# Circuit Groups # class CircuitGroupViewSet(NetBoxModelViewSet): @@ -65,6 +65,16 @@ class CircuitGroupViewSet(NetBoxModelViewSet): filterset_class = filtersets.CircuitGroupFilterSet +# +# Circuit Group Assignments +# + +class CircuitGroupAssignmentViewSet(NetBoxModelViewSet): + queryset = CircuitGroupAssignment.objects.all() + serializer_class = serializers.CircuitGroupAssignmentSerializer + filterset_class = filtersets.CircuitGroupAssignmentFilterSet + + # # Provider accounts # diff --git a/netbox/circuits/filtersets.py b/netbox/circuits/filtersets.py index e22d864f9..dc3a1cc55 100644 --- a/netbox/circuits/filtersets.py +++ b/netbox/circuits/filtersets.py @@ -335,6 +335,12 @@ class CircuitGroupAssignmentFilterSet(NetBoxModelFilterSet): queryset=CircuitGroup.objects.all(), label=_('Circuit group (ID)'), ) + group = django_filters.ModelMultipleChoiceFilter( + field_name='group__slug', + queryset=CircuitGroup.objects.all(), + to_field_name='slug', + label=_('Circuit group (slug)'), + ) class Meta: model = CircuitGroupAssignment diff --git a/netbox/circuits/forms/model_forms.py b/netbox/circuits/forms/model_forms.py index 538148421..0efbf90cf 100644 --- a/netbox/circuits/forms/model_forms.py +++ b/netbox/circuits/forms/model_forms.py @@ -190,7 +190,6 @@ class CircuitGroupAssignmentForm(NetBoxModelForm): group = DynamicModelChoiceField( label=_('Group'), queryset=CircuitGroup.objects.all(), - required=False, initial_params={ 'groups': '$group' } @@ -198,7 +197,6 @@ class CircuitGroupAssignmentForm(NetBoxModelForm): circuit = DynamicModelChoiceField( label=_('Circuit'), queryset=Circuit.objects.all(), - required=False, initial_params={ 'circuits': '$circuit' } diff --git a/netbox/circuits/graphql/filters.py b/netbox/circuits/graphql/filters.py index b1803e0df..3ded6e681 100644 --- a/netbox/circuits/graphql/filters.py +++ b/netbox/circuits/graphql/filters.py @@ -7,6 +7,7 @@ from netbox.graphql.filter_mixins import autotype_decorator, BaseFilterMixin __all__ = ( 'CircuitTerminationFilter', 'CircuitFilter', + 'CircuitGroupAssignmentFilter', 'CircuitGroupFilter', 'CircuitTypeFilter', 'ProviderFilter', @@ -39,6 +40,12 @@ class CircuitGroupFilter(BaseFilterMixin): pass +@strawberry_django.filter(models.CircuitGroupAssignment, lookups=True) +@autotype_decorator(filtersets.CircuitGroupAssignmentFilterSet) +class CircuitGroupAssignmentFilter(BaseFilterMixin): + pass + + @strawberry_django.filter(models.Provider, lookups=True) @autotype_decorator(filtersets.ProviderFilterSet) class ProviderFilter(BaseFilterMixin): diff --git a/netbox/circuits/graphql/schema.py b/netbox/circuits/graphql/schema.py index 18657b965..58a9879af 100644 --- a/netbox/circuits/graphql/schema.py +++ b/netbox/circuits/graphql/schema.py @@ -25,9 +25,14 @@ class CircuitsQuery: circuit_type_list: List[CircuitTypeType] = strawberry_django.field() @strawberry.field - def circuit_redundancy_group(self, id: int) -> CircuitGroupType: + def circuit_group(self, id: int) -> CircuitGroupType: return models.CircuitGroup.objects.get(pk=id) - circuit_redundancy_group_list: List[CircuitGroupType] = strawberry_django.field() + circuit_group_list: List[CircuitGroupType] = strawberry_django.field() + + @strawberry.field + def circuit_group_assignment(self, id: int) -> CircuitGroupAssignmentType: + return models.CircuitGroupAssignment.objects.get(pk=id) + circuit_group_assignment_list: List[CircuitGroupAssignmentType] = strawberry_django.field() @strawberry.field def provider(self, id: int) -> ProviderType: diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index d80c84a15..b82663859 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -13,6 +13,7 @@ from .filters import * __all__ = ( 'CircuitTerminationType', 'CircuitType', + 'CircuitGroupAssignmentType', 'CircuitGroupType', 'CircuitTypeType', 'ProviderType', @@ -101,3 +102,12 @@ class CircuitType(NetBoxObjectType, ContactsMixin): ) class CircuitGroupType(CustomFieldsMixin, TagsMixin, ObjectType): pass + + +@strawberry_django.type( + models.CircuitGroupAssignment, + fields='__all__', + filters=CircuitGroupAssignmentFilter +) +class CircuitGroupAssignmentType(TagsMixin, ObjectType): + pass diff --git a/netbox/circuits/models/circuits.py b/netbox/circuits/models/circuits.py index 305edb070..49b613f69 100644 --- a/netbox/circuits/models/circuits.py +++ b/netbox/circuits/models/circuits.py @@ -178,6 +178,9 @@ class CircuitGroup(PrimaryModel): verbose_name = _('Circuit group') verbose_name_plural = _('Circuit group') + def __str__(self): + return self.name + def get_absolute_url(self): return reverse('circuits:circuitgroup', args=[self.pk]) @@ -198,6 +201,10 @@ class CircuitGroupAssignment(CustomFieldsMixin, ExportTemplatesMixin, TagsMixin, choices=CircuitPriorityChoices, blank=True ) + prerequisite_models = ( + 'circuits.Circuit', + 'circuits.CircuitGroup', + ) class Meta: ordering = ('circuit', 'priority', 'pk') diff --git a/netbox/circuits/views.py b/netbox/circuits/views.py index 925bb2fbd..161cf5435 100644 --- a/netbox/circuits/views.py +++ b/netbox/circuits/views.py @@ -498,18 +498,18 @@ class CircuitGroupAssignmentListView(generic.ObjectListView): table = tables.CircuitGroupAssignmentTable -@register_model_view(CircuitGroup) +@register_model_view(CircuitGroupAssignment) class CircuitGroupAssignmentView(generic.ObjectView): queryset = CircuitGroupAssignment.objects.all() -@register_model_view(CircuitGroup, 'edit') +@register_model_view(CircuitGroupAssignment, 'edit') class CircuitGroupAssignmentEditView(generic.ObjectEditView): queryset = CircuitGroupAssignment.objects.all() form = forms.CircuitGroupAssignmentForm -@register_model_view(CircuitGroup, 'delete') +@register_model_view(CircuitGroupAssignment, 'delete') class CircuitGroupAssignmentDeleteView(generic.ObjectDeleteView): queryset = CircuitGroupAssignment.objects.all() diff --git a/netbox/templates/circuits/circuitgroup.html b/netbox/templates/circuits/circuitgroup.html index 65556d1cf..e5185dd74 100644 --- a/netbox/templates/circuits/circuitgroup.html +++ b/netbox/templates/circuits/circuitgroup.html @@ -41,13 +41,4 @@ {% plugin_right_page object %} -
{% trans "Group" %} | +{{ object.group }} | +
---|---|
{% trans "Circuit" %} | +{{ object.circuit }} | +
{% trans "Priority" %} | +{{ object.priority }} | +