|
9 | 9 | offset_to_cursor,
|
10 | 10 | )
|
11 | 11 |
|
12 |
| -from promise import Promise |
| 12 | +from asgiref.sync import sync_to_async |
| 13 | +from asyncio import get_running_loop |
13 | 14 |
|
14 | 15 | from graphene import Int, NonNull
|
15 | 16 | from graphene.relay import ConnectionField
|
@@ -228,20 +229,43 @@ def connection_resolver(
|
228 | 229 |
|
229 | 230 | # eventually leads to DjangoObjectType's get_queryset (accepts queryset)
|
230 | 231 | # or a resolve_foo (does not accept queryset)
|
| 232 | + |
231 | 233 | iterable = resolver(root, info, **args)
|
| 234 | + if info.is_awaitable(iterable): |
| 235 | + async def await_result(): |
| 236 | + queryset_or_list = await iterable |
| 237 | + if queryset_or_list is None: |
| 238 | + queryset_or_list = default_manager |
| 239 | + |
| 240 | + if is_async(queryset_resolver): |
| 241 | + |
| 242 | + resolved = await sync_to_async(queryset_resolver)(connection, resolved, info, args) |
| 243 | + |
| 244 | + # TODO: create an async_resolve_connection which uses the new Django queryset async functions |
| 245 | + async_resolve_connection = sync_to_async(cls.resolve_connection) |
| 246 | + |
| 247 | + if is_awaitable(resolved): |
| 248 | + return async_resolve_connection(connection, args, await resolved, max_limit=max_limit) |
| 249 | + |
| 250 | + return async_resolve_connection(connection, args, resolved, max_limit=max_limit) |
| 251 | + |
| 252 | + return await_result() |
| 253 | + |
232 | 254 | if iterable is None:
|
233 | 255 | iterable = default_manager
|
234 | 256 | # thus the iterable gets refiltered by resolve_queryset
|
235 | 257 | # but iterable might be promise
|
236 | 258 | iterable = queryset_resolver(connection, iterable, info, args)
|
237 |
| - on_resolve = partial( |
238 |
| - cls.resolve_connection, connection, args, max_limit=max_limit |
239 |
| - ) |
240 | 259 |
|
241 |
| - if Promise.is_thenable(iterable): |
242 |
| - return Promise.resolve(iterable).then(on_resolve) |
| 260 | + try: |
| 261 | + get_running_loop() |
| 262 | + except RuntimeError: |
| 263 | + pass |
| 264 | + else: |
| 265 | + return sync_to_async(cls.resolve_connection)(connection, args, iterable, max_limit=max_limit) |
| 266 | + |
243 | 267 |
|
244 |
| - return on_resolve(iterable) |
| 268 | + return cls.resolve_connection(connection, args, iterable, max_limit=max_limit) |
245 | 269 |
|
246 | 270 | def wrap_resolve(self, parent_resolver):
|
247 | 271 | return partial(
|
|
0 commit comments