def test_paginated_query(self): self.values = [ X(key_name='c1', val='bum bam bear', idx=1), X(key_name='c2', val='bum bam bear'), X(key_name='a1', val='bear and bing', idx=2), X(key_name='b1', val='beach sand bear', idx=1), X(key_name='b2', val='beach sand bear'), ] db.put(self.values) run_tasks() items, prev, next = paginated_query(X, count=2) self.assertEqual([item.key().name() for item in items], ['a1', 'b1']) self.assertEqual(prev, None) items, prev, next = paginated_query(X, count=2, bookmark=next) self.assertEqual([item.key().name() for item in items], ['b2', 'c1']) items, prev, next = paginated_query(X, count=2, bookmark=prev) self.assertEqual([item.key().name() for item in items], ['a1', 'b1']) # Now, test unidirectional items, prev, next = paginated_query(X, count=2, bookmark=next, unidirectional=True) self.assertEqual([item.key().name() for item in items], ['b2', 'c1']) self.assertEqual(prev, None)
def key_paginated_object_list(request, model, filters=(), order=(), ignore_params=(), converter=None, search_title=default_title, paginate_by=10, search_form_class=None, template_name=None, template_object_name=None, extra_context={}): """ Browse entities using key-based pagination. """ if not search_form_class: search_form = None else: search_form = search_form_class(request.GET) search_form.is_valid() bookmark, original_base_url, data = _prepare_params(request, ignore_params) items, prev, next = paginated_query(model, filters=filters, order=order, count=paginate_by, bookmark=bookmark) if not template_object_name: template_object_name = model._meta.object_name.lower() data.update({ template_object_name + '_list': items, 'template_object_name': template_object_name, 'has_previous': bool(prev), 'previous': prev, 'has_next': bool(next), 'next': next, 'page_range': (), 'show_key_pagenav': True, 'search_form': search_form, 'search_title': search_title, 'query': '', 'search__converter': converter, }) if not items and not prev and not next: data['force_results_count'] = True if 'results_count_format' not in extra_context: data['results_count_format'] = default_results_format for key, value in extra_context.items(): if callable(value): data[key] = value() else: data[key] = value if not template_name: name_data = (model._meta.app_label, model._meta.object_name.lower()) template_name = ('%s/%s_paginated.html' % name_data, '%s/%s_search.html' % name_data, 'search/search.html') return render_to_response(request, template_name, data)