Skip to content

Commit dccbe22

Browse files
committed
BREAKING: Sort Enums & ChoiceType enums are now generated from Column.key instead of Column.name, see #330
Signed-off-by: Erik Wrede <erikwrede2@gmail.com>
1 parent 2a89227 commit dccbe22

File tree

5 files changed

+47
-8
lines changed

5 files changed

+47
-8
lines changed

graphene_sqlalchemy/converter.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from sqlalchemy.dialects import postgresql
1010
from sqlalchemy.orm import interfaces, strategies
1111

12-
from graphene import (ID, Boolean, Date, Time, DateTime, Dynamic, Enum, Field, Float,
13-
Int, List, String, Time, UUID)
12+
from graphene import (ID, UUID, Boolean, Date, DateTime, Dynamic, Enum, Field,
13+
Float, Int, List, String, Time)
1414
from graphene.types.json import JSONString
1515

1616
from .batching import get_batch_resolver
@@ -253,7 +253,7 @@ def convert_enum_to_enum(type, column, registry=None):
253253
# TODO Make ChoiceType conversion consistent with other enums
254254
@convert_sqlalchemy_type.register(ChoiceType)
255255
def convert_choice_to_enum(type, column, registry=None):
256-
name = "{}_{}".format(column.table.name, column.name).upper()
256+
name = "{}_{}".format(column.table.name, column.key).upper()
257257
if isinstance(type.type_impl, EnumTypeImpl):
258258
# type.choices may be Enum/IntEnum, in ChoiceType both presented as EnumMeta
259259
# do not use from_enum here because we can have more than one enum column in table

graphene_sqlalchemy/enums.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -144,9 +144,9 @@ def sort_enum_for_object_type(
144144
column = orm_field.columns[0]
145145
if only_indexed and not (column.primary_key or column.index):
146146
continue
147-
asc_name = get_name(column.name, True)
147+
asc_name = get_name(column.key, True)
148148
asc_value = EnumValue(asc_name, column.asc())
149-
desc_name = get_name(column.name, False)
149+
desc_name = get_name(column.key, False)
150150
desc_value = EnumValue(desc_name, column.desc())
151151
if column.primary_key:
152152
default.append(asc_value)

graphene_sqlalchemy/tests/models.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,8 @@
55
from decimal import Decimal
66
from typing import List, Optional, Tuple
77

8-
from sqlalchemy import (Column, Date, Enum, ForeignKey, Integer, String, Table,
9-
func, select)
8+
from sqlalchemy import (Column, Date, Enum, ForeignKey, Integer, Numeric,
9+
String, Table, func, select)
1010
from sqlalchemy.ext.declarative import declarative_base
1111
from sqlalchemy.ext.hybrid import hybrid_property
1212
from sqlalchemy.orm import column_property, composite, mapper, relationship
@@ -228,3 +228,8 @@ def hybrid_prop_self_referential_list(self) -> List['ShoppingCart']:
228228
@hybrid_property
229229
def hybrid_prop_optional_self_referential(self) -> Optional['ShoppingCart']:
230230
return None
231+
232+
class KeyedModel(Base):
233+
__tablename__ = "test330"
234+
id = Column(Integer(), primary_key=True)
235+
reporter_number = Column("% reporter_number", Numeric, key="reporter_number")

graphene_sqlalchemy/tests/test_converter.py

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,22 @@ class TestEnum(enum.Enum):
163163
assert graphene_type._meta.enum.__members__["en"].value == "English"
164164

165165

166+
def test_choice_enum_column_key_name_issue_301():
167+
'Support column.key instead of column.name for enum naming'
168+
class TestEnum(enum.Enum):
169+
es = u"Spanish"
170+
en = u"English"
171+
172+
testChoice = Column("% descuento1", ChoiceType(TestEnum, impl=types.String()), key="descuento1")
173+
field = get_field_from_column(testChoice)
174+
175+
graphene_type = field.type
176+
assert issubclass(graphene_type, graphene.Enum)
177+
assert graphene_type._meta.name == "MODEL_DESCUENTO1"
178+
assert graphene_type._meta.enum.__members__["es"].value == "Spanish"
179+
assert graphene_type._meta.enum.__members__["en"].value == "English"
180+
181+
166182
def test_should_intenum_choice_convert_enum():
167183
class TestEnum(enum.IntEnum):
168184
one = 1

graphene_sqlalchemy/tests/test_sort_enums.py

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
from ..fields import SQLAlchemyConnectionField
88
from ..types import SQLAlchemyObjectType
99
from ..utils import to_type_name
10-
from .models import Base, HairKind, Pet
10+
from .models import Base, HairKind, KeyedModel, Pet
1111
from .test_query import to_std_dicts
1212

1313

@@ -383,3 +383,21 @@ def makeNodes(nodeList):
383383
assert [node["node"]["name"] for node in result.data["noSort"]["edges"]] == [
384384
node["node"]["name"] for node in result.data["noDefaultSort"]["edges"]
385385
]
386+
387+
388+
def test_sort_enum_from_key_issue_330():
389+
class KeyedType(SQLAlchemyObjectType):
390+
class Meta:
391+
model = KeyedModel
392+
393+
sort_enum = KeyedType.sort_enum()
394+
assert isinstance(sort_enum, type(Enum))
395+
assert sort_enum._meta.name == "KeyedTypeSortEnum"
396+
assert list(sort_enum._meta.enum.__members__) == [
397+
"ID_ASC",
398+
"ID_DESC",
399+
"REPORTER_NUMBER_ASC",
400+
"REPORTER_NUMBER_DESC",
401+
]
402+
assert str(sort_enum.REPORTER_NUMBER_ASC.value.value) == 'test330."% reporter_number" ASC'
403+
assert str(sort_enum.REPORTER_NUMBER_DESC.value.value) == 'test330."% reporter_number" DESC'

0 commit comments

Comments
 (0)