mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-01-25 00:34:21 +03:00
Merge pull request #5085 from hurturk/schema-method-limited
Generate schema with respect to http_method_names provided by CBV
This commit is contained in:
commit
97312699f5
|
@ -246,7 +246,9 @@ class EndpointInspector(object):
|
||||||
Return a list of the valid HTTP methods for this endpoint.
|
Return a list of the valid HTTP methods for this endpoint.
|
||||||
"""
|
"""
|
||||||
if hasattr(callback, 'actions'):
|
if hasattr(callback, 'actions'):
|
||||||
return [method.upper() for method in callback.actions.keys()]
|
actions = set(callback.actions.keys())
|
||||||
|
http_method_names = set(callback.cls.http_method_names)
|
||||||
|
return [method.upper() for method in actions & http_method_names]
|
||||||
|
|
||||||
return [
|
return [
|
||||||
method for method in
|
method for method in
|
||||||
|
|
|
@ -246,6 +246,11 @@ class PermissionDeniedExampleViewSet(ExampleViewSet):
|
||||||
permission_classes = [DenyAllUsingPermissionDenied]
|
permission_classes = [DenyAllUsingPermissionDenied]
|
||||||
|
|
||||||
|
|
||||||
|
class MethodLimitedViewSet(ExampleViewSet):
|
||||||
|
permission_classes = []
|
||||||
|
http_method_names = ['get', 'head', 'options']
|
||||||
|
|
||||||
|
|
||||||
class ExampleListView(APIView):
|
class ExampleListView(APIView):
|
||||||
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
|
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
|
||||||
|
|
||||||
|
@ -368,6 +373,61 @@ class TestSchemaGeneratorNotAtRoot(TestCase):
|
||||||
assert schema == expected
|
assert schema == expected
|
||||||
|
|
||||||
|
|
||||||
|
@unittest.skipUnless(coreapi, 'coreapi is not installed')
|
||||||
|
class TestSchemaGeneratorWithMethodLimitedViewSets(TestCase):
|
||||||
|
def setUp(self):
|
||||||
|
router = DefaultRouter()
|
||||||
|
router.register('example1', MethodLimitedViewSet, base_name='example1')
|
||||||
|
self.patterns = [
|
||||||
|
url(r'^', include(router.urls))
|
||||||
|
]
|
||||||
|
|
||||||
|
def test_schema_for_regular_views(self):
|
||||||
|
"""
|
||||||
|
Ensure that schema generation works for ViewSet classes
|
||||||
|
with method limitation by Django CBV's http_method_names attribute
|
||||||
|
"""
|
||||||
|
generator = SchemaGenerator(title='Example API', patterns=self.patterns)
|
||||||
|
request = factory.get('/example1/')
|
||||||
|
schema = generator.get_schema(Request(request))
|
||||||
|
|
||||||
|
expected = coreapi.Document(
|
||||||
|
url='http://testserver/example1/',
|
||||||
|
title='Example API',
|
||||||
|
content={
|
||||||
|
'example1': {
|
||||||
|
'list': coreapi.Link(
|
||||||
|
url='/example1/',
|
||||||
|
action='get',
|
||||||
|
fields=[
|
||||||
|
coreapi.Field('page', required=False, location='query', schema=coreschema.Integer(title='Page', description='A page number within the paginated result set.')),
|
||||||
|
coreapi.Field('page_size', required=False, location='query', schema=coreschema.Integer(title='Page size', description='Number of results to return per page.')),
|
||||||
|
coreapi.Field('ordering', required=False, location='query', schema=coreschema.String(title='Ordering', description='Which field to use when ordering the results.'))
|
||||||
|
]
|
||||||
|
),
|
||||||
|
'custom_list_action': coreapi.Link(
|
||||||
|
url='/example1/custom_list_action/',
|
||||||
|
action='get'
|
||||||
|
),
|
||||||
|
'custom_list_action_multiple_methods': {
|
||||||
|
'read': coreapi.Link(
|
||||||
|
url='/example1/custom_list_action_multiple_methods/',
|
||||||
|
action='get'
|
||||||
|
)
|
||||||
|
},
|
||||||
|
'read': coreapi.Link(
|
||||||
|
url='/example1/{id}/',
|
||||||
|
action='get',
|
||||||
|
fields=[
|
||||||
|
coreapi.Field('id', required=True, location='path', schema=coreschema.String())
|
||||||
|
]
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
assert schema == expected
|
||||||
|
|
||||||
|
|
||||||
@unittest.skipUnless(coreapi, 'coreapi is not installed')
|
@unittest.skipUnless(coreapi, 'coreapi is not installed')
|
||||||
class TestSchemaGeneratorWithRestrictedViewSets(TestCase):
|
class TestSchemaGeneratorWithRestrictedViewSets(TestCase):
|
||||||
def setUp(self):
|
def setUp(self):
|
||||||
|
|
Loading…
Reference in New Issue
Block a user