Skip to content

Commit 728bcac

Browse files
authored
Merge pull request #261 from q3aiml/fix-serializermutation-regression
fix various SerializerMutation regressions
2 parents 992fbf0 + c130490 commit 728bcac

File tree

3 files changed

+50
-7
lines changed

3 files changed

+50
-7
lines changed

graphene_django/rest_framework/mutation.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@ def __init_subclass_with_meta__(cls, serializer_class=None,
5555
output_fields = fields_for_serializer(serializer, only_fields, exclude_fields, is_input=False)
5656

5757
_meta = SerializerMutationOptions(cls)
58+
_meta.serializer_class = serializer_class
5859
_meta.fields = yank_fields_from_attrs(
5960
output_fields,
6061
_as=Field,
@@ -83,4 +84,4 @@ def mutate_and_get_payload(cls, root, info, **input):
8384
@classmethod
8485
def perform_mutate(cls, serializer, info):
8586
obj = serializer.save()
86-
return cls(**obj)
87+
return cls(errors=None, **obj)

graphene_django/rest_framework/serializer_converter.py

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -42,8 +42,7 @@ def convert_serializer_field(field, is_input=True):
4242

4343
if isinstance(field, serializers.ModelSerializer):
4444
if is_input:
45-
return Dynamic(lambda: None)
46-
# graphql_type = convert_serializer_to_input_type(field.__class__)
45+
graphql_type = convert_serializer_to_input_type(field.__class__)
4746
else:
4847
global_registry = get_global_registry()
4948
field_model = field.Meta.model
@@ -52,6 +51,21 @@ def convert_serializer_field(field, is_input=True):
5251
return graphql_type(*args, **kwargs)
5352

5453

54+
def convert_serializer_to_input_type(serializer_class):
55+
serializer = serializer_class()
56+
57+
items = {
58+
name: convert_serializer_field(field)
59+
for name, field in serializer.fields.items()
60+
}
61+
62+
return type(
63+
'{}Input'.format(serializer.__class__.__name__),
64+
(graphene.InputObjectType,),
65+
items
66+
)
67+
68+
5569
@get_graphene_type_from_serializer_field.register(serializers.Field)
5670
def convert_serializer_field_to_string(field):
5771
return graphene.String

graphene_django/rest_framework/tests/test_mutation.py

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,9 @@ class MySerializer(serializers.Serializer):
2222
text = serializers.CharField()
2323
model = MyModelSerializer()
2424

25+
def create(self, validated_data):
26+
return validated_data
27+
2528

2629
def test_needs_serializer_class():
2730
with raises(Exception) as exc:
@@ -65,7 +68,32 @@ class Meta:
6568
assert model_field.type == MyFakeModelGrapheneType
6669

6770
model_input = MyMutation.Input._meta.fields['model']
68-
model_input_type = model_input.get_type()
69-
assert not model_input_type
70-
# assert issubclass(model_input_type, InputObjectType)
71-
# assert 'cool_name' in model_input_type._meta.fields
71+
model_input_type = model_input._type.of_type
72+
assert issubclass(model_input_type, InputObjectType)
73+
assert 'cool_name' in model_input_type._meta.fields
74+
75+
76+
def test_mutate_and_get_payload_success():
77+
78+
class MyMutation(SerializerMutation):
79+
class Meta:
80+
serializer_class = MySerializer
81+
82+
result = MyMutation.mutate_and_get_payload(None, None, **{
83+
'text': 'value',
84+
'model': {
85+
'cool_name': 'other_value'
86+
}
87+
})
88+
assert result.errors is None
89+
90+
91+
def test_mutate_and_get_payload_error():
92+
93+
class MyMutation(SerializerMutation):
94+
class Meta:
95+
serializer_class = MySerializer
96+
97+
# missing required fields
98+
result = MyMutation.mutate_and_get_payload(None, None, **{})
99+
assert len(result.errors) > 0

0 commit comments

Comments
 (0)