Skip to content

Commit 9dd9fdf

Browse files
committed
Add support with v2
1 parent a9b7666 commit 9dd9fdf

File tree

3 files changed

+43
-18
lines changed

3 files changed

+43
-18
lines changed

graphene_sqlalchemy/fields.py

Lines changed: 12 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from promise import is_thenable, Promise
33
from sqlalchemy.orm.query import Query
44

5-
from graphene.relay import ConnectionField
5+
from graphene.relay import Connection, ConnectionField
66
from graphene.relay.connection import PageInfo
77
from graphql_relay.connection.arrayconnection import connection_from_list_slice
88

@@ -64,9 +64,17 @@ def get_resolver(self, parent_resolver):
6464
class SQLAlchemyConnectionField(UnsortedSQLAlchemyConnectionField):
6565

6666
def __init__(self, type, *args, **kwargs):
67-
if 'sort' not in kwargs:
68-
kwargs.setdefault('sort', sort_argument_for_model(type._meta.model))
69-
elif kwargs['sort'] is None:
67+
if 'sort' not in kwargs and issubclass(type, Connection):
68+
# Let super class raise if type is not a Connection
69+
try:
70+
model = type.Edge.node._type._meta.model
71+
kwargs.setdefault('sort', sort_argument_for_model(model))
72+
except Exception as e:
73+
raise Exception(
74+
'Cannot create sort argument for {}. A model is required. Set the "sort" argument'
75+
' to None to disabling the creation of the sort query argument'.format(type.__name__)
76+
)
77+
elif 'sort' in kwargs and kwargs['sort'] is None:
7078
del kwargs['sort']
7179
super(SQLAlchemyConnectionField, self).__init__(type, *args, **kwargs)
7280

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
from graphene.relay import Connection
2+
import pytest
3+
14
from ..fields import SQLAlchemyConnectionField
25
from ..types import SQLAlchemyObjectType
36
from ..utils import sort_argument_for_model
@@ -9,17 +12,27 @@ class Meta:
912
model = PetModel
1013

1114

15+
class PetConn(Connection):
16+
class Meta:
17+
node = Pet
18+
19+
1220
def test_sort_added_by_default():
13-
arg = SQLAlchemyConnectionField(Pet)
21+
arg = SQLAlchemyConnectionField(PetConn)
1422
assert 'sort' in arg.args
1523
assert arg.args['sort'] == sort_argument_for_model(PetModel)
1624

1725

1826
def test_sort_can_be_removed():
19-
arg = SQLAlchemyConnectionField(Pet, sort=None)
27+
arg = SQLAlchemyConnectionField(PetConn, sort=None)
2028
assert 'sort' not in arg.args
2129

2230

2331
def test_custom_sort():
24-
arg = SQLAlchemyConnectionField(Pet, sort=sort_argument_for_model(Editor))
25-
assert arg.args['sort'] == sort_argument_for_model(Editor)
32+
arg = SQLAlchemyConnectionField(PetConn, sort=sort_argument_for_model(Editor))
33+
assert arg.args['sort'] == sort_argument_for_model(Editor)
34+
35+
36+
def test_init_raises():
37+
with pytest.raises(Exception, match='Cannot create sort'):
38+
SQLAlchemyConnectionField(Connection)

graphene_sqlalchemy/tests/test_query.py

Lines changed: 14 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
from sqlalchemy.orm import scoped_session, sessionmaker
44

55
import graphene
6-
from graphene.relay import Node
6+
from graphene.relay import Connection, Node
77

88
from ..registry import reset_global_registry
99
from ..fields import SQLAlchemyConnectionField
@@ -153,7 +153,7 @@ class Meta:
153153
# def get_node(cls, id, info):
154154
# return Article(id=1, headline='Article node')
155155

156-
class ArticleConnection(graphene.relay.Connection):
156+
class ArticleConnection(Connection):
157157
class Meta:
158158
node = ArticleNode
159159

@@ -243,7 +243,7 @@ class Meta:
243243
model = Editor
244244
interfaces = (Node, )
245245

246-
class EditorConnection(graphene.relay.Connection):
246+
class EditorConnection(Connection):
247247
class Meta:
248248
node = EditorNode
249249

@@ -394,16 +394,20 @@ class Meta:
394394
model = Pet
395395
interfaces = (Node, )
396396

397+
class PetConnection(Connection):
398+
class Meta:
399+
node = PetNode
400+
397401
class Query(graphene.ObjectType):
398-
defaultSort = SQLAlchemyConnectionField(PetNode)
399-
nameSort = SQLAlchemyConnectionField(PetNode)
400-
multipleSort = SQLAlchemyConnectionField(PetNode)
401-
descSort = SQLAlchemyConnectionField(PetNode)
402+
defaultSort = SQLAlchemyConnectionField(PetConnection)
403+
nameSort = SQLAlchemyConnectionField(PetConnection)
404+
multipleSort = SQLAlchemyConnectionField(PetConnection)
405+
descSort = SQLAlchemyConnectionField(PetConnection)
402406
singleColumnSort = SQLAlchemyConnectionField(
403-
PetNode, sort=graphene.Argument(sort_enum_for_model(Pet)))
407+
PetConnection, sort=graphene.Argument(sort_enum_for_model(Pet)))
404408
noDefaultSort = SQLAlchemyConnectionField(
405-
PetNode, sort=sort_argument_for_model(Pet, False))
406-
noSort = SQLAlchemyConnectionField(PetNode, sort=None)
409+
PetConnection, sort=sort_argument_for_model(Pet, False))
410+
noSort = SQLAlchemyConnectionField(PetConnection, sort=None)
407411

408412
query = '''
409413
query sortTest {

0 commit comments

Comments
 (0)