示例#1
0
 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)
示例#2
0
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)