From 98de5923030b766a7c9f9c8ae64cebd4e095f6d4 Mon Sep 17 00:00:00 2001 From: "melvanlonden@canvasmedical.com" Date: Wed, 20 Mar 2019 21:20:10 -0600 Subject: [PATCH 1/2] support blank fields with choices --- .gitignore | 4 ++++ graphene_django/converter.py | 2 ++ graphene_django/tests/test_converter.py | 18 +++++++++++++++++- graphene_django/tests/test_types.py | 2 ++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/.gitignore b/.gitignore index 0b256254b..714cf409d 100644 --- a/.gitignore +++ b/.gitignore @@ -78,3 +78,7 @@ Session.vim *~ # auto-generated tag files tags + +# Pipenv +Pipfile +Pipfile.lock diff --git a/graphene_django/converter.py b/graphene_django/converter.py index c40313df0..8d047391d 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -62,6 +62,8 @@ def convert_django_field_with_choices(field, registry=None): meta = field.model._meta name = to_camel_case("{}_{}".format(meta.object_name, field.name)) choices = list(get_choices(choices)) + if field.blank: + choices.append(('EMPTY', '', '')) named_choices = [(c[0], c[1]) for c in choices] named_choices_descriptions = {c[0]: c[2] for c in choices} diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index 5dc0184c1..e44ecb952 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -196,6 +196,22 @@ class Meta: convert_django_field_with_choices(field) +def test_field_with_blank(): + field = models.CharField( + help_text="Language", choices=(("es", "Spanish"), ("en", "English")), blank=True + ) + + class TranslatedModel(models.Model): + language = field + + class Meta: + app_label = "test" + + graphene_type = convert_django_field_with_choices(field) + assert graphene_type._meta.enum.__members__["EMPTY"].value == "" + assert graphene_type._meta.enum.__members__["EMPTY"].description == "" + + def test_should_float_convert_float(): assert_conversion(models.FloatField, graphene.Float) @@ -241,7 +257,7 @@ class A(DjangoObjectType): class Meta: model = Article - graphene_field = convert_django_field(Reporter.articles.rel, + graphene_field = convert_django_field(Reporter.articles.rel, A._meta.registry) assert isinstance(graphene_field, graphene.Dynamic) dynamic_field = graphene_field.get_type() diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index 8a8643b9b..0f1812378 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -138,6 +138,7 @@ def test_schema_representation(): enum ArticleImportance { A_1 A_2 + EMPTY } enum ArticleLang { @@ -179,6 +180,7 @@ def test_schema_representation(): enum ReporterReporterType { A_1 A_2 + EMPTY } type RootQuery { From 4732b34bd75da985e0e4def90bfc46b65ba303ee Mon Sep 17 00:00:00 2001 From: mvanlonden Date: Tue, 26 Mar 2019 16:50:50 -0500 Subject: [PATCH 2/2] add field default value to generated enum --- graphene_django/converter.py | 7 +++++-- graphene_django/tests/test_converter.py | 24 ++++++++++++++++++++---- graphene_django/tests/test_types.py | 2 -- 3 files changed, 25 insertions(+), 8 deletions(-) diff --git a/graphene_django/converter.py b/graphene_django/converter.py index 8d047391d..435d9b6ee 100644 --- a/graphene_django/converter.py +++ b/graphene_django/converter.py @@ -62,8 +62,11 @@ def convert_django_field_with_choices(field, registry=None): meta = field.model._meta name = to_camel_case("{}_{}".format(meta.object_name, field.name)) choices = list(get_choices(choices)) - if field.blank: - choices.append(('EMPTY', '', '')) + default = field.get_default() + if default: + choices_include_default = bool([choice for choice in field.choices if choice[0] == default]) + if not choices_include_default: + choices.append(('DEFAULT', default, 'default value')) named_choices = [(c[0], c[1]) for c in choices] named_choices_descriptions = {c[0]: c[2] for c in choices} diff --git a/graphene_django/tests/test_converter.py b/graphene_django/tests/test_converter.py index e44ecb952..3577092b7 100644 --- a/graphene_django/tests/test_converter.py +++ b/graphene_django/tests/test_converter.py @@ -196,9 +196,9 @@ class Meta: convert_django_field_with_choices(field) -def test_field_with_blank(): +def test_field_with_choices_and_default(): field = models.CharField( - help_text="Language", choices=(("es", "Spanish"), ("en", "English")), blank=True + help_text="Language", choices=(("es", "Spanish"), ("en", "English")), default="nl" ) class TranslatedModel(models.Model): @@ -208,8 +208,24 @@ class Meta: app_label = "test" graphene_type = convert_django_field_with_choices(field) - assert graphene_type._meta.enum.__members__["EMPTY"].value == "" - assert graphene_type._meta.enum.__members__["EMPTY"].description == "" + assert graphene_type._meta.enum.__members__["DEFAULT"].value == "nl" + assert graphene_type._meta.enum.__members__["DEFAULT"].description == "default value" + + +def test_field_with_default_in_choices(): + field = models.CharField( + help_text="Language", choices=(("es", "Spanish"), ("en", "English")), default="es" + ) + + class TranslatedModel(models.Model): + language = field + + class Meta: + app_label = "test" + + graphene_type = convert_django_field_with_choices(field) + + assert "DEFAULT" not in graphene_type._meta.enum.__members__ def test_should_float_convert_float(): diff --git a/graphene_django/tests/test_types.py b/graphene_django/tests/test_types.py index 0f1812378..8a8643b9b 100644 --- a/graphene_django/tests/test_types.py +++ b/graphene_django/tests/test_types.py @@ -138,7 +138,6 @@ def test_schema_representation(): enum ArticleImportance { A_1 A_2 - EMPTY } enum ArticleLang { @@ -180,7 +179,6 @@ def test_schema_representation(): enum ReporterReporterType { A_1 A_2 - EMPTY } type RootQuery {