From 8dcd3eda28981360aefe778a05ca9149a2812e44 Mon Sep 17 00:00:00 2001 From: Arthur Date: Tue, 24 Jan 2023 15:56:49 -0800 Subject: [PATCH] 9608 update yasg -> spectacular --- netbox/dcim/api/serializers.py | 2 ++ netbox/dcim/filtersets.py | 2 ++ netbox/ipam/api/views.py | 1 + netbox/netbox/api/serializers/base.py | 3 +++ netbox/netbox/settings.py | 4 ++++ netbox/users/api/nested_serializers.py | 2 ++ netbox/users/api/serializers.py | 3 +++ netbox/utilities/filters.py | 10 ++++++++++ 8 files changed, 27 insertions(+) diff --git a/netbox/dcim/api/serializers.py b/netbox/dcim/api/serializers.py index 60fb5ed74..25935e302 100644 --- a/netbox/dcim/api/serializers.py +++ b/netbox/dcim/api/serializers.py @@ -3,6 +3,7 @@ import decimal from django.contrib.contenttypes.models import ContentType from django.utils.translation import gettext as _ from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from rest_framework import serializers from timezone_field.rest_framework import TimeZoneSerializerField @@ -231,6 +232,7 @@ class RackUnitSerializer(serializers.Serializer): occupied = serializers.BooleanField(read_only=True) display = serializers.SerializerMethodField(read_only=True) + @extend_schema_field(OpenApiTypes.STR) def get_display(self, obj): return obj['name'] diff --git a/netbox/dcim/filtersets.py b/netbox/dcim/filtersets.py index 83ae8bcc9..c521e1d52 100644 --- a/netbox/dcim/filtersets.py +++ b/netbox/dcim/filtersets.py @@ -1,6 +1,8 @@ import django_filters from django.contrib.auth.models import User from django.utils.translation import gettext as _ +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from extras.filtersets import LocalConfigContextFilterSet from ipam.models import ASN, L2VPN, IPAddress, VRF diff --git a/netbox/ipam/api/views.py b/netbox/ipam/api/views.py index fd80e0c6f..2f4207091 100644 --- a/netbox/ipam/api/views.py +++ b/netbox/ipam/api/views.py @@ -367,6 +367,7 @@ class IPRangeAvailableIPAddressesView(AvailableIPAddressesView): class AvailableVLANsView(ObjectValidationMixin, APIView): queryset = VLAN.objects.all() + filterset_class = serializers.VLANSerializer # for drf-spectacular @extend_schema(methods=["get"], responses={200: serializers.AvailableVLANSerializer(many=True)}) def get(self, request, pk): diff --git a/netbox/netbox/api/serializers/base.py b/netbox/netbox/api/serializers/base.py index f1aea0e2b..5ee74bf8c 100644 --- a/netbox/netbox/api/serializers/base.py +++ b/netbox/netbox/api/serializers/base.py @@ -1,5 +1,7 @@ from django.db.models import ManyToManyField from rest_framework import serializers +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes __all__ = ( 'BaseModelSerializer', @@ -10,6 +12,7 @@ __all__ = ( class BaseModelSerializer(serializers.ModelSerializer): display = serializers.SerializerMethodField(read_only=True) + @extend_schema_field(OpenApiTypes.STR) def get_display(self, obj): return str(obj) diff --git a/netbox/netbox/settings.py b/netbox/netbox/settings.py index 3d2cf368d..fe2b5cf38 100644 --- a/netbox/netbox/settings.py +++ b/netbox/netbox/settings.py @@ -574,6 +574,10 @@ REST_FRAMEWORK = { # SPECTACULAR_SETTINGS = { + "TITLE": "NetBox API", + "DESCRIPTION": "API to access NetBox", + "LICENSE": {"name": "Apache v2 License"}, + "VERSION": VERSION, } # diff --git a/netbox/users/api/nested_serializers.py b/netbox/users/api/nested_serializers.py index d1252f89b..3510184ae 100644 --- a/netbox/users/api/nested_serializers.py +++ b/netbox/users/api/nested_serializers.py @@ -1,6 +1,7 @@ from django.contrib.auth.models import Group, User from django.contrib.contenttypes.models import ContentType from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from rest_framework import serializers from netbox.api.fields import ContentTypeField @@ -30,6 +31,7 @@ class NestedUserSerializer(WritableNestedSerializer): model = User fields = ['id', 'url', 'display', 'username'] + @extend_schema_field(OpenApiTypes.STR) def get_display(self, obj): if full_name := obj.get_full_name(): return f"{obj.username} ({full_name})" diff --git a/netbox/users/api/serializers.py b/netbox/users/api/serializers.py index f1f1fc975..1f3a75b10 100644 --- a/netbox/users/api/serializers.py +++ b/netbox/users/api/serializers.py @@ -1,6 +1,8 @@ from django.conf import settings from django.contrib.auth.models import Group, User from django.contrib.contenttypes.models import ContentType +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes from rest_framework import serializers from netbox.api.fields import ContentTypeField, IPNetworkSerializer, SerializedPKRelatedField @@ -47,6 +49,7 @@ class UserSerializer(ValidatedModelSerializer): return user + @extend_schema_field(OpenApiTypes.STR) def get_display(self, obj): if full_name := obj.get_full_name(): return f"{obj.username} ({full_name})" diff --git a/netbox/utilities/filters.py b/netbox/utilities/filters.py index 76ff8192c..cfe21063b 100644 --- a/netbox/utilities/filters.py +++ b/netbox/utilities/filters.py @@ -3,6 +3,8 @@ from django import forms from django.conf import settings from django.core.exceptions import ValidationError from django_filters.constants import EMPTY_VALUES +from drf_spectacular.utils import extend_schema_field +from drf_spectacular.types import OpenApiTypes def multivalue_field_factory(field_class): @@ -37,26 +39,32 @@ def multivalue_field_factory(field_class): # Filters # +@extend_schema_field(OpenApiTypes.STR) class MultiValueCharFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.CharField) +@extend_schema_field(OpenApiTypes.DATE) class MultiValueDateFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.DateField) +@extend_schema_field(OpenApiTypes.DATETIME) class MultiValueDateTimeFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.DateTimeField) +@extend_schema_field(OpenApiTypes.INT32) class MultiValueNumberFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.IntegerField) +@extend_schema_field(OpenApiTypes.DECIMAL) class MultiValueDecimalFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.DecimalField) +@extend_schema_field(OpenApiTypes.TIME) class MultiValueTimeFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.TimeField) @@ -65,6 +73,7 @@ class MACAddressFilter(django_filters.CharFilter): pass +@extend_schema_field(OpenApiTypes.STR) class MultiValueMACAddressFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.CharField) @@ -75,6 +84,7 @@ class MultiValueMACAddressFilter(django_filters.MultipleChoiceFilter): return qs.none() +@extend_schema_field(OpenApiTypes.STR) class MultiValueWWNFilter(django_filters.MultipleChoiceFilter): field_class = multivalue_field_factory(forms.CharField)