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 [
def search(self, qs):
term = self.request.GET.get('search')
if term:
- meta_rels = TagRelation.objects.exclude(tag__category='set')
+ meta_rels = TagRelation.objects.filter(tag__category='author')
# TODO: search tags in currently displaying language
if self.is_themed:
- #qs = qs.annotate(
- # meta=FilteredRelation('book__tag_relations', condition=Q(tag_relations__in=meta_rels))
- #)
+ rels = meta_rels.filter(tag__name_pl__icontains=term)
qs = qs.filter(
Q(book__title__icontains=term) |
- #Q(meta__tag_relations__tag__name_pl__icontains=term) |
+ Q(tag_relations__in=rels) |
Q(text__icontains=term)
).distinct()
else:
class AudiobooksView(LiteratureView):
title = gettext_lazy('Audiobooks')
+ list_type = 'audiobooks'
def get_queryset(self):
return Book.objects.filter(findable=True, media__type='mp3').distinct()
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']
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):
tag_ids = [t.id for t in self.ctx['tags']]
- related_tags = list(get_top_level_related_tags(self.ctx['tags']))
- if not self.is_themed:
+ if self.is_themed:
+ related_tags = []
+ current_books = self.get_queryset().values_list('book', flat=True).distinct()
+ containing_books = Book.objects.filter(Q(id__in=current_books) | Q(children__in=current_books))
+
+ related_tags.extend(list(
+ Tag.objects.usage_for_queryset(
+ containing_books,
+ ).exclude(category='set').exclude(pk__in=tag_ids)
+ ))
+ if self.request.user.is_authenticated:
+ related_tags.extend(list(
+ Tag.objects.usage_for_queryset(
+ containing_books
+ ).filter(
+ user=self.request.user
+ ).exclude(name='').exclude(pk__in=tag_ids)
+ ))
+ else:
+ related_tags = list(get_top_level_related_tags(self.ctx['tags']))
if self.request.user.is_authenticated:
qs = Book.tagged.with_all(self.ctx['tags']).filter(findable=True)
related_tags.extend(list(
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(),
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
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:
'club_form': ScheduleForm() if book.preview else None,
'club': Club.objects.first() if book.preview else None,
'donation_form': DonationStep1Form(),
-
- 'EXPERIMENTS_SWITCHABLE_layout': True,
})