def findAllItems(user=None, baseFolder=None): if not baseFolder: return CLIItem._findAllItemImpl(user) folderModel = Folder() graphLookup = { 'from': 'folder', 'startWith': '$_id', 'connectFromField': '_id', 'connectToField': 'parentId', 'as': 'children' } if user and not user['admin']: graphLookup[ 'restrictSearchWithMatch'] = folderModel.permissionClauses( user, AccessType.READ) # see https://docs.mongodb.com/manual/reference/operator/aggregation/graphLookup r = folderModel.collection.aggregate([{ '$match': dict(_id=baseFolder['_id']) }, { '$graphLookup': graphLookup }, { '$project': { 'leaves': '$children._id', } }]) leaves = next(r)['leaves'] return CLIItem._findAllItemImpl( user, {'folderId': { '$in': [baseFolder['_id']] + leaves }})