11
11
from .fields import SQLAlchemyConnectionField
12
12
13
13
try :
14
- from sqlalchemy_utils import ChoiceType , JSONType , ScalarListType
14
+ from sqlalchemy_utils import ChoiceType , JSONType , ScalarListType , TSVectorType
15
15
except ImportError :
16
16
class ChoiceType (object ):
17
17
pass
@@ -23,6 +23,14 @@ class JSONType(object):
23
23
pass
24
24
25
25
26
+ def get_column_doc (column ):
27
+ return getattr (column , 'doc' , None )
28
+
29
+
30
+ def is_column_nullable (column ):
31
+ return bool (getattr (column , 'nullable' , True ))
32
+
33
+
26
34
def convert_sqlalchemy_relationship (relationship , registry ):
27
35
direction = relationship .direction
28
36
model = relationship .mapper .entity
@@ -40,7 +48,10 @@ def dynamic_type():
40
48
return Field (List (_type ))
41
49
42
50
return Dynamic (dynamic_type )
43
-
51
+
52
+ def convert_sqlalchemy_hybrid_method (hybrid_item ):
53
+ return String (description = getattr (hybrid_item , '__doc__' , None ),
54
+ required = False )
44
55
45
56
def convert_sqlalchemy_composite (composite , registry ):
46
57
converter = registry .get_converter_for_composite (composite .composite_class )
@@ -66,6 +77,7 @@ def inner(fn):
66
77
registry .register_composite_converter (cls , fn )
67
78
return inner
68
79
80
+
69
81
convert_sqlalchemy_composite .register = _register_composite_class
70
82
71
83
@@ -80,7 +92,6 @@ def convert_sqlalchemy_type(type, column, registry=None):
80
92
81
93
82
94
@convert_sqlalchemy_type .register (types .Date )
83
- @convert_sqlalchemy_type .register (types .DateTime )
84
95
@convert_sqlalchemy_type .register (types .Time )
85
96
@convert_sqlalchemy_type .register (types .String )
86
97
@convert_sqlalchemy_type .register (types .Text )
@@ -89,56 +100,66 @@ def convert_sqlalchemy_type(type, column, registry=None):
89
100
@convert_sqlalchemy_type .register (types .Enum )
90
101
@convert_sqlalchemy_type .register (postgresql .ENUM )
91
102
@convert_sqlalchemy_type .register (postgresql .UUID )
103
+ @convert_sqlalchemy_type .register (TSVectorType )
92
104
def convert_column_to_string (type , column , registry = None ):
93
- return String (description = getattr (column , 'doc' , None ),
94
- required = not (getattr (column , 'nullable' , True )))
105
+ return String (description = get_column_doc (column ),
106
+ required = not (is_column_nullable (column )))
107
+
108
+
109
+ @convert_sqlalchemy_type .register (types .DateTime )
110
+ def convert_column_to_datetime (type , column , registry = None ):
111
+ from graphene .types .datetime import DateTime
112
+ return DateTime (description = get_column_doc (column ),
113
+ required = not (is_column_nullable (column )))
95
114
96
115
97
116
@convert_sqlalchemy_type .register (types .SmallInteger )
98
- @convert_sqlalchemy_type .register (types .BigInteger )
99
117
@convert_sqlalchemy_type .register (types .Integer )
100
118
def convert_column_to_int_or_id (type , column , registry = None ):
101
119
if column .primary_key :
102
- return ID (description = column . doc , required = not ( column . nullable ))
120
+ return ID (description = get_column_doc ( column ) , required = not ( is_column_nullable ( column ) ))
103
121
else :
104
- return Int (description = column .doc , required = not (column .nullable ))
122
+ return Int (description = get_column_doc (column ),
123
+ required = not (is_column_nullable (column )))
105
124
106
125
107
126
@convert_sqlalchemy_type .register (types .Boolean )
108
127
def convert_column_to_boolean (type , column , registry = None ):
109
- return Boolean (description = column . doc , required = not (column . nullable ))
128
+ return Boolean (description = get_column_doc ( column ) , required = not (is_column_nullable ( column ) ))
110
129
111
130
112
131
@convert_sqlalchemy_type .register (types .Float )
113
132
@convert_sqlalchemy_type .register (types .Numeric )
133
+ @convert_sqlalchemy_type .register (types .BigInteger )
114
134
def convert_column_to_float (type , column , registry = None ):
115
- return Float (description = column . doc , required = not (column . nullable ))
135
+ return Float (description = get_column_doc ( column ) , required = not (is_column_nullable ( column ) ))
116
136
117
137
118
138
@convert_sqlalchemy_type .register (ChoiceType )
119
139
def convert_column_to_enum (type , column , registry = None ):
120
140
name = '{}_{}' .format (column .table .name , column .name ).upper ()
121
- return Enum (name , type .choices , description = column . doc )
141
+ return Enum (name , type .choices , description = get_column_doc ( column ) )
122
142
123
143
124
144
@convert_sqlalchemy_type .register (ScalarListType )
125
145
def convert_scalar_list_to_list (type , column , registry = None ):
126
- return List (String , description = column . doc )
146
+ return List (String , description = get_column_doc ( column ) )
127
147
128
148
129
149
@convert_sqlalchemy_type .register (postgresql .ARRAY )
130
- def convert_postgres_array_to_list (type , column , registry = None ):
150
+ def convert_postgres_array_to_list (_type , column , registry = None ):
131
151
graphene_type = convert_sqlalchemy_type (column .type .item_type , column )
132
- return List (graphene_type , description = column .doc , required = not (column .nullable ))
152
+ inner_type = type (graphene_type )
153
+ return List (inner_type , description = get_column_doc (column ), required = not (is_column_nullable (column )))
133
154
134
155
135
156
@convert_sqlalchemy_type .register (postgresql .HSTORE )
136
157
@convert_sqlalchemy_type .register (postgresql .JSON )
137
158
@convert_sqlalchemy_type .register (postgresql .JSONB )
138
159
def convert_json_to_string (type , column , registry = None ):
139
- return JSONString (description = column . doc , required = not (column . nullable ))
160
+ return JSONString (description = get_column_doc ( column ) , required = not (is_column_nullable ( column ) ))
140
161
141
162
142
163
@convert_sqlalchemy_type .register (JSONType )
143
164
def convert_json_type_to_string (type , column , registry = None ):
144
- return JSONString (description = column . doc , required = not (column . nullable ))
165
+ return JSONString (description = get_column_doc ( column ) , required = not (is_column_nullable ( column ) ))
0 commit comments