Skip to content

Commit 4a77d88

Browse files
committed
Merge branch 'master' into features/2.0
2 parents 9d1e3c6 + cf2ba9c commit 4a77d88

File tree

2 files changed

+27
-3
lines changed

2 files changed

+27
-3
lines changed

graphene_sqlalchemy/converter.py

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
from .fields import SQLAlchemyConnectionField
1111

1212
try:
13-
from sqlalchemy_utils import ChoiceType, JSONType, ScalarListType
13+
from sqlalchemy_utils import ChoiceType, JSONType, ScalarListType, TSVectorType
1414
except ImportError:
1515
class ChoiceType(object):
1616
pass
@@ -47,7 +47,10 @@ def dynamic_type():
4747
return Field(List(_type))
4848

4949
return Dynamic(dynamic_type)
50-
50+
51+
def convert_sqlalchemy_hybrid_method(hybrid_item):
52+
return String(description=getattr(hybrid_item, '__doc__', None),
53+
required=False)
5154

5255
def convert_sqlalchemy_composite(composite, registry):
5356
converter = registry.get_converter_for_composite(composite.composite_class)
@@ -96,6 +99,7 @@ def convert_sqlalchemy_type(type, column, registry=None):
9699
@convert_sqlalchemy_type.register(types.Enum)
97100
@convert_sqlalchemy_type.register(postgresql.ENUM)
98101
@convert_sqlalchemy_type.register(postgresql.UUID)
102+
@convert_sqlalchemy_type.register(TSVectorType)
99103
def convert_column_to_string(type, column, registry=None):
100104
return String(description=get_column_doc(column),
101105
required=not(is_column_nullable(column)))

graphene_sqlalchemy/types.py

Lines changed: 21 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
from collections import OrderedDict
22

33
from sqlalchemy.inspection import inspect as sqlalchemyinspect
4+
from sqlalchemy.ext.hybrid import hybrid_property
45
from sqlalchemy.orm.exc import NoResultFound
56

67
from graphene import Field # , annotate, ResolveInfo
@@ -10,7 +11,8 @@
1011

1112
from .converter import (convert_sqlalchemy_column,
1213
convert_sqlalchemy_composite,
13-
convert_sqlalchemy_relationship)
14+
convert_sqlalchemy_relationship,
15+
convert_sqlalchemy_hybrid_method)
1416
from .registry import Registry, get_global_registry
1517
from .utils import get_query, is_mapped
1618

@@ -42,6 +44,24 @@ def construct_fields(model, registry, only_fields, exclude_fields):
4244
converted_composite = convert_sqlalchemy_composite(composite, registry)
4345
fields[name] = converted_composite
4446

47+
for hybrid_item in inspected_model.all_orm_descriptors:
48+
49+
if type(hybrid_item) == hybrid_property:
50+
name = hybrid_item.__name__
51+
52+
is_not_in_only = only_fields and name not in only_fields
53+
is_already_created = name in options.fields
54+
is_excluded = name in exclude_fields or is_already_created
55+
56+
if is_not_in_only or is_excluded:
57+
# We skip this field if we specify only_fields and is not
58+
# in there. Or when we excldue this field in exclude_fields
59+
60+
continue
61+
converted_hybrid_property = convert_sqlalchemy_hybrid_method(
62+
hybrid_item)
63+
fields[name] = converted_hybrid_property
64+
4565
# Get all the columns for the relationships on the model
4666
for relationship in inspected_model.relationships:
4767
is_not_in_only = only_fields and relationship.key not in only_fields

0 commit comments

Comments
 (0)