From 5117e53d0e08c84c21a8fd9d5ca3a689773f7aef Mon Sep 17 00:00:00 2001 From: Maxim Date: Mon, 5 Aug 2019 12:39:03 +0600 Subject: [PATCH 1/3] add support for enums in sqlalchemy ChoiceType --- graphene_sqlalchemy/converter.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/graphene_sqlalchemy/converter.py b/graphene_sqlalchemy/converter.py index 2bf32f5e..fab847d0 100644 --- a/graphene_sqlalchemy/converter.py +++ b/graphene_sqlalchemy/converter.py @@ -7,6 +7,7 @@ String) from graphene.types.json import JSONString +from enum import EnumMeta from .enums import enum_for_sa_enum from .registry import get_global_registry @@ -167,7 +168,12 @@ def convert_enum_to_enum(type, column, registry=None): @convert_sqlalchemy_type.register(ChoiceType) def convert_choice_to_enum(type, column, registry=None): name = "{}_{}".format(column.table.name, column.name).upper() - return Enum(name, type.choices) + if isinstance(type.choices, EnumMeta): + # type.choices may be Enum/IntEnum, in ChoiceType both presented as EnumMeta + # do not use from_enum here because we can have more than one enum column in table + return Enum(name, list((v.name, v.value) for v in type.choices)) + else: + return Enum(name, type.choices) @convert_sqlalchemy_type.register(ScalarListType) From bdd5d836bde2a897f28041e9f8aa492cd6df1b24 Mon Sep 17 00:00:00 2001 From: Maxim Romanyuk Date: Thu, 15 Aug 2019 00:37:28 +0600 Subject: [PATCH 2/3] add tests --- graphene_sqlalchemy/converter.py | 4 ++-- graphene_sqlalchemy/tests/test_converter.py | 26 +++++++++++++++++++++ 2 files changed, 28 insertions(+), 2 deletions(-) diff --git a/graphene_sqlalchemy/converter.py b/graphene_sqlalchemy/converter.py index f4af249e..898a1bed 100644 --- a/graphene_sqlalchemy/converter.py +++ b/graphene_sqlalchemy/converter.py @@ -1,3 +1,5 @@ +from enum import EnumMeta + from singledispatch import singledispatch from sqlalchemy import types from sqlalchemy.dialects import postgresql @@ -7,7 +9,6 @@ String) from graphene.types.json import JSONString -from enum import EnumMeta from .enums import enum_for_sa_enum from .registry import get_global_registry @@ -160,7 +161,6 @@ def convert_enum_to_enum(type, column, registry=None): return lambda: enum_for_sa_enum(type, registry or get_global_registry()) -# TODO Make ChoiceType conversion consistent with other enums @convert_sqlalchemy_type.register(ChoiceType) def convert_choice_to_enum(type, column, registry=None): name = "{}_{}".format(column.table.name, column.name).upper() diff --git a/graphene_sqlalchemy/tests/test_converter.py b/graphene_sqlalchemy/tests/test_converter.py index efee91aa..64fe0261 100644 --- a/graphene_sqlalchemy/tests/test_converter.py +++ b/graphene_sqlalchemy/tests/test_converter.py @@ -145,6 +145,32 @@ def test_should_choice_convert_enum(): assert graphene_type._meta.enum.__members__["en"].value == "English" +def test_should_enum_choice_convert_enum(): + class TestEnum(enum.Enum): + es = u"Spanish" + en = u"English" + + field = get_field(ChoiceType(TestEnum, impl=types.String())) + graphene_type = field.type + assert issubclass(graphene_type, graphene.Enum) + assert graphene_type._meta.name == "MODEL_COLUMN" + assert graphene_type._meta.enum.__members__["es"].value == "Spanish" + assert graphene_type._meta.enum.__members__["en"].value == "English" + + +def test_should_intenum_choice_convert_enum(): + class TestEnum(enum.IntEnum): + one = 1 + two = 2 + + field = get_field(ChoiceType(TestEnum, impl=types.String())) + graphene_type = field.type + assert issubclass(graphene_type, graphene.Enum) + assert graphene_type._meta.name == "MODEL_COLUMN" + assert graphene_type._meta.enum.__members__["one"].value == 1 + assert graphene_type._meta.enum.__members__["two"].value == 2 + + def test_should_columproperty_convert(): field = get_field_from_column(column_property( select([func.sum(func.cast(id, types.Integer))]).where(id == 1) From 64aa28b0eb627f793e8452bdf03d239b5fb8dae2 Mon Sep 17 00:00:00 2001 From: Maxim Date: Tue, 27 Aug 2019 14:24:58 +0600 Subject: [PATCH 3/3] bring back choicetype todo --- graphene_sqlalchemy/converter.py | 1 + 1 file changed, 1 insertion(+) diff --git a/graphene_sqlalchemy/converter.py b/graphene_sqlalchemy/converter.py index 898a1bed..5512fc88 100644 --- a/graphene_sqlalchemy/converter.py +++ b/graphene_sqlalchemy/converter.py @@ -161,6 +161,7 @@ def convert_enum_to_enum(type, column, registry=None): return lambda: enum_for_sa_enum(type, registry or get_global_registry()) +# TODO Make ChoiceType conversion consistent with other enums @convert_sqlalchemy_type.register(ChoiceType) def convert_choice_to_enum(type, column, registry=None): name = "{}_{}".format(column.table.name, column.name).upper()