From a14488d8eb5848d6ecfb37c6b14c2dcad1fdf2d2 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Wed, 10 Aug 2016 20:23:37 +1000 Subject: [PATCH 1/2] Corrected super() argument --- tests/test_schemas.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 6c02c9d230..614dce246c 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -41,7 +41,7 @@ class ExampleViewSet(ModelViewSet): @detail_route(methods=['post'], serializer_class=AnotherSerializer) def custom_action(self, request, pk): - return super(ExampleSerializer, self).retrieve(self, request) + return super(ExampleViewSet, self).retrieve(self, request) class ExampleView(APIView): From 6c10b5848e725876522c33ba88a3d08581d1cb15 Mon Sep 17 00:00:00 2001 From: David Sanders Date: Wed, 10 Aug 2016 21:52:43 +1000 Subject: [PATCH 2/2] Updated schema generation tests & code to include list routes under their associated categories --- rest_framework/schemas.py | 14 ++++++++++---- tests/test_schemas.py | 20 ++++++++++++++++---- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/rest_framework/schemas.py b/rest_framework/schemas.py index 688deec881..41052daa5e 100644 --- a/rest_framework/schemas.py +++ b/rest_framework/schemas.py @@ -175,15 +175,21 @@ def get_key(self, path, method, callback): Return a tuple of strings, indicating the identity to use for a given endpoint. eg. ('users', 'list'). """ + actions = getattr(callback, 'actions', self.default_mapping) + action = actions[method.lower()] + + list_route = None + if hasattr(callback.cls, action): + list_route_action = getattr(callback.cls, action) + if hasattr(list_route_action, 'bind_to_methods') and not getattr(list_route_action, 'detail', None): + list_route = list_route_action.kwargs.get('url_path', action) + category = None for item in path.strip('/').split('/'): - if '{' in item: + if '{' in item or item == list_route: break category = item - actions = getattr(callback, 'actions', self.default_mapping) - action = actions[method.lower()] - if category: return (category, action) return (action,) diff --git a/tests/test_schemas.py b/tests/test_schemas.py index 614dce246c..3bb0a00359 100644 --- a/tests/test_schemas.py +++ b/tests/test_schemas.py @@ -5,7 +5,7 @@ from rest_framework import filters, pagination, permissions, serializers from rest_framework.compat import coreapi -from rest_framework.decorators import detail_route +from rest_framework.decorators import detail_route, list_route from rest_framework.response import Response from rest_framework.routers import DefaultRouter from rest_framework.schemas import SchemaGenerator @@ -40,9 +40,13 @@ class ExampleViewSet(ModelViewSet): serializer_class = ExampleSerializer @detail_route(methods=['post'], serializer_class=AnotherSerializer) - def custom_action(self, request, pk): + def custom_detail_action(self, request, pk): return super(ExampleViewSet, self).retrieve(self, request) + @list_route() + def custom_list_action(self, request): + return super(ExampleViewSet, self).list(self, request) + class ExampleView(APIView): permission_classes = [permissions.IsAuthenticatedOrReadOnly] @@ -90,6 +94,10 @@ def test_anonymous_request(self): fields=[ coreapi.Field('pk', required=True, location='path') ] + ), + 'custom_list_action': coreapi.Link( + url='/example/custom_list_action/', + action='get' ) } } @@ -130,8 +138,8 @@ def test_authenticated_request(self): coreapi.Field('pk', required=True, location='path') ] ), - 'custom_action': coreapi.Link( - url='/example/{pk}/custom_action/', + 'custom_detail_action': coreapi.Link( + url='/example/{pk}/custom_detail_action/', action='post', encoding='application/json', fields=[ @@ -140,6 +148,10 @@ def test_authenticated_request(self): coreapi.Field('d', required=False, location='form'), ] ), + 'custom_list_action': coreapi.Link( + url='/example/custom_list_action/', + action='get' + ), 'update': coreapi.Link( url='/example/{pk}/', action='put', pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy