Skip to content

Commit 6b4b63c

Browse files
committed
scope down
1 parent c50b265 commit 6b4b63c

File tree

4 files changed

+23
-36
lines changed

4 files changed

+23
-36
lines changed

graphene_sqlalchemy/converter.py

Lines changed: 8 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,9 @@
33
from singledispatch import singledispatch
44
from sqlalchemy import inspect, types
55
from sqlalchemy.dialects import postgresql
6-
from sqlalchemy.ext.associationproxy import AssociationProxy
76
from sqlalchemy.ext.hybrid import hybrid_property
87
from sqlalchemy.orm import (ColumnProperty, CompositeProperty,
9-
interfaces, RelationshipProperty,
10-
strategies)
8+
RelationshipProperty, interfaces, strategies)
119
from sqlalchemy.orm.attributes import InstrumentedAttribute
1210

1311
from graphene import (ID, Boolean, Dynamic, Enum, Field, Float, Int, List,
@@ -46,34 +44,18 @@ def convert_sqlalchemy_association_proxy(association_prop, obj_type, registry, c
4644
attr = inspect(attr).property
4745

4846
def dynamic_type():
49-
if isinstance(attr, AssociationProxy):
50-
return convert_sqlalchemy_association_proxy(
47+
if isinstance(attr, ColumnProperty):
48+
field = convert_sqlalchemy_column(
5149
attr,
52-
obj_type,
5350
registry,
54-
connection_field_factory,
55-
batching,
5651
resolver,
5752
**field_kwargs
5853
)
59-
elif isinstance(attr, ColumnProperty):
60-
# similar to convert_sqlalchemy_column, but supports lists
61-
column = attr.columns[0]
62-
type_ = field_kwargs.pop('type', convert_sqlalchemy_type(getattr(column, "type", None), column, registry))
63-
field_kwargs.setdefault('required', not is_column_nullable(column))
64-
field_kwargs.setdefault('description', get_column_doc(column))
65-
66-
return Field(
67-
type_ if association_prop.scalar else List(type_),
68-
resolver=resolver,
69-
**field_kwargs
70-
)
71-
elif isinstance(attr, CompositeProperty):
72-
return convert_sqlalchemy_composite(
73-
attr,
74-
registry,
75-
resolver
76-
)
54+
if not association_prop.scalar:
55+
# repackage as List
56+
field.__dict__['_type'] = List(field.type)
57+
58+
return field
7759
elif isinstance(attr, RelationshipProperty):
7860
batching_ = field_kwargs.pop('batching', batching)
7961
return convert_sqlalchemy_relationship(
@@ -85,12 +67,6 @@ def dynamic_type():
8567
**field_kwargs
8668
# resolve Dynamic type
8769
).get_type()
88-
elif isinstance(attr, hybrid_property):
89-
return convert_sqlalchemy_hybrid_method(
90-
attr,
91-
resolver,
92-
**field_kwargs
93-
)
9470

9571
raise NotImplementedError(attr)
9672

graphene_sqlalchemy/tests/models.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ class Reporter(Base):
6666
articles = relationship("Article", backref="reporter")
6767
favorite_article = relationship("Article", uselist=False)
6868

69-
pet_names = association_proxy('pets', 'name')
70-
7169
@hybrid_property
7270
def hybrid_prop(self):
7371
return self.first_name
@@ -78,6 +76,8 @@ def hybrid_prop(self):
7876

7977
composite_prop = composite(CompositeFullName, first_name, last_name, doc="Composite")
8078

79+
pet_names = association_proxy('pets', 'name')
80+
8181

8282
class Article(Base):
8383
__tablename__ = "articles"

graphene_sqlalchemy/tests/test_types.py

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,8 @@ class Meta:
8383
"composite_prop",
8484
# Hybrid
8585
"hybrid_prop",
86+
# AssociationProxy
87+
"pet_names",
8688
# Relationship
8789
"pets",
8890
"articles",
@@ -118,6 +120,11 @@ class Meta:
118120
assert favorite_article_field.type().type == ArticleType
119121
assert favorite_article_field.type().description is None
120122

123+
# assocation proxy
124+
assoc_prop = ReporterType._meta.fields['pet_names']
125+
assert isinstance(assoc_prop, Dynamic)
126+
assert assoc_prop.type().type == List(String)
127+
121128

122129
def test_sqlalchemy_override_fields():
123130
@convert_sqlalchemy_composite.register(CompositeFullName)
@@ -179,6 +186,7 @@ class Meta:
179186
# Then the automatic SQLAlchemy fields
180187
"id",
181188
"favorite_pet_kind",
189+
"pet_names",
182190
]
183191

184192
first_name_field = ReporterType._meta.fields['first_name']
@@ -276,6 +284,7 @@ class Meta:
276284
"favorite_pet_kind",
277285
"composite_prop",
278286
"hybrid_prop",
287+
"pet_names",
279288
"pets",
280289
"articles",
281290
"favorite_article",
@@ -384,7 +393,7 @@ class Meta:
384393

385394
assert issubclass(CustomReporterType, ObjectType)
386395
assert CustomReporterType._meta.model == Reporter
387-
assert len(CustomReporterType._meta.fields) == 11
396+
assert len(CustomReporterType._meta.fields) == 12
388397

389398

390399
# Test Custom SQLAlchemyObjectType with Custom Options

graphene_sqlalchemy/types.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,9 @@ def construct_fields(
116116
inspected_model.column_attrs.items() +
117117
inspected_model.composites.items() +
118118
[(name, item) for name, item in inspected_model.all_orm_descriptors.items()
119-
if isinstance(item, (AssociationProxy, hybrid_property))] +
119+
if isinstance(item, hybrid_property)] +
120+
[(name, item) for name, item in inspected_model.all_orm_descriptors.items()
121+
if isinstance(item, AssociationProxy)] +
120122
inspected_model.relationships.items()
121123
)
122124

0 commit comments

Comments
 (0)