Skip to content

Commit bead50a

Browse files
committed
Sort is added by default to the connectionField
1 parent 2fd5203 commit bead50a

File tree

3 files changed

+21
-8
lines changed

3 files changed

+21
-8
lines changed

examples/flask_sqlalchemy/schema.py

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,13 @@ class Meta:
3434

3535
class Query(graphene.ObjectType):
3636
node = relay.Node.Field()
37+
# Supports sorting only over one field
3738
all_employees = SQLAlchemyConnectionField(Employee, sort=graphene.Argument(SortEnumEmployee,
3839
default_value=utils.EnumValue('id_asc', EmployeeModel.id.asc())))
39-
all_roles = SQLAlchemyConnectionField(Role, sort=utils.sort_argument_for_model(RoleModel))
40-
all_departments = SQLAlchemyConnectionField(Department)
40+
# Add sort over multiple fields, sorting by default over the primary key
41+
all_roles = SQLAlchemyConnectionField(Role)
42+
# Disable sorting over this field
43+
all_departments = SQLAlchemyConnectionField(Department, sort=None)
4144

4245

4346
schema = graphene.Schema(query=Query, types=[Department, Employee, Role])

graphene_sqlalchemy/fields.py

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
from graphene.relay.connection import PageInfo
77
from graphql_relay.connection.arrayconnection import connection_from_list_slice
88

9-
from .utils import get_query
9+
from .utils import get_query, sort_argument_for_model
1010

1111

12-
class SQLAlchemyConnectionField(ConnectionField):
12+
class _UnsortedSQLAlchemyConnectionField(ConnectionField):
1313

1414
@property
1515
def model(self):
@@ -62,7 +62,17 @@ def get_resolver(self, parent_resolver):
6262
return partial(self.connection_resolver, parent_resolver, self.type, self.model)
6363

6464

65-
__connectionFactory = SQLAlchemyConnectionField
65+
class SQLAlchemyConnectionField(_UnsortedSQLAlchemyConnectionField):
66+
67+
def __init__(self, type, *args, **kwargs):
68+
if 'sort' not in kwargs:
69+
kwargs.setdefault('sort', sort_argument_for_model(type._meta.model))
70+
elif kwargs['sort'] is None:
71+
del kwargs['sort']
72+
super(SQLAlchemyConnectionField, self).__init__(type, *args, **kwargs)
73+
74+
75+
__connectionFactory = _UnsortedSQLAlchemyConnectionField
6676

6777

6878
def createConnectionField(_type):
@@ -76,4 +86,4 @@ def registerConnectionFieldFactory(factoryMethod):
7686

7787
def unregisterConnectionFieldFactory():
7888
global __connectionFactory
79-
__connectionFactory = SQLAlchemyConnectionField
89+
__connectionFactory = _UnsortedSQLAlchemyConnectionField

graphene_sqlalchemy/tests/test_converter.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@
1616
from ..converter import (convert_sqlalchemy_column,
1717
convert_sqlalchemy_composite,
1818
convert_sqlalchemy_relationship)
19-
from ..fields import SQLAlchemyConnectionField
19+
from ..fields import _UnsortedSQLAlchemyConnectionField
2020
from ..registry import Registry
2121
from ..types import SQLAlchemyObjectType
2222
from .models import Article, Pet, Reporter
@@ -205,7 +205,7 @@ class Meta:
205205

206206
dynamic_field = convert_sqlalchemy_relationship(Reporter.pets.property, A._meta.registry)
207207
assert isinstance(dynamic_field, graphene.Dynamic)
208-
assert isinstance(dynamic_field.get_type(), SQLAlchemyConnectionField)
208+
assert isinstance(dynamic_field.get_type(), _UnsortedSQLAlchemyConnectionField)
209209

210210

211211
def test_should_manytoone_convert_connectionorlist():

0 commit comments

Comments
 (0)