Skip to content

Commit

Permalink
adding optional_field in Serializermutation to enfore some fields to …
Browse files Browse the repository at this point in the history
…be optional (#1455)

* adding optional_fields to enforce fields to be optional

* adding support for all

* adding unit tests

* Update graphene_django/rest_framework/mutation.py

Co-authored-by: Kien Dang <kiend@pm.me>

* linting

* linting

* add missing import

---------

Co-authored-by: Kien Dang <kiend@pm.me>
  • Loading branch information
mahmoudmostafa0 and kiendang committed Aug 27, 2023
1 parent 0473f1a commit e49a01c
Show file tree
Hide file tree
Showing 3 changed files with 27 additions and 4 deletions.
10 changes: 9 additions & 1 deletion graphene_django/rest_framework/mutation.py
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@ class SerializerMutationOptions(MutationOptions):
model_class = None
model_operations = ["create", "update"]
serializer_class = None
optional_fields = ()


def fields_for_serializer(
Expand All @@ -28,6 +29,7 @@ def fields_for_serializer(
is_input=False,
convert_choices_to_enum=True,
lookup_field=None,
optional_fields=(),
):
fields = OrderedDict()
for name, field in serializer.fields.items():
Expand All @@ -48,9 +50,13 @@ def fields_for_serializer(

if is_not_in_only or is_excluded:
continue
is_optional = name in optional_fields or "__all__" in optional_fields

fields[name] = convert_serializer_field(
field, is_input=is_input, convert_choices_to_enum=convert_choices_to_enum
field,
is_input=is_input,
convert_choices_to_enum=convert_choices_to_enum,
force_optional=is_optional,
)
return fields

Expand All @@ -74,6 +80,7 @@ def __init_subclass_with_meta__(
exclude_fields=(),
convert_choices_to_enum=True,
_meta=None,
optional_fields=(),
**options
):
if not serializer_class:
Expand All @@ -98,6 +105,7 @@ def __init_subclass_with_meta__(
is_input=True,
convert_choices_to_enum=convert_choices_to_enum,
lookup_field=lookup_field,
optional_fields=optional_fields,
)
output_fields = fields_for_serializer(
serializer,
Expand Down
9 changes: 7 additions & 2 deletions graphene_django/rest_framework/serializer_converter.py
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,9 @@ def get_graphene_type_from_serializer_field(field):
)


def convert_serializer_field(field, is_input=True, convert_choices_to_enum=True):
def convert_serializer_field(
field, is_input=True, convert_choices_to_enum=True, force_optional=False
):
"""
Converts a django rest frameworks field to a graphql field
and marks the field as required if we are creating an input type
Expand All @@ -31,7 +33,10 @@ def convert_serializer_field(field, is_input=True, convert_choices_to_enum=True)
graphql_type = get_graphene_type_from_serializer_field(field)

args = []
kwargs = {"description": field.help_text, "required": is_input and field.required}
kwargs = {
"description": field.help_text,
"required": is_input and field.required and not force_optional,
}

# if it is a tuple or a list it means that we are returning
# the graphql type and the child type
Expand Down
12 changes: 11 additions & 1 deletion graphene_django/rest_framework/tests/test_mutation.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from pytest import raises
from rest_framework import serializers

from graphene import Field, ResolveInfo
from graphene import Field, ResolveInfo, String
from graphene.types.inputobjecttype import InputObjectType

from ...types import DjangoObjectType
Expand Down Expand Up @@ -105,6 +105,16 @@ class Meta:
assert "created" not in MyMutation.Input._meta.fields


def test_model_serializer_optional_fields():
class MyMutation(SerializerMutation):
class Meta:
serializer_class = MyModelSerializer
optional_fields = ("cool_name",)

assert "cool_name" in MyMutation.Input._meta.fields
assert MyMutation.Input._meta.fields["cool_name"].type == String


def test_write_only_field():
class WriteOnlyFieldModelSerializer(serializers.ModelSerializer):
password = serializers.CharField(write_only=True)
Expand Down

0 comments on commit e49a01c

Please sign in to comment.