Skip to content

Commit 732b1ae

Browse files
committed
Update Connections
1 parent b1e0c3b commit 732b1ae

File tree

5 files changed

+31
-24
lines changed

5 files changed

+31
-24
lines changed

graphene/contrib/django/fields.py

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,7 @@
88

99

1010
class DjangoConnectionField(ConnectionField):
11-
12-
def wrap_resolved(self, value, instance, args, info):
13-
return lazy_map(value, self.type)
11+
pass
1412

1513

1614
class LazyListField(Field):

graphene/contrib/django/types.py

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,10 +2,10 @@
22

33
from ...core.types import BaseObjectType, ObjectTypeMeta
44
from ...relay.fields import GlobalIDField
5-
from ...relay.types import BaseNode
5+
from ...relay.types import BaseNode, Connection
66
from .converter import convert_django_field
77
from .options import DjangoOptions
8-
from .utils import get_reverse_fields
8+
from .utils import get_reverse_fields, lazy_map
99

1010

1111
class DjangoObjectTypeMeta(ObjectTypeMeta):
@@ -71,6 +71,13 @@ class DjangoInterface(six.with_metaclass(
7171
pass
7272

7373

74+
class DjangoConnection(Connection):
75+
@classmethod
76+
def from_list(cls, iterable, *args, **kwargs):
77+
iterable = lazy_map(iterable, cls.edge_type.node_type)
78+
return super(DjangoConnection, cls).from_list(iterable, *args, **kwargs)
79+
80+
7481
class DjangoNode(BaseNode, DjangoInterface):
7582
id = GlobalIDField()
7683

@@ -81,3 +88,5 @@ def get_node(cls, id, info=None):
8188
return cls(instance)
8289
except cls._meta.model.DoesNotExist:
8390
return None
91+
92+
connection_type = DjangoConnection

graphene/core/types/objecttype.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,10 @@ def get_fields(cls, schema):
219219

220220
return OrderedDict(fields)
221221

222+
@classmethod
223+
def wrap(cls, instance, args, info):
224+
return cls(_root=instance)
225+
222226

223227
class Interface(six.with_metaclass(ObjectTypeMeta, BaseObjectType)):
224228
pass

graphene/relay/fields.py

Lines changed: 3 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
from collections import Iterable
2-
3-
from graphql_relay.connection.arrayconnection import connection_from_list
41
from graphql_relay.node.node import from_global_id
52

63
from ..core.fields import Field
@@ -30,24 +27,11 @@ def wrap_resolved(self, value, instance, args, info):
3027
return value
3128

3229
def resolver(self, instance, args, info):
33-
from graphene.relay.types import PageInfo
3430
schema = info.schema.graphene_schema
35-
31+
connection_type = self.get_type(schema)
3632
resolved = super(ConnectionField, self).resolver(instance, args, info)
37-
if resolved:
38-
resolved = self.wrap_resolved(resolved, instance, args, info)
39-
assert isinstance(
40-
resolved, Iterable), 'Resolved value from the connection field have to be iterable'
41-
type = schema.T(self.type)
42-
node = schema.objecttype(type)
43-
connection_type = self.get_connection_type(node)
44-
edge_type = self.get_edge_type(node)
45-
46-
connection = connection_from_list(
47-
resolved, args, connection_type=connection_type,
48-
edge_type=edge_type, pageinfo_type=PageInfo)
49-
connection.set_connection_data(resolved)
50-
return connection
33+
if not isinstance(resolved, connection_type):
34+
return connection_type.from_list(resolved, args, info)
5135

5236
def get_connection_type(self, node):
5337
connection_type = self.connection_type or node.get_connection_type()

graphene/relay/types.py

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
import inspect
22
import warnings
3+
from collections import Iterable
34
from functools import wraps
5+
from graphql_relay.connection.arrayconnection import connection_from_list
46
from graphql_relay.node.node import to_global_id
57

68
from ..core.types import (Boolean, Field, InputObjectType, Interface, List,
@@ -63,6 +65,16 @@ def for_node(cls, node, edge_type=None):
6365
(cls,),
6466
{'edge_type': edge_type, 'edges': edges})
6567

68+
@classmethod
69+
def from_list(cls, iterable, args, info):
70+
assert isinstance(
71+
iterable, Iterable), 'Resolved value from the connection field have to be iterable'
72+
connection = connection_from_list(
73+
iterable, args, connection_type=cls,
74+
edge_type=cls.edge_type, pageinfo_type=PageInfo)
75+
connection.set_connection_data(iterable)
76+
return connection
77+
6678
def set_connection_data(self, data):
6779
self._connection_data = data
6880

0 commit comments

Comments
 (0)