9608 update yasg -> spectacular

This commit is contained in:
Arthur 2023-01-24 15:56:49 -08:00
parent a949de8d5f
commit 8dcd3eda28
8 changed files with 27 additions and 0 deletions

View File

@ -3,6 +3,7 @@ import decimal
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from django.utils.translation import gettext as _ from django.utils.translation import gettext as _
from drf_spectacular.utils import extend_schema_field from drf_spectacular.utils import extend_schema_field
from drf_spectacular.types import OpenApiTypes
from rest_framework import serializers from rest_framework import serializers
from timezone_field.rest_framework import TimeZoneSerializerField from timezone_field.rest_framework import TimeZoneSerializerField
@ -231,6 +232,7 @@ class RackUnitSerializer(serializers.Serializer):
occupied = serializers.BooleanField(read_only=True) occupied = serializers.BooleanField(read_only=True)
display = serializers.SerializerMethodField(read_only=True) display = serializers.SerializerMethodField(read_only=True)
@extend_schema_field(OpenApiTypes.STR)
def get_display(self, obj): def get_display(self, obj):
return obj['name'] return obj['name']

View File

@ -1,6 +1,8 @@
import django_filters import django_filters
from django.contrib.auth.models import User from django.contrib.auth.models import User
from django.utils.translation import gettext as _ 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 extras.filtersets import LocalConfigContextFilterSet
from ipam.models import ASN, L2VPN, IPAddress, VRF from ipam.models import ASN, L2VPN, IPAddress, VRF

View File

@ -367,6 +367,7 @@ class IPRangeAvailableIPAddressesView(AvailableIPAddressesView):
class AvailableVLANsView(ObjectValidationMixin, APIView): class AvailableVLANsView(ObjectValidationMixin, APIView):
queryset = VLAN.objects.all() queryset = VLAN.objects.all()
filterset_class = serializers.VLANSerializer # for drf-spectacular
@extend_schema(methods=["get"], responses={200: serializers.AvailableVLANSerializer(many=True)}) @extend_schema(methods=["get"], responses={200: serializers.AvailableVLANSerializer(many=True)})
def get(self, request, pk): def get(self, request, pk):

View File

