Skip to content

Commit b8f9fec

Browse files
committed
Added required conversion to model and form fields. Fixed #2
1 parent 7fbc3e6 commit b8f9fec

File tree

4 files changed

+38
-34
lines changed

4 files changed

+38
-34
lines changed

graphene_django/converter.py

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ def description(self):
4747
return named_choices_descriptions[self.name]
4848

4949
enum = Enum(name, list(named_choices), type=EnumWithDescriptionsType)
50-
return enum(description=field.help_text)
50+
return enum(description=field.help_text, required=not field.null)
5151
return convert_django_field(field, registry)
5252

5353

@@ -67,12 +67,12 @@ def convert_django_field(field, registry=None):
6767
@convert_django_field.register(models.FileField)
6868
@convert_django_field.register(UUIDField)
6969
def convert_field_to_string(field, registry=None):
70-
return String(description=field.help_text)
70+
return String(description=field.help_text, required=not field.null)
7171

7272

7373
@convert_django_field.register(models.AutoField)
7474
def convert_field_to_id(field, registry=None):
75-
return ID(description=field.help_text)
75+
return ID(description=field.help_text, required=not field.null)
7676

7777

7878
@convert_django_field.register(models.PositiveIntegerField)
@@ -81,7 +81,7 @@ def convert_field_to_id(field, registry=None):
8181
@convert_django_field.register(models.BigIntegerField)
8282
@convert_django_field.register(models.IntegerField)
8383
def convert_field_to_int(field, registry=None):
84-
return Int(description=field.help_text)
84+
return Int(description=field.help_text, required=not field.null)
8585

8686

8787
@convert_django_field.register(models.BooleanField)
@@ -91,18 +91,18 @@ def convert_field_to_boolean(field, registry=None):
9191

9292
@convert_django_field.register(models.NullBooleanField)
9393
def convert_field_to_nullboolean(field, registry=None):
94-
return Boolean(description=field.help_text)
94+
return Boolean(description=field.help_text, required=not field.null)
9595

9696

9797
@convert_django_field.register(models.DecimalField)
9898
@convert_django_field.register(models.FloatField)
9999
def convert_field_to_float(field, registry=None):
100-
return Float(description=field.help_text)
100+
return Float(description=field.help_text, required=not field.null)
101101

102102

103103
@convert_django_field.register(models.DateField)
104104
def convert_date_to_string(field, registry=None):
105-
return DateTime(description=field.help_text)
105+
return DateTime(description=field.help_text, required=not field.null)
106106

107107

108108
@convert_django_field.register(models.OneToOneRel)
@@ -114,7 +114,7 @@ def dynamic_type():
114114
if not _type:
115115
return
116116

117-
return Field(_type)
117+
return Field(_type, required=not field.null)
118118

119119
return Dynamic(dynamic_type)
120120

@@ -149,7 +149,7 @@ def dynamic_type():
149149
return
150150

151151
if isinstance(field.field, models.OneToOneField):
152-
return Field(_type)
152+
return Field(_type, required=not field.field.null)
153153

154154
if is_node(_type):
155155
return get_connection_field(_type)
@@ -168,7 +168,7 @@ def dynamic_type():
168168
if not _type:
169169
return
170170

171-
return Field(_type, description=field.help_text)
171+
return Field(_type, description=field.help_text, required=not field.null)
172172

173173
return Dynamic(dynamic_type)
174174

@@ -178,18 +178,18 @@ def convert_postgres_array_to_list(field, registry=None):
178178
base_type = convert_django_field(field.base_field)
179179
if not isinstance(base_type, (List, NonNull)):
180180
base_type = type(base_type)
181-
return List(base_type, description=field.help_text)
181+
return List(base_type, description=field.help_text, required=not field.null)
182182

183183

184184
@convert_django_field.register(HStoreField)
185185
@convert_django_field.register(JSONField)
186186
def convert_posgres_field_to_string(field, registry=None):
187-
return JSONString(description=field.help_text)
187+
return JSONString(description=field.help_text, required=not field.null)
188188

189189

190190
@convert_django_field.register(RangeField)
191191
def convert_posgres_range_to_string(field, registry=None):
192192
inner_type = convert_django_field(field.base_field)
193193
if not isinstance(inner_type, (List, NonNull)):
194194
inner_type = type(inner_type)
195-
return List(inner_type, description=field.help_text)
195+
return List(inner_type, description=field.help_text, required=not field.null)

graphene_django/form_converter.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -34,13 +34,13 @@ def convert_form_field(field):
3434
@convert_form_field.register(forms.Field)
3535
@convert_form_field.register(UUIDField)
3636
def convert_form_field_to_string(field):
37-
return String(description=field.help_text)
37+
return String(description=field.help_text, required=field.required)
3838

