From 097302e9298d43dcd1ca224d393e537d16574ad0 Mon Sep 17 00:00:00 2001 From: qqii Date: Tue, 5 Aug 2025 18:41:15 +0100 Subject: [PATCH] Add missing decorator: metadata_class --- rest_framework/decorators.py | 10 ++++++++++ tests/test_decorators.py | 14 +++++++++++++- 2 files changed, 23 insertions(+), 1 deletion(-) diff --git a/rest_framework/decorators.py b/rest_framework/decorators.py index d84525585..043ec3f7a 100644 --- a/rest_framework/decorators.py +++ b/rest_framework/decorators.py @@ -70,6 +70,9 @@ def api_view(http_method_names=None): WrappedAPIView.permission_classes = getattr(func, 'permission_classes', APIView.permission_classes) + WrappedAPIView.metadata_class = getattr(func, 'metadata_class', + APIView.metadata_class) + WrappedAPIView.versioning_class = getattr(func, "versioning_class", APIView.versioning_class) @@ -116,6 +119,13 @@ def permission_classes(permission_classes): return decorator +def metadata_class(metadata_class): + def decorator(func): + func.metadata_class = metadata_class + return func + return decorator + + def versioning_class(versioning_class): def decorator(func): func.versioning_class = versioning_class diff --git a/tests/test_decorators.py b/tests/test_decorators.py index 9cc6c41e3..25b4cbe44 100644 --- a/tests/test_decorators.py +++ b/tests/test_decorators.py @@ -6,7 +6,7 @@ from django.test import TestCase from rest_framework import status from rest_framework.authentication import BasicAuthentication from rest_framework.decorators import ( - action, api_view, authentication_classes, parser_classes, + action, api_view, authentication_classes, metadata_class, parser_classes, permission_classes, renderer_classes, schema, throttle_classes, versioning_class ) @@ -162,6 +162,18 @@ class DecoratorTestCase(TestCase): response = view(request) assert response.data == {"version": "1.2.3"} + def test_metadata_class(self): + # From TestMetadata.test_none_metadata() + @api_view() + @metadata_class(None) + def view(request): + return Response({}) + + request = self.factory.options('/') + response = view(request) + assert response.status_code == status.HTTP_405_METHOD_NOT_ALLOWED + assert response.data == {'detail': 'Method "OPTIONS" not allowed.'} + def test_schema(self): """ Checks CustomSchema class is set on view