@ -1,5 +1,7 @@
from django.db.models import ManyToManyField from django.db.models import ManyToManyField
from rest_framework import serializers from rest_framework import serializers
from drf_spectacular.utils import extend_schema_field
from drf_spectacular.types import OpenApiTypes
__all__ = ( __all__ = (
'BaseModelSerializer', 'BaseModelSerializer',
@ -10,6 +12,7 @@ __all__ = (
class BaseModelSerializer(serializers.ModelSerializer): class BaseModelSerializer(serializers.ModelSerializer):
display = serializers.SerializerMethodField(read_only=True) display = serializers.SerializerMethodField(read_only=True)
@extend_schema_field(OpenApiTypes.STR)
def get_display(self, obj): def get_display(self, obj):
return str(obj) return str(obj)

View File

@ -574,6 +574,10 @@ REST_FRAMEWORK = {
# #
SPECTACULAR_SETTINGS = { SPECTACULAR_SETTINGS = {
"TITLE": "NetBox API",
"DESCRIPTION": "API to access NetBox",
"LICENSE": {"name": "Apache v2 License"},
"VERSION": VERSION,
} }
# #

View File

@ -1,6 +1,7 @@
from django.contrib.auth.models import Group, User from django.contrib.auth.models import Group, User
from django.contrib.contenttypes.models import ContentType from django.contrib.contenttypes.models import ContentType
from drf_spectacular.utils import extend_schema_field from drf_spectacular.utils import extend_schema_field
from drf_spectacular.types import OpenApiTypes
from rest_framework import serializers from rest_framework import serializers
from netbox.api.fields import ContentTypeField from netbox.api.fields import ContentTypeField
@ -30,6 +31,7 @@ class NestedUserSerializer(WritableNestedSerializer):
model = User model = User
fields = ['id', 'url', 'display', 'username'] fields = ['id', 'url', 'display', 'username']
@extend_schema_field(OpenApiTypes.STR)
def get_display(self, obj): def get_display(self, obj):
if full_name := obj.get_full_name(): if full_name := obj.get_full_name():
return f"{obj.username} ({full_name})" return f"{obj.username} ({full_name})"

View File

@ -1,6 +1,8 @@
from django.conf import settings from django.conf import settings
from django.contrib.auth.models import Group, User from django.contrib.auth.models import Group, User
from django.contrib.contenttypes.models import ContentType 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 rest_framework import serializers
from netbox.api.fields import ContentTypeField, IPNetworkSerializer, SerializedPKRelatedField from netbox.api.fields import ContentTypeField, IPNetworkSerializer, SerializedPKRelatedField
@ -47,6 +49,7 @@ class UserSerializer(ValidatedModelSerializer):
return user return user
@extend_schema_field(OpenApiTypes.STR)
def get_display(self, obj): def get_display(self, obj):
if full_name := obj.get_full_name(): if full_name := obj.get_full_name():
return f"{obj.username} ({full_name})" return f"{obj.username} ({full_name})"

View File

@ -3,6 +3,8 @@ from django import forms
from django.conf import settings from django.conf import settings
from django.core.exceptions import ValidationError from django.core.exceptions import ValidationError
from django_filters.constants import EMPTY_VALUES 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): def multivalue_field_factory(field_class):
@ -37,26 +39,32 @@ def multivalue_field_factory(field_class):
# Filters # Filters
# #
@extend_schema_field(OpenApiTypes.STR)
class MultiValueCharFilter(django_filters.MultipleChoiceFilter): class MultiValueCharFilter(django_filters.MultipleChoiceFilter):
field_class = multivalue_field_factory(forms.CharField) field_class = multivalue_field_factory(forms.CharField)
@extend_schema_field(OpenApiTypes.DATE)
class MultiValueDateFilter(django_filters.MultipleChoiceFilter): class MultiValueDateFilter(django_filters.MultipleChoiceFilter):
field_class = multivalue_field_factory(forms.DateField) field_class = multivalue_field_factory(forms.DateField)
@extend_schema_field(OpenApiTypes.DATETIME)
class MultiValueDateTimeFilter(django_filters.MultipleChoiceFilter): class MultiValueDateTimeFilter(django_filters.MultipleChoiceFilter):
field_class = multivalue_field_factory(forms.DateTimeField) field_class = multivalue_field_factory(forms.DateTimeField)
@extend_schema_field(OpenApiTypes.INT32)
class MultiValueNumberFilter(django_filters.MultipleChoiceFilter): class MultiValueNumberFilter(django_filters.MultipleChoiceFilter):
field_class = multivalue_field_factory(forms.IntegerField) field_class = multivalue_field_factory(forms.IntegerField)
@extend_schema_field(OpenApiTypes.DECIMAL)
class MultiValueDecimalFilter(django_filters.MultipleChoiceFilter): class MultiValueDecimalFilter(django_filters.MultipleChoiceFilter):
field_class = multivalue_field_factory(forms.DecimalField) field_class = multivalue_field_factory(forms.DecimalField)
@extend_schema_field(OpenApiTypes.TIME)
class MultiValueTimeFilter(django_filters.MultipleChoiceFilter): class MultiValueTimeFilter(django_filters.MultipleChoiceFilter):
field_class = multivalue_field_factory(forms.TimeField) field_class = multivalue_field_factory(forms.TimeField)
@ -65,6 +73,7 @@ class MACAddressFilter(django_filters.CharFilter):
pass pass
@extend_schema_field(OpenApiTypes.STR)
class MultiValueMACAddressFilter(django_filters.MultipleChoiceFilter): class MultiValueMACAddressFilter(django_filters.MultipleChoiceFilter):
field_class = multivalue_field_factory(forms.CharField) field_class = multivalue_field_factory(forms.CharField)
@ -75,6 +84,7 @@ class MultiValueMACAddressFilter(django_filters.MultipleChoiceFilter):
return qs.none() return qs.none()
@extend_schema_field(OpenApiTypes.STR)
class MultiValueWWNFilter(django_filters.MultipleChoiceFilter): class MultiValueWWNFilter(django_filters.MultipleChoiceFilter):
field_class = multivalue_field_factory(forms.CharField) field_class = multivalue_field_factory(forms.CharField)