diff --git a/netbox/circuits/api/serializers_/circuits.py b/netbox/circuits/api/serializers_/circuits.py index 7010bb2c6..a186b761c 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, CircuitTermination, CircuitType +from circuits.models import Circuit, CircuitRedundancyGroup, 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', + 'CircuitRedundancyGroupSerializer', 'CircuitTerminationSerializer', 'CircuitTypeSerializer', ) @@ -75,3 +76,14 @@ class CircuitTerminationSerializer(NetBoxModelSerializer, CabledObjectSerializer 'link_peers', 'link_peers_type', 'tags', 'custom_fields', 'created', 'last_updated', '_occupied', ] brief_fields = ('id', 'url', 'display', 'circuit', 'term_side', 'description', 'cable', '_occupied') + + +class CircuitRedundancyGroupSerializer(NetBoxModelSerializer): + + class Meta: + model = CircuitRedundancyGroup + fields = [ + 'id', 'url', 'display_url', 'display', 'name', + 'tags', 'custom_fields', 'created', 'last_updated', + ] + brief_fields = ('id', 'url', 'display', 'name',) diff --git a/netbox/circuits/api/urls.py b/netbox/circuits/api/urls.py index fcb7a1a51..bcac98bb5 100644 --- a/netbox/circuits/api/urls.py +++ b/netbox/circuits/api/urls.py @@ -14,6 +14,7 @@ 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.CircuitRedundancyGroupViewSet) app_name = 'circuits-api' urlpatterns = router.urls diff --git a/netbox/circuits/api/views.py b/netbox/circuits/api/views.py index fffb59a57..44630a8b6 100644 --- a/netbox/circuits/api/views.py +++ b/netbox/circuits/api/views.py @@ -55,6 +55,16 @@ class CircuitTerminationViewSet(PassThroughPortMixin, NetBoxModelViewSet): filterset_class = filtersets.CircuitTerminationFilterSet +# +# Circuits +# + +class CircuitRedundancyGroupViewSet(NetBoxModelViewSet): + queryset = CircuitRedundancyGroup.objects.all() + serializer_class = serializers.CircuitRedundancyGroupSerializer + filterset_class = filtersets.CircuitRedundancyGroupFilterSet + + # # Provider accounts # diff --git a/netbox/circuits/graphql/filters.py b/netbox/circuits/graphql/filters.py index 10887ce3f..445d3a948 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', + 'CircuitRedundancyGroupFilter', 'CircuitTypeFilter', 'ProviderFilter', 'ProviderAccountFilter', @@ -32,6 +33,12 @@ class CircuitTypeFilter(BaseFilterMixin): pass +@strawberry_django.filter(models.CircuitRedundancyGroup, lookups=True) +@autotype_decorator(filtersets.CircuitRedundancyGroupFilterSet) +class CircuitRedundancyGroupFilter(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 ac8626cc5..3980de745 100644 --- a/netbox/circuits/graphql/schema.py +++ b/netbox/circuits/graphql/schema.py @@ -24,6 +24,11 @@ class CircuitsQuery: return models.CircuitType.objects.get(pk=id) circuit_type_list: List[CircuitTypeType] = strawberry_django.field() + @strawberry.field + def circuit_redundancy_group(self, id: int) -> CircuitRedundancyGroupType: + return models.CircuitRedundancyGroup.objects.get(pk=id) + circuit_redundancy_group_list: List[CircuitRedundancyGroupType] = strawberry_django.field() + @strawberry.field def provider(self, id: int) -> ProviderType: return models.Provider.objects.get(pk=id) diff --git a/netbox/circuits/graphql/types.py b/netbox/circuits/graphql/types.py index bae91e6b0..da614c88e 100644 --- a/netbox/circuits/graphql/types.py +++ b/netbox/circuits/graphql/types.py @@ -13,6 +13,7 @@ from .filters import * __all__ = ( 'CircuitTerminationType', 'CircuitType', + 'CircuitRedundancyGroupType', 'CircuitTypeType', 'ProviderType', 'ProviderAccountType', @@ -91,3 +92,12 @@ class CircuitType(NetBoxObjectType, ContactsMixin): tenant: TenantType | None terminations: List[CircuitTerminationType] + + +@strawberry_django.type( + models.CircuitRedundancyGroup, + fields='__all__', + filters=CircuitRedundancyGroupFilter +) +class CircuitRedundancyGroupType(CustomFieldsMixin, TagsMixin, ObjectType): + pass diff --git a/netbox/circuits/migrations/0044_circuitgroupassignment_circuitredundancygroup_and_more.py b/netbox/circuits/migrations/0044_circuitgroupassignment_circuitredundancygroup_and_more.py new file mode 100644 index 000000000..b094c8c95 --- /dev/null +++ b/netbox/circuits/migrations/0044_circuitgroupassignment_circuitredundancygroup_and_more.py @@ -0,0 +1,53 @@ +# Generated by Django 5.0.7 on 2024-07-16 09:18 + +import django.db.models.deletion +import taggit.managers +import utilities.json +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ('circuits', '0043_circuittype_color'), + ('extras', '0118_notifications'), + ] + + operations = [ + migrations.CreateModel( + name='CircuitGroupAssignment', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('priority', models.CharField(blank=True, max_length=50)), + ('circuit', models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='circuits.circuit')), + ], + ), + migrations.CreateModel( + name='CircuitRedundancyGroup', + fields=[ + ('id', models.BigAutoField(auto_created=True, primary_key=True, serialize=False)), + ('created', models.DateTimeField(auto_now_add=True, null=True)), + ('last_updated', models.DateTimeField(auto_now=True, null=True)), + ( + 'custom_field_data', + models.JSONField(blank=True, default=dict, encoder=utilities.json.CustomFieldJSONEncoder), + ), + ('description', models.CharField(blank=True, max_length=200)), + ('comments', models.TextField(blank=True)), + ('name', models.CharField(max_length=100)), + ('slug', models.SlugField(max_length=100)), + ('circuits', models.ManyToManyField(through='circuits.CircuitGroupAssignment', to='circuits.circuit')), + ('tags', taggit.managers.TaggableManager(through='extras.TaggedItem', to='extras.Tag')), + ], + options={ + 'verbose_name': 'Circuit redundancy group', + 'verbose_name_plural': 'Circuit redundancy group', + 'ordering': ('name', 'pk'), + }, + ), + migrations.AddField( + model_name='circuitgroupassignment', + name='group', + field=models.ForeignKey(on_delete=django.db.models.deletion.CASCADE, to='circuits.circuitredundancygroup'), + ), + ]