Skip to content

Commit

Permalink
Adding support for disabling enum creation on SerializerMutation (#851)
Browse files Browse the repository at this point in the history
  • Loading branch information
leewardbound committed Feb 7, 2020
1 parent 6b8c5bd commit 83bc32b
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 8 deletions.
25 changes: 21 additions & 4 deletions graphene_django/rest_framework/mutation.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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


Expand All @@ -55,6 +63,7 @@ def __init_subclass_with_meta__(
model_operations=("create", "update"),
only_fields=(),
exclude_fields=(),
convert_choices_to_enum=True,
**options
):

Expand All @@ -74,10 +83,18 @@ def __init_subclass_with_meta__(
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)
Expand Down
7 changes: 5 additions & 2 deletions graphene_django/rest_framework/serializer_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -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}
Expand Down
18 changes: 16 additions & 2 deletions graphene_django/rest_framework/tests/test_field_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,9 @@
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.
Expand All @@ -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):
Expand Down Expand Up @@ -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)

Expand Down

0 comments on commit 83bc32b

Please sign in to comment.