From ea624964cf0a6d9c9db66bf31823ce2ab95afbf0 Mon Sep 17 00:00:00 2001 From: Joshua Cannon Date: Mon, 1 Apr 2019 11:44:44 -0500 Subject: [PATCH] Fix #196 - handle ChoiceType initialized with Enum --- graphene_sqlalchemy/converter.py | 7 ++++++- graphene_sqlalchemy/tests/test_converter.py | 16 +++++++++++++++- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/graphene_sqlalchemy/converter.py b/graphene_sqlalchemy/converter.py index 72089613..0b0ce8e4 100644 --- a/graphene_sqlalchemy/converter.py +++ b/graphene_sqlalchemy/converter.py @@ -162,7 +162,12 @@ def convert_enum_to_enum(type, column, registry=None): @convert_sqlalchemy_type.register(ChoiceType) def convert_column_to_enum(type, column, registry=None): name = "{}_{}".format(column.table.name, column.name).upper() - return Enum(name, type.choices, description=get_column_doc(column)) + enum_members = getattr(type.choices, "__members__", None) + if enum_members: # Check if an enum.Enum is used + items = [(item.name, item.value) for item in enum_members.values()] + else: # Nope, just a list of items + items = type.choices + return Enum(name, items, description=get_column_doc(column)) @convert_sqlalchemy_type.register(ScalarListType) diff --git a/graphene_sqlalchemy/tests/test_converter.py b/graphene_sqlalchemy/tests/test_converter.py index c6c49bba..1bf05183 100644 --- a/graphene_sqlalchemy/tests/test_converter.py +++ b/graphene_sqlalchemy/tests/test_converter.py @@ -142,7 +142,7 @@ def test_should_label_convert_int(): assert isinstance(graphene_type, graphene.Int) -def test_should_choice_convert_enum(): +def test_should_choice_convert_list(): TYPES = [(u"es", u"Spanish"), (u"en", u"English")] column = Column(ChoiceType(TYPES), doc="Language", name="language") Base = declarative_base() @@ -156,6 +156,20 @@ def test_should_choice_convert_enum(): assert graphene_type._meta.enum.__members__["en"].value == "English" +def test_should_choice_convert_enum(): + TYPES = enum.Enum("TYPES", [(u"es", u"Spanish"), (u"en", u"English")]) + column = Column(ChoiceType(TYPES), doc="Language", name="language") + Base = declarative_base() + + Table("translatedmodel", Base.metadata, column) + graphene_type = convert_sqlalchemy_column(column) + assert issubclass(graphene_type, graphene.Enum) + assert graphene_type._meta.name == "TRANSLATEDMODEL_LANGUAGE" + assert graphene_type._meta.description == "Language" + assert graphene_type._meta.enum.__members__["es"].value == "Spanish" + assert graphene_type._meta.enum.__members__["en"].value == "English" + + def test_should_columproperty_convert(): Base = declarative_base()