Skip to content

Commit 4850694

Browse files
Merge branch 'bug-fix-paginating-list-of-embedded-documents'
2 parents 2623118 + 97dbd58 commit 4850694

File tree

1 file changed

+24
-6
lines changed

1 file changed

+24
-6
lines changed

graphene_mongo/fields.py

Lines changed: 24 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -245,10 +245,12 @@ def get_queryset(self, model, info, required_fields=list(), skip=None, limit=Non
245245

246246
def default_resolver(self, _root, info, required_fields=list(), **args):
247247
args = args or {}
248-
249248
if _root is not None:
250249
field_name = to_snake_case(info.field_name)
251-
if field_name in _root._fields_ordered:
250+
if field_name in _root._fields_ordered and not (isinstance(_root._fields[field_name].field,
251+
mongoengine.EmbeddedDocumentField) or
252+
isinstance(_root._fields[field_name].field,
253+
mongoengine.GenericEmbeddedDocumentField)):
252254
if getattr(_root, field_name, []) is not None:
253255
args["pk__in"] = [r.id for r in getattr(_root, field_name, [])]
254256

@@ -262,11 +264,11 @@ def default_resolver(self, _root, info, required_fields=list(), **args):
262264
count = 0
263265
limit = None
264266
reverse = False
267+
first = args.pop("first", None)
268+
after = cursor_to_offset(args.pop("after", None))
269+
last = args.pop("last", None)
270+
before = cursor_to_offset(args.pop("before", None))
265271
if callable(getattr(self.model, "objects", None)):
266-
first = args.pop("first", None)
267-
after = cursor_to_offset(args.pop("after", None))
268-
last = args.pop("last", None)
269-
before = cursor_to_offset(args.pop("before", None))
270272
if "pk__in" in args and args["pk__in"]:
271273
count = len(args["pk__in"])
272274
skip, limit, reverse = find_skip_and_limit(first=first, last=last, after=after, before=before,
@@ -295,6 +297,22 @@ def default_resolver(self, _root, info, required_fields=list(), **args):
295297
if not info.context:
296298
info.context = Context()
297299
info.context.queryset = self.get_queryset(self.model, info, required_fields, **args)
300+
301+
elif _root is not None:
302+
field_name = to_snake_case(info.field_name)
303+
items = getattr(_root, field_name, [])
304+
count = len(items)
305+
skip, limit, reverse = find_skip_and_limit(first=first, last=last, after=after, before=before,
306+
count=count)
307+
if limit:
308+
if reverse:
309+
items = items[::-1][skip:skip + limit]
310+
else:
311+
items = items[skip:skip + limit]
312+
elif skip:
313+
items = items[skip:]
314+
iterables = items
315+
list_length = len(iterables)
298316
has_next_page = True if (0 if limit is None else limit) + (0 if skip is None else skip) < count else False
299317
has_previous_page = True if skip else False
300318
if reverse:

0 commit comments

Comments
 (0)