Add @extend_schema decorators to fix drf-spectacular serializer warnings

All @api_view function-based views now have explicit schema annotations,
eliminating "unable to guess serializer" warnings on startup and producing
complete OpenAPI documentation.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
root 2026-04-08 02:05:36 +02:00
parent bb3491ae39
commit 324a91271e
3 changed files with 19 additions and 0 deletions

View file

@ -1,3 +1,4 @@
from drf_spectacular.utils import extend_schema
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.permissions import IsAuthenticated
@ -18,6 +19,10 @@ from apps.accounts.serializers import (
User = get_user_model()
@extend_schema(
request=UpdateProfileSerializer,
responses={200: UserSerializer},
)
@api_view(["GET", "PATCH"])
@permission_classes([IsAuthenticated])
def me(request):
@ -31,6 +36,10 @@ def me(request):
return Response(UserSerializer(request.user).data)
@extend_schema(
request=ChangePasswordSerializer,
responses={200: None},
)
@api_view(["POST"])
@permission_classes([IsAuthenticated])
def change_password(request):

View file

@ -1,5 +1,6 @@
from django.db.models import Count
from django.shortcuts import get_object_or_404
from drf_spectacular.utils import extend_schema
from rest_framework import status
from rest_framework.decorators import api_view, permission_classes
from rest_framework.response import Response
@ -18,6 +19,7 @@ from apps.resources.services import detect_format_from_filename, process_upload
from parsers.factory import ParserFactory
@extend_schema(request=FileUploadSerializer, responses={201: None})
@api_view(["POST"])
@permission_classes([IsManagerOrAbove])
def upload_resource(request, slug):
@ -56,6 +58,7 @@ def upload_resource(request, slug):
return Response(result, status=status.HTTP_201_CREATED)
@extend_schema(responses={200: ResourceFileSerializer(many=True)})
@api_view(["GET"])
def list_resources(request, slug):
"""List resource files for a project."""
@ -65,6 +68,7 @@ def list_resources(request, slug):
return Response(serializer.data)
@extend_schema(responses={200: TranslatableStringListSerializer(many=True)})
@api_view(["GET"])
def list_strings(request, slug):
"""List translatable strings for a project with optional filters."""
@ -104,6 +108,7 @@ def list_strings(request, slug):
return Response(serializer.data)
@extend_schema(responses={200: TranslatableStringSerializer})
@api_view(["GET"])
def string_detail(request, slug, string_id):
"""Get a translatable string with all its translations."""
@ -117,6 +122,7 @@ def string_detail(request, slug, string_id):
return Response(serializer.data)
@extend_schema(responses={200: None})
@api_view(["GET"])
def export_translations(request, slug, language, file_format):
"""Export translations for a language in the specified format."""

View file

@ -11,12 +11,14 @@ from apps.projects.models import Project
from apps.resources.models import TranslatableString
from apps.translations.models import Translation
from apps.translations.serializers import (
ProgressSerializer,
TranslationSerializer,
TranslationSuggestionSerializer,
)
from apps.translations.services import get_suggestions
@extend_schema(request=TranslationSerializer, responses={201: TranslationSerializer})
@api_view(["POST"])
@permission_classes([IsTranslatorOrAbove])
def create_translation(request, slug, string_id):
@ -36,6 +38,7 @@ def create_translation(request, slug, string_id):
return Response(serializer.data, status=status.HTTP_201_CREATED)
@extend_schema(request=TranslationSerializer, responses={200: TranslationSerializer})
@api_view(["PUT", "PATCH"])
@permission_classes([IsTranslatorOrAbove])
def update_translation(request, slug, string_id, language):
@ -58,6 +61,7 @@ def update_translation(request, slug, string_id, language):
return Response(serializer.data)
@extend_schema(responses={200: ProgressSerializer})
@api_view(["GET"])
def translation_progress(request, slug):
"""Get translation progress per language for a project."""