3939

4040
@convert_form_field.register(forms.IntegerField)
4141
@convert_form_field.register(forms.NumberInput)
4242
def convert_form_field_to_int(field):
43-
return Int(description=field.help_text)
43+
return Int(description=field.help_text, required=field.required)
4444

4545

4646
@convert_form_field.register(forms.BooleanField)
@@ -56,16 +56,16 @@ def convert_form_field_to_nullboolean(field):
5656
@convert_form_field.register(forms.DecimalField)
5757
@convert_form_field.register(forms.FloatField)
5858
def convert_form_field_to_float(field):
59-
return Float(description=field.help_text)
59+
return Float(description=field.help_text, required=field.required)
6060

6161

6262
@convert_form_field.register(forms.ModelMultipleChoiceField)
6363
@convert_form_field.register(GlobalIDMultipleChoiceField)
6464
def convert_form_field_to_list(field):
65-
return List(ID)
65+
return List(ID, required=field.required)
6666

6767

6868
@convert_form_field.register(forms.ModelChoiceField)
6969
@convert_form_field.register(GlobalIDFormField)
7070
def convert_form_field_to_id(field):
71-
return ID()
71+
return ID(required=field.required)

graphene_django/tests/test_converter.py

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -226,24 +226,27 @@ class Meta:
226226
assert isinstance(graphene_field, graphene.Dynamic)
227227
dynamic_field = graphene_field.get_type()
228228
assert isinstance(dynamic_field, graphene.Field)
229-
assert dynamic_field.type == A
229+
assert isinstance(dynamic_field.type, graphene.NonNull)
230+
assert dynamic_field.of_type.type == A
230231

231232

232233
@pytest.mark.skipif(ArrayField is MissingType,
233234
reason="ArrayField should exist")
234235
def test_should_postgres_array_convert_list():
235236
field = assert_conversion(ArrayField, graphene.List, models.CharField(max_length=100))
236-
assert isinstance(field.type, graphene.List)
237-
assert field.type.of_type == graphene.String
237+
assert isinstance(field.type, graphene.NonNull)
238+
assert isinstance(field.type.of_type, graphene.List)
239+
assert field.type.of_type.of_type == graphene.String
238240

239241

240242
@pytest.mark.skipif(ArrayField is MissingType,
241243
reason="ArrayField should exist")
242244
def test_should_postgres_array_multiple_convert_list():
243245
field = assert_conversion(ArrayField, graphene.List, ArrayField(models.CharField(max_length=100)))
244-
assert isinstance(field.type, graphene.List)
246+
assert isinstance(field.type, graphene.NonNull)
245247
assert isinstance(field.type.of_type, graphene.List)
246-
assert field.type.of_type.of_type == graphene.String
248+
assert isinstance(field.type.of_type.of_type, graphene.List)
249+
assert field.type.of_type.of_type.of_type == graphene.String
247250

248251

249252
@pytest.mark.skipif(HStoreField is MissingType,
@@ -263,5 +266,6 @@ def test_should_postgres_json_convert_string():
263266
def test_should_postgres_range_convert_list():
264267
from django.contrib.postgres.fields import IntegerRangeField
265268
field = assert_conversion(IntegerRangeField, graphene.List)
266-
assert isinstance(field.type, graphene.List)
267-
assert field.type.of_type == graphene.Int
269+
assert isinstance(field.type, graphene.NonNull)
270+
assert isinstance(field.type.of_type, graphene.List)
271+
assert field.type.of_type.of_type == graphene.Int

graphene_django/tests/test_types.py

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -63,10 +63,10 @@ def test_schema_representation():
6363
6464
type Article implements Node {
6565
id: ID!
66-
headline: String
67-
pubDate: DateTime
68-
reporter: Reporter
69-
lang: ArticleLang
66+
headline: String!
67+
pubDate: DateTime!
68+
reporter: Reporter!
69+
lang: ArticleLang!
7070
importance: ArticleImportance
7171
}
7272
@@ -104,12 +104,12 @@ def test_schema_representation():
104104
}
105105
106106
type Reporter {
107-
id: ID
108-
firstName: String
109-
lastName: String
110-
email: String
107+
id: ID!
108+
firstName: String!
109+
lastName: String!
110+
email: String!
111111
pets: [Reporter]
112-
aChoice: ReporterA_choice
112+
aChoice: ReporterA_choice!
113113
articles(before: String, after: String, first: Int, last: Int): ArticleConnection
114114
}
115115

0 commit comments

Comments
 (0)