mirror of
https://github.com/graphql-python/graphene-django.git
synced 2024-11-22 01:27:01 +03:00
Adding support for disabling enum creation on SerializerMutation (#851)
This commit is contained in:
parent
6b8c5bdefc
commit
83bc32bc9d
|
@ -19,7 +19,13 @@ class SerializerMutationOptions(MutationOptions):
|
|||
serializer_class = None
|
||||
|
||||
|
||||
def fields_for_serializer(serializer, only_fields, exclude_fields, is_input=False):
|
||||
def fields_for_serializer(
|
||||
serializer,
|
||||
only_fields,
|
||||
exclude_fields,
|
||||
is_input=False,
|
||||
convert_choices_to_enum=True,
|
||||
):
|
||||
fields = OrderedDict()
|
||||
for name, field in serializer.fields.items():
|
||||
is_not_in_only = only_fields and name not in only_fields
|
||||
|
@ -34,7 +40,9 @@ def fields_for_serializer(serializer, only_fields, exclude_fields, is_input=Fals
|
|||
if is_not_in_only or is_excluded:
|
||||
continue
|
||||
|
||||
fields[name] = convert_serializer_field(field, is_input=is_input)
|
||||
fields[name] = convert_serializer_field(
|
||||
field, is_input=is_input, convert_choices_to_enum=convert_choices_to_enum
|
||||
)
|
||||
return fields
|
||||
|
||||
|
||||
|
@ -55,6 +63,7 @@ class SerializerMutation(ClientIDMutation):
|
|||
model_operations=("create", "update"),
|
||||
only_fields=(),
|
||||
exclude_fields=(),
|
||||
convert_choices_to_enum=True,
|
||||
**options
|
||||
):
|
||||
|
||||
|
@ -74,10 +83,18 @@ class SerializerMutation(ClientIDMutation):
|
|||
lookup_field = model_class._meta.pk.name
|
||||
|
||||
input_fields = fields_for_serializer(
|
||||
serializer, only_fields, exclude_fields, is_input=True
|
||||
serializer,
|
||||
only_fields,
|
||||
exclude_fields,
|
||||
is_input=True,
|
||||
convert_choices_to_enum=convert_choices_to_enum,
|
||||
)
|
||||
output_fields = fields_for_serializer(
|
||||
serializer, only_fields, exclude_fields, is_input=False
|
||||
serializer,
|
||||
only_fields,
|
||||
exclude_fields,
|
||||
is_input=False,
|
||||
convert_choices_to_enum=convert_choices_to_enum,
|
||||
)
|
||||
|
||||
_meta = SerializerMutationOptions(cls)
|
||||
|
|
|
@ -19,14 +19,17 @@ def get_graphene_type_from_serializer_field(field):
|
|||
)
|
||||
|
||||
|
||||
def convert_serializer_field(field, is_input=True):
|
||||
def convert_serializer_field(field, is_input=True, convert_choices_to_enum=True):
|
||||
"""
|
||||
Converts a django rest frameworks field to a graphql field
|
||||
and marks the field as required if we are creating an input type
|
||||
and the field itself is required
|
||||
"""
|
||||
|
||||
graphql_type = get_graphene_type_from_serializer_field(field)
|
||||
if isinstance(field, serializers.ChoiceField) and not convert_choices_to_enum:
|
||||
graphql_type = graphene.String
|
||||
else:
|
||||
graphql_type = get_graphene_type_from_serializer_field(field)
|
||||
|
||||
args = []
|
||||
kwargs = {"description": field.help_text, "required": is_input and field.required}
|
||||
|
|
|
@ -10,7 +10,9 @@ from ..serializer_converter import convert_serializer_field
|
|||
from ..types import DictType
|
||||
|
||||
|
||||
def _get_type(rest_framework_field, is_input=True, **kwargs):
|
||||
def _get_type(
|
||||
rest_framework_field, is_input=True, convert_choices_to_enum=True, **kwargs
|
||||
):
|
||||
# prevents the following error:
|
||||
# AssertionError: The `source` argument is not meaningful when applied to a `child=` field.
|
||||
# Remove `source=` from the field declaration.
|
||||
|
@ -21,7 +23,9 @@ def _get_type(rest_framework_field, is_input=True, **kwargs):
|
|||
|
||||
field = rest_framework_field(**kwargs)
|
||||
|
||||
return convert_serializer_field(field, is_input=is_input)
|
||||
return convert_serializer_field(
|
||||
field, is_input=is_input, convert_choices_to_enum=convert_choices_to_enum
|
||||
)
|
||||
|
||||
|
||||
def assert_conversion(rest_framework_field, graphene_field, **kwargs):
|
||||
|
@ -73,6 +77,16 @@ def test_should_choice_convert_enum():
|
|||
assert field._meta.enum.__members__["W"].description == "World"
|
||||
|
||||
|
||||
def test_should_choice_convert_string_if_enum_disabled():
|
||||
assert_conversion(
|
||||
serializers.ChoiceField,
|
||||
graphene.String,
|
||||
choices=[("h", "Hello"), ("w", "World")],
|
||||
source="word",
|
||||
convert_choices_to_enum=False,
|
||||
)
|
||||
|
||||
|
||||
def test_should_base_field_convert_string():
|
||||
assert_conversion(serializers.Field, graphene.String)
|
||||
|
||||
|
|
Loading…
Reference in New Issue
Block a user