Skip to content

Commit ddd0f79

Browse files
committed
fix: fields having required=true and null=true were being set as set as required in graphql layer
1 parent f099bcd commit ddd0f79

File tree

2 files changed

+46
-22
lines changed

2 files changed

+46
-22
lines changed

graphene_mongo/converter.py

Lines changed: 38 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
from .utils import (
1212
get_field_description,
1313
get_query_fields,
14+
get_field_is_required,
1415
ExecutorEnum,
1516
sync_to_async,
1617
)
@@ -34,71 +35,86 @@ def convert_mongoengine_field(field, registry=None, executor: ExecutorEnum = Exe
3435
@convert_mongoengine_field.register(mongoengine.URLField)
3536
def convert_field_to_string(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
3637
return graphene.String(
37-
description=get_field_description(field, registry), required=field.required
38+
description=get_field_description(field, registry),
39+
required=get_field_is_required(field, registry),
3840
)
3941

4042

4143
@convert_mongoengine_field.register(mongoengine.UUIDField)
4244
@convert_mongoengine_field.register(mongoengine.ObjectIdField)
4345
def convert_field_to_id(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
44-
return graphene.ID(description=get_field_description(field, registry), required=field.required)
46+
return graphene.ID(
47+
description=get_field_description(field, registry),
48+
required=get_field_is_required(field, registry),
49+
)
4550

4651

4752
@convert_mongoengine_field.register(mongoengine.IntField)
4853
@convert_mongoengine_field.register(mongoengine.LongField)
4954
@convert_mongoengine_field.register(mongoengine.SequenceField)
5055
def convert_field_to_int(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
51-
return graphene.Int(description=get_field_description(field, registry), required=field.required)
56+
return graphene.Int(
57+
description=get_field_description(field, registry),
58+
required=get_field_is_required(field, registry),
59+
)
5260

5361

5462
@convert_mongoengine_field.register(mongoengine.BooleanField)
5563
def convert_field_to_boolean(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
5664
return graphene.Boolean(
57-
description=get_field_description(field, registry), required=field.required
65+
description=get_field_description(field, registry),
66+
required=get_field_is_required(field, registry),
5867
)
5968

6069

6170
@convert_mongoengine_field.register(mongoengine.FloatField)
6271
def convert_field_to_float(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
6372
return graphene.Float(
64-
description=get_field_description(field, registry), required=field.required
73+
description=get_field_description(field, registry),
74+
required=get_field_is_required(field, registry),
6575
)
6676

6777

6878
@convert_mongoengine_field.register(mongoengine.Decimal128Field)
6979
@convert_mongoengine_field.register(mongoengine.DecimalField)
7080
def convert_field_to_decimal(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
7181
return graphene.Decimal(
72-
description=get_field_description(field, registry), required=field.required
82+
description=get_field_description(field, registry),
83+
required=get_field_is_required(field, registry),
7384
)
7485

7586

7687
@convert_mongoengine_field.register(mongoengine.DateTimeField)
7788
def convert_field_to_datetime(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
7889
return graphene.DateTime(
79-
description=get_field_description(field, registry), required=field.required
90+
description=get_field_description(field, registry),
91+
required=get_field_is_required(field, registry),
8092
)
8193

8294

8395
@convert_mongoengine_field.register(mongoengine.DateField)
8496
def convert_field_to_date(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
8597
return graphene.Date(
86-
description=get_field_description(field, registry), required=field.required
98+
description=get_field_description(field, registry),
99+
required=get_field_is_required(field, registry),
87100
)
88101

89102

90103
@convert_mongoengine_field.register(mongoengine.DictField)
91104
@convert_mongoengine_field.register(mongoengine.MapField)
92105
def convert_field_to_jsonstring(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
93-
return JSONString(description=get_field_description(field, registry), required=field.required)
106+
return JSONString(
107+
description=get_field_description(field, registry),
108+
required=get_field_is_required(field, registry),
109+
)
94110

95111

96112
@convert_mongoengine_field.register(mongoengine.PointField)
97113
def convert_point_to_field(field, registry=None, executor: ExecutorEnum = ExecutorEnum.SYNC):
98114
return graphene.Field(
99115
advanced_types.PointFieldType,
100116
description=get_field_description(field, registry),
101-
required=field.required,
117+
required=get_field_is_required(field, registry),
102118
)
103119

104120

@@ -107,7 +123,7 @@ def convert_polygon_to_field(field, registry=None, executor: ExecutorEnum = Exec
107123
return graphene.Field(
108124
advanced_types.PolygonFieldType,
109125
description=get_field_description(field, registry),
110-
required=field.required,
126+
required=get_field_is_required(field, registry),
111127
)
112128

113129

@@ -116,7 +132,7 @@ def convert_multipolygon_to_field(field, registry=None, executor: ExecutorEnum =
116132
return graphene.Field(
117133
advanced_types.MultiPolygonFieldType,
118134
description=get_field_description(field, registry),
119-
required=field.required,
135+
required=get_field_is_required(field, registry),
120136
)
121137

122138

@@ -125,7 +141,7 @@ def convert_file_to_field(field, registry=None, executor: ExecutorEnum = Executo
125141
return graphene.Field(
126142
advanced_types.FileFieldType,
127143
description=get_field_description(field, registry),
128-
required=field.required,
144+
required=get_field_is_required(field, registry),
129145
)
130146

131147

@@ -298,15 +314,15 @@ async def reference_resolver_async(root, *args, **kwargs):
298314
return graphene.List(
299315
base_type._type,
300316
description=get_field_description(field, registry),
301-
required=field.required,
317+
required=get_field_is_required(field, registry),
302318
resolver=reference_resolver
303319
if executor == ExecutorEnum.SYNC
304320
else reference_resolver_async,
305321
)
306322
return graphene.List(
307323
base_type._type,
308324
description=get_field_description(field, registry),
309-
required=field.required,
325+
required=get_field_is_required(field, registry),
310326
)
311327
if isinstance(base_type, (graphene.Dynamic)):
312328
base_type = base_type.get_type()
@@ -327,7 +343,7 @@ async def reference_resolver_async(root, *args, **kwargs):
327343
return graphene.List(
328344
base_type,
329345
description=get_field_description(field, registry),
330-
required=field.required,
346+
required=get_field_is_required(field, registry),
331347
)
332348

333349

@@ -491,7 +507,7 @@ async def lazy_reference_resolver_async(root, *args, **kwargs):
491507
field_resolver = None
492508
required = False
493509
if field.db_field is not None:
494-
required = field.required
510+
required = get_field_is_required(field, registry)
495511
resolver_function = getattr(
496512
registry.get_type_for_model(field.owner_document, executor=executor),
497513
"resolve_" + field.db_field,
@@ -516,7 +532,7 @@ async def lazy_reference_resolver_async(root, *args, **kwargs):
516532
field_resolver = None
517533
required = False
518534
if field.db_field is not None:
519-
required = field.required
535+
required = get_field_is_required(field, registry)
520536
resolver_function = getattr(
521537
registry.get_type_for_model(field.owner_document, executor=executor),
522538
"resolve_" + field.db_field,
@@ -658,12 +674,12 @@ def dynamic_type():
658674
return graphene.Field(
659675
_type,
660676
description=get_field_description(field, registry),
661-
required=field.required,
677+
required=get_field_is_required(field, registry),
662678
)
663679
field_resolver = None
664680
required = False
665681
if field.db_field is not None:
666-
required = field.required
682+
required = get_field_is_required(field, registry)
667683
resolver_function = getattr(
668684
registry.get_type_for_model(field.owner_document, executor=executor),
669685
"resolve_" + field.db_field,
@@ -760,7 +776,7 @@ def dynamic_type():
760776
field_resolver = None
761777
required = False
762778
if field.db_field is not None:
763-
required = field.required
779+
required = get_field_is_required(field, registry)
764780
resolver_function = getattr(
765781
registry.get_type_for_model(field.owner_document, executor=executor),
766782
"resolve_" + field.db_field,
@@ -790,5 +806,5 @@ def convert_field_to_enum(field, registry=None, executor: ExecutorEnum = Executo
790806
return graphene.Field(
791807
_type,
792808
description=get_field_description(field, registry),
793-
required=field.required,
809+
required=get_field_is_required(field, registry),
794810
)

graphene_mongo/utils.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,6 +86,14 @@ def get_field_description(field, registry=None):
8686
return "\n".join(parts)
8787

8888

89+
def get_field_is_required(field, registry=None):
90+
"""
91+
A field is said to be required in gql only if
92+
field.required = True and field.null = False
93+
"""
94+
return field.required and not field.null
95+
96+
8997
def get_node_from_global_id(node, info, global_id):
9098
try:
9199
for interface in node._meta.interfaces:

0 commit comments

Comments
 (0)