X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/ea9d7d13a44a6ad6357b1af8c977c27753268521..eb383b976ed875888b261bf5901ee484aa2dcf8f:/src/catalogue/views.py diff --git a/src/catalogue/views.py b/src/catalogue/views.py index 2d8aea715..95298897c 100644 --- a/src/catalogue/views.py +++ b/src/catalogue/views.py @@ -115,12 +115,18 @@ class ObjectListView(TemplateView): orderings = {} default_ordering = None - def setup(self, request, **kwargs): - super().setup(request, **kwargs) + def analyse(self): self.is_themed = False self.ctx = ctx = {} ctx['tags'] = [] + def dispatch(self, *args, **kwargs): + try: + self.analyse() + except ResponseInstead as e: + return e.response + return super().dispatch(*args, **kwargs) + def get_orderings(self): order = self.get_order() return [ @@ -242,6 +248,7 @@ class LiteratureView(BookList): class AudiobooksView(LiteratureView): title = gettext_lazy('Audiobooks') + list_type = 'audiobooks' def get_queryset(self): return Book.objects.filter(findable=True, media__type='mp3').distinct() @@ -256,13 +263,18 @@ class GalleryView(ArtList): class TaggedObjectList(BookList): - def setup(self, request, tags, **kwargs): - super().setup(request, **kwargs) - self.ctx['tags'] = analyse_tags(request, tags) + def analyse(self): + super().analyse() + self.ctx['tags'] = analyse_tags(self.request, self.kwargs['tags']) self.ctx['fragment_tags'] = [t for t in self.ctx['tags'] if t.category in ('theme', 'object')] self.ctx['work_tags'] = [t for t in self.ctx['tags'] if t not in self.ctx['fragment_tags']] self.is_themed = self.ctx['has_theme'] = bool(self.ctx['fragment_tags']) - self.ctx['main_tag'] = self.ctx['fragment_tags'][0] if self.is_themed else self.ctx['tags'][0] + if self.is_themed: + self.ctx['main_tag'] = self.ctx['fragment_tags'][0] + elif self.ctx['tags']: + self.ctx['main_tag'] = self.ctx['tags'][0] + else: + self.ctx['main_tag'] = None self.ctx['filtering_tags'] = [ t for t in self.ctx['tags'] if t is not self.ctx['main_tag'] @@ -272,9 +284,12 @@ class TaggedObjectList(BookList): qs = Book.tagged.with_all(self.ctx['work_tags']).filter(findable=True) qs = qs.exclude(ancestor__in=qs) if self.is_themed: - qs = Fragment.tagged.with_all(self.ctx['fragment_tags']).filter( - Q(book__in=qs) | Q(book__ancestor__in=qs) - ) + fqs = Fragment.tagged.with_all(self.ctx['fragment_tags']) + if self.ctx['work_tags']: + fqs = fqs.filter( + Q(book__in=qs) | Q(book__ancestor__in=qs) + ) + qs = fqs return qs def get_suggested_tags(self, queryset): @@ -388,15 +403,21 @@ def object_list(request, objects, fragments=None, related_tags=None, tags=None, def literature(request): + if request.EXPERIMENTS['layout'].value: + return LiteratureView.as_view()(request) books = Book.objects.filter(parent=None, findable=True) return object_list(request, books, related_tags=get_top_level_related_tags([])) def gallery(request): + if request.EXPERIMENTS['layout'].value: + return GalleryView.as_view()(request) return object_list(request, Picture.objects.all(), list_type='gallery') def audiobooks(request): + if request.EXPERIMENTS['layout'].value: + return AudiobooksView.as_view()(request) audiobooks = Book.objects.filter(findable=True, media__type__in=('mp3', 'ogg')).distinct() return object_list(request, audiobooks, list_type='audiobooks', extra={ 'daisy': Book.objects.filter(findable=True, media__type='daisy').distinct(), @@ -426,6 +447,8 @@ def analyse_tags(request, tag_str): raise ResponseInstead(HttpResponsePermanentRedirect( reverse('tagged_object_list', args=['/'.join(tag.url_chunk for tag in e.tags)]))) + if not tags: + raise Http404 try: if len(tags) > settings.MAX_TAG_LIST: raise Http404 @@ -461,6 +484,9 @@ def theme_list(request, tags, list_type): def tagged_object_list(request, tags, list_type): + if request.EXPERIMENTS['layout'].value and list_type in ('books', 'audiobooks'): + return TaggedObjectList.as_view()(request, tags=tags) + try: tags = analyse_tags(request, tags) except ResponseInstead as e: @@ -544,8 +570,6 @@ def book_detail(request, slug): 'club_form': ScheduleForm() if book.preview else None, 'club': Club.objects.first() if book.preview else None, 'donation_form': DonationStep1Form(), - - 'EXPERIMENTS_SWITCHABLE_layout': True, })