Add get_path_parameters() for operations.

This commit is contained in:
Carlton Gibson 2018-08-09 15:08:07 +02:00
parent 05267221c2
commit 4c173193d6
3 changed files with 59 additions and 9 deletions

View File

@ -503,5 +503,37 @@ class DefaultSchema(ViewInspector):
class OpenAPIAutoSchema(ViewInspector):
def get_operation(self, path, method):
# TODO: fill in details here.
return {}
return {
'parameters': self.get_path_parameters(path, method),
}
def get_path_parameters(self, path, method):
"""
Return a list of parameters from templated path variables.
"""
model = getattr(getattr(self.view, 'queryset', None), 'model', None)
parameters = []
for variable in uritemplate.variables(path):
description = ''
if model is not None:
# Attempt to infer a field description if possible.
try:
model_field = model._meta.get_field(variable)
except Exception:
model_field = None
if model_field is not None and model_field.help_text:
description = force_text(model_field.help_text)
elif model_field is not None and model_field.primary_key:
description = get_pk_description(model, model_field)
parameter = {
"name": variable,
"in": "path",
"required": True,
"description": description,
}
parameters.append(parameter)
return parameters

View File

@ -20,7 +20,7 @@ def create_view(view_cls, method, request):
return view
class TestInspector(TestCase):
class TestOperationIntrospection(TestCase):
def test_path_without_parameters(self):
path = '/example/'
@ -35,9 +35,30 @@ class TestInspector(TestCase):
inspector.view = view
operation = inspector.get_operation(path, method)
assert operation == {}
assert operation == {
'parameters': []
}
# TODO: parameters, operationID, responses, etc ???
def test_path_with_id_parameter(self):
path = '/example/{id}/'
method = 'GET'
view = create_view(
views.ExampleDetailView,
method,
create_request(path)
)
inspector = OpenAPIAutoSchema()
inspector.view = view
operation = inspector.get_operation(path, method)
assert operation == {
'parameters': [{
'description': '',
'in': 'path',
'name': 'id',
'required': True,
}]
}
@override_settings(REST_FRAMEWORK={'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.inspectors.OpenAPIAutoSchema'})

View File

@ -6,9 +6,8 @@ from rest_framework.decorators import action
from rest_framework.views import APIView
from rest_framework.viewsets import ModelViewSet
# Simple APIViews:
class ExampleListView(APIView):
permission_classes = [permissions.IsAuthenticatedOrReadOnly]
@ -27,7 +26,6 @@ class ExampleDetailView(APIView):
# Classes for ExampleViewSet
class ExamplePagination(pagination.PageNumberPagination):
page_size = 100
page_size_query_param = 'page_size'
@ -110,7 +108,6 @@ class ExampleViewSet(ModelViewSet):
# ExampleViewSet subclasses
class DenyAllUsingHttp404(permissions.BasePermission):
def has_permission(self, request, view):