22
33from django .db .models .query import QuerySet
44
5+ from promise import Promise
6+
57from graphene .types import Field , List
68from graphene .relay import ConnectionField , PageInfo
79from graphql_relay .connection .arrayconnection import connection_from_list_slice
@@ -57,7 +59,33 @@ def get_manager(self):
5759
5860 @classmethod
5961 def merge_querysets (cls , default_queryset , queryset ):
60- return default_queryset & queryset
62+ return queryset & default_queryset
63+
64+ @classmethod
65+ def resolve_connection (cls , connection , default_manager , args , iterable ):
66+ if iterable is None :
67+ iterable = default_manager
68+ iterable = maybe_queryset (iterable )
69+ if isinstance (iterable , QuerySet ):
70+ if iterable is not default_manager :
71+ default_queryset = maybe_queryset (default_manager )
72+ iterable = cls .merge_querysets (default_queryset , iterable )
73+ _len = iterable .count ()
74+ else :
75+ _len = len (iterable )
76+ connection = connection_from_list_slice (
77+ iterable ,
78+ args ,
79+ slice_start = 0 ,
80+ list_length = _len ,
81+ list_slice_length = _len ,
82+ connection_type = connection ,
83+ edge_type = connection .Edge ,
84+ pageinfo_type = PageInfo ,
85+ )
86+ connection .iterable = iterable
87+ connection .length = _len
88+ return connection
6189
6290 @classmethod
6391 def connection_resolver (cls , resolver , connection , default_manager , max_limit ,
@@ -84,29 +112,12 @@ def connection_resolver(cls, resolver, connection, default_manager, max_limit,
84112 args ['last' ] = min (last , max_limit )
85113
86114 iterable = resolver (root , args , context , info )
87- if iterable is None :
88- iterable = default_manager
89- iterable = maybe_queryset (iterable )
90- if isinstance (iterable , QuerySet ):
91- if iterable is not default_manager :
92- default_queryset = maybe_queryset (default_manager )
93- iterable = cls .merge_querysets (default_queryset , iterable )
94- _len = iterable .count ()
95- else :
96- _len = len (iterable )
97- connection = connection_from_list_slice (
98- iterable ,
99- args ,
100- slice_start = 0 ,
101- list_length = _len ,
102- list_slice_length = _len ,
103- connection_type = connection ,
104- edge_type = connection .Edge ,
105- pageinfo_type = PageInfo ,
106- )
107- connection .iterable = iterable
108- connection .length = _len
109- return connection
115+ on_resolve = partial (cls .resolve_connection , connection , default_manager , args )
116+
117+ if Promise .is_thenable (iterable ):
118+ return Promise .resolve (iterable ).then (on_resolve )
119+
120+ return on_resolve (iterable )
110121
111122 def get_resolver (self , parent_resolver ):
112123 return partial (
0 commit comments