From: Radek Czajka Date: Tue, 27 Dec 2011 12:46:32 +0000 (+0100) Subject: fix chaining querysets for pagination X-Git-Url: https://git.mdrn.pl/wolnelektury.git/commitdiff_plain/76fc2ed0abc7ff4bb7ddee798a115f11bf51ee1c?ds=inline;hp=-c fix chaining querysets for pagination --- 76fc2ed0abc7ff4bb7ddee798a115f11bf51ee1c diff --git a/apps/catalogue/utils.py b/apps/catalogue/utils.py index acbd778cd..145511e06 100644 --- a/apps/catalogue/utils.py +++ b/apps/catalogue/utils.py @@ -164,3 +164,33 @@ def async_build_pdf(book_id, customizations, file_name): if not DefaultStorage().exists(file_name): book.build_pdf(customizations=customizations, file_name=file_name) print "done." + + +class MultiQuerySet(object): + def __init__(self, *args, **kwargs): + self.querysets = args + self._count = None + + def count(self): + if not self._count: + self._count = sum(len(qs) for qs in self.querysets) + return self._count + + def __len__(self): + return self.count() + + def __getitem__(self, item): + indices = (offset, stop, step) = item.indices(self.count()) + items = [] + total_len = stop - offset + for qs in self.querysets: + if len(qs) < offset: + offset -= len(qs) + else: + items += list(qs[offset:stop]) + if len(items) >= total_len: + return items + else: + offset = 0 + stop = total_len - len(items) + continue \ No newline at end of file diff --git a/apps/catalogue/views.py b/apps/catalogue/views.py index f1eeab739..c34cf29c3 100644 --- a/apps/catalogue/views.py +++ b/apps/catalogue/views.py @@ -26,14 +26,14 @@ from django.views.generic.list_detail import object_list from ajaxable.utils import LazyEncoder, JSONResponse from catalogue import models from catalogue import forms -from catalogue.utils import split_tags, AttachmentHttpResponse, async_build_pdf +from catalogue.utils import (split_tags, AttachmentHttpResponse, + async_build_pdf, MultiQuerySet) from catalogue.tasks import touch_tag from pdcounter import models as pdcounter_models from pdcounter import views as pdcounter_views from suggest.forms import PublishingSuggestForm from picture.models import Picture -from itertools import chain from os import path staff_required = user_passes_test(lambda user: user.is_staff) @@ -169,22 +169,20 @@ def tagged_object_list(request, tags=''): only_author = len(tags) == 1 and tags[0].category == 'author' objects = models.Book.objects.none() - # Add pictures - objects = Picture.tagged.with_all(tags)|objects + # Add pictures + objects = MultiQuerySet(Picture.tagged.with_all(tags), objects) - return object_list( - request, - objects, - template_name='catalogue/tagged_object_list.html', - extra_context={ + return render_to_response('catalogue/tagged_object_list.html', + { + 'object_list': objects, 'categories': categories, 'only_shelf': only_shelf, 'only_author': only_author, 'only_my_shelf': only_my_shelf, 'formats_form': forms.DownloadFormatsForm(), 'tags': tags, - } - ) + }, + context_instance=RequestContext(request)) def book_fragments(request, book, theme_slug):