|
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