mirror of
https://github.com/encode/django-rest-framework.git
synced 2025-07-18 12:12:19 +03:00
updated field default on serializer according to openapi generation and added that to options action response
This commit is contained in:
parent
34d2ad4faa
commit
728fdbe13c
|
@ -11,6 +11,7 @@ from django.http import Http404
|
|||
from django.utils.encoding import force_str
|
||||
|
||||
from rest_framework import exceptions, serializers
|
||||
from rest_framework.fields import empty
|
||||
from rest_framework.request import clone_request
|
||||
from rest_framework.utils.field_mapping import ClassLookupDict
|
||||
|
||||
|
@ -149,4 +150,7 @@ class SimpleMetadata(BaseMetadata):
|
|||
for choice_value, choice_name in field.choices.items()
|
||||
]
|
||||
|
||||
if getattr(field, 'default', None) and field.default != empty and not callable(field.default):
|
||||
field_info['default'] = field.default
|
||||
|
||||
return field_info
|
||||
|
|
|
@ -9,6 +9,7 @@ from django.db import models
|
|||
from django.utils.text import capfirst
|
||||
|
||||
from rest_framework.compat import postgres_fields
|
||||
from rest_framework.fields import empty
|
||||
from rest_framework.validators import UniqueValidator
|
||||
|
||||
NUMERIC_FIELD_TYPES = (
|
||||
|
@ -127,7 +128,7 @@ def get_field_kwargs(field_name, model_field):
|
|||
kwargs['read_only'] = True
|
||||
return kwargs
|
||||
|
||||
if model_field.has_default():
|
||||
if model_field.default is not None and model_field.default != empty and not callable(model_field.default):
|
||||
kwargs['default'] = model_field.default
|
||||
|
||||
if model_field.has_default() or model_field.blank or model_field.null:
|
||||
|
|
|
@ -184,6 +184,135 @@ class TestMetadata:
|
|||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.data == expected
|
||||
|
||||
def test_actions_with_default(self):
|
||||
"""
|
||||
On generic views OPTIONS should return an 'actions' key with metadata
|
||||
on the fields with default that may be supplied to PUT and POST requests.
|
||||
"""
|
||||
class NestedField(serializers.Serializer):
|
||||
a = serializers.IntegerField(default=2)
|
||||
b = serializers.IntegerField()
|
||||
|
||||
class ExampleSerializer(serializers.Serializer):
|
||||
choice_field = serializers.ChoiceField(['red', 'green', 'blue'], default='red')
|
||||
integer_field = serializers.IntegerField(
|
||||
min_value=1, max_value=1000, default=1
|
||||
)
|
||||
char_field = serializers.CharField(
|
||||
min_length=3, max_length=40, default="example"
|
||||
)
|
||||
list_field = serializers.ListField(
|
||||
child=serializers.ListField(
|
||||
child=serializers.IntegerField(default=1)
|
||||
)
|
||||
)
|
||||
nested_field = NestedField()
|
||||
uuid_field = serializers.UUIDField(label="UUID field")
|
||||
|
||||
class ExampleView(views.APIView):
|
||||
"""Example view."""
|
||||
def post(self, request):
|
||||
pass
|
||||
|
||||
def get_serializer(self):
|
||||
return ExampleSerializer()
|
||||
|
||||
view = ExampleView.as_view()
|
||||
response = view(request=request)
|
||||
expected = {
|
||||
'name': 'Example',
|
||||
'description': 'Example view.',
|
||||
'renders': [
|
||||
'application/json',
|
||||
'text/html'
|
||||
],
|
||||
'parses': [
|
||||
'application/json',
|
||||
'application/x-www-form-urlencoded',
|
||||
'multipart/form-data'
|
||||
],
|
||||
'actions': {
|
||||
'POST': {
|
||||
'choice_field': {
|
||||
'type': 'choice',
|
||||
'required': False,
|
||||
'read_only': False,
|
||||
'label': 'Choice field',
|
||||
"choices": [
|
||||
{'value': 'red', 'display_name': 'red'},
|
||||
{'value': 'green', 'display_name': 'green'},
|
||||
{'value': 'blue', 'display_name': 'blue'}
|
||||
],
|
||||
'default': 'red'
|
||||
},
|
||||
'integer_field': {
|
||||
'type': 'integer',
|
||||
'required': False,
|
||||
'read_only': False,
|
||||
'label': 'Integer field',
|
||||
'min_value': 1,
|
||||
'max_value': 1000,
|
||||
'default': 1
|
||||
},
|
||||
'char_field': {
|
||||
'type': 'string',
|
||||
'required': False,
|
||||
'read_only': False,
|
||||
'label': 'Char field',
|
||||
'min_length': 3,
|
||||
'max_length': 40,
|
||||
'default': 'example'
|
||||
},
|
||||
'list_field': {
|
||||
'type': 'list',
|
||||
'required': True,
|
||||
'read_only': False,
|
||||
'label': 'List field',
|
||||
'child': {
|
||||
'type': 'list',
|
||||
'required': True,
|
||||
'read_only': False,
|
||||
'child': {
|
||||
'type': 'integer',
|
||||
'required': False,
|
||||
'read_only': False,
|
||||
'default': 1
|
||||
}
|
||||
}
|
||||
},
|
||||
'nested_field': {
|
||||
'type': 'nested object',
|
||||
'required': True,
|
||||
'read_only': False,
|
||||
'label': 'Nested field',
|
||||
'children': {
|
||||
'a': {
|
||||
'type': 'integer',
|
||||
'required': False,
|
||||
'read_only': False,
|
||||
'label': 'A',
|
||||
'default': 2
|
||||
},
|
||||
'b': {
|
||||
'type': 'integer',
|
||||
'required': True,
|
||||
'read_only': False,
|
||||
'label': 'B'
|
||||
}
|
||||
}
|
||||
},
|
||||
'uuid_field': {
|
||||
'type': 'string',
|
||||
'required': True,
|
||||
'read_only': False,
|
||||
'label': 'UUID field'
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
assert response.status_code == status.HTTP_200_OK
|
||||
assert response.data == expected
|
||||
|
||||
def test_global_permissions(self):
|
||||
"""
|
||||
If a user does not have global permissions on an action, then any
|
||||
|
|
Loading…
Reference in New Issue
Block a user