X-Git-Url: https://git.mdrn.pl/wolnelektury.git/blobdiff_plain/3c0d04a3693fb70566f5ba7b045a24c0d5e955b1..7bbeecb5dd5c5f20120f9e40e41568a3bff1caa4:/src/search/forms.py?ds=inline diff --git a/src/search/forms.py b/src/search/forms.py index 1e680fa4f..3c15b340e 100644 --- a/src/search/forms.py +++ b/src/search/forms.py @@ -1,5 +1,5 @@ -# This file is part of Wolnelektury, licensed under GNU Affero GPLv3 or later. -# Copyright © Fundacja Nowoczesna Polska. See NOTICE for more information. +# This file is part of Wolne Lektury, licensed under GNU Affero GPLv3 or later. +# Copyright © Fundacja Wolne Lektury. See NOTICE for more information. # from django.apps import apps from django.conf import settings @@ -9,58 +9,39 @@ from django.utils.translation import gettext_lazy as _ from catalogue.constants import LANGUAGES_3TO2 import catalogue.models import pdcounter.models -import picture.models -from .fields import JQueryAutoCompleteSearchField, InlineRadioWidget +from .fields import InlineRadioWidget from .utils import UnaccentSearchQuery, UnaccentSearchVector -class SearchForm(forms.Form): - q = JQueryAutoCompleteSearchField(label=_('Search')) - # {'minChars': 2, 'selectFirst': True, 'cacheLength': 50, 'matchContains': "word"}) - - def __init__(self, source, *args, **kwargs): - kwargs['auto_id'] = False - super(SearchForm, self).__init__(*args, **kwargs) - self.fields['q'].widget.attrs['id'] = 'search' - self.fields['q'].widget.attrs['autocomplete'] = 'off' - self.fields['q'].widget.attrs['data-source'] = source - if 'q' not in self.data: - self.fields['q'].widget.attrs['placeholder'] = _('title, author, epoch, kind, genre, phrase') - - class SearchFilters(forms.Form): q = forms.CharField( required=False, widget=forms.HiddenInput(), min_length=2, max_length=256, ) format = forms.ChoiceField(required=False, choices=[ - ('', 'wszystkie'), - ('text', 'tekst'), - ('audio', 'audiobook'), - ('daisy', 'Daisy'), - ('art', 'obraz'), - #('theme', 'motywy'), + ('', _('wszystkie')), + ('audio', _('audiobook')), + ('daisy', _('Daisy')), ], widget=InlineRadioWidget()) lang = forms.ChoiceField(required=False) epoch = forms.ChoiceField(required=False) genre = forms.ChoiceField(required=False) category = forms.ChoiceField(required=False, choices=[ - ('', 'wszystkie'), - ('author', 'autor'), - #('translator', 'tłumacz'), - ('theme', 'motyw'), - ('genre', 'gatunek'), - ('book', 'tytuł'), - ('art', 'obraz'), - ('collection', 'kolekcja'), - ('quote', 'cytat'), + ('', _('wszystkie')), + ('author', _('autor')), + #('translator', _('tłumacz')), + ('theme', _('motyw')), + ('genre', _('gatunek')), + ('book', _('tytuł')), + ('collection', _('kolekcja')), + ('quote', _('cytat')), ], widget=InlineRadioWidget()) def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) langs = dict(settings.LANGUAGES) - self.fields['lang'].choices = [('', 'wszystkie')] + [ + self.fields['lang'].choices = [('', _('wszystkie'))] + [ ( b, langs.get(LANGUAGES_3TO2.get(b, b), b) @@ -69,11 +50,11 @@ class SearchFilters(forms.Form): 'language', flat=True ).distinct().order_by() ] - self.fields['epoch'].choices = [('', 'wszystkie')] + [ + self.fields['epoch'].choices = [('', _('wszystkie'))] + [ (b.slug, b.name) for b in catalogue.models.Tag.objects.filter(category='epoch') ] - self.fields['genre'].choices = [('', 'wszystkie')] + [ + self.fields['genre'].choices = [('', _('wszystkie'))] + [ (b.slug, b.name) for b in catalogue.models.Tag.objects.filter(category='genre') ] @@ -85,11 +66,9 @@ class SearchFilters(forms.Form): 'theme': catalogue.models.Tag.objects.filter(category='theme'), 'genre': catalogue.models.Tag.objects.filter(category='genre'), 'collection': catalogue.models.Collection.objects.all(), - 'book': catalogue.models.Book.objects.all(), #findable + 'book': catalogue.models.Book.objects.filter(findable=True), 'pdbook': pdcounter.models.BookStub.objects.all(), - 'snippet': catalogue.models.Snippet.objects.all(), - 'art': picture.models.Picture.objects.all(), - # art pieces + 'snippet': catalogue.models.Snippet.objects.filter(book__findable=True), } if self.cleaned_data['category']: c = self.cleaned_data['category'] @@ -103,36 +82,27 @@ class SearchFilters(forms.Form): qs['book'] = qs['book'].none() qs['pdbook'] = qs['pdbook'].none() if c != 'quote': qs['snippet'] = qs['snippet'].none() - if c != 'art': qs['art'] = qs['art'].none() - qs['art'] = Picture.objects.none() if self.cleaned_data['format']: c = self.cleaned_data['format'] qs['author'] = qs['author'].none() qs['pdauthor'] = qs['pdauthor'].none() qs['theme'] = qs['theme'].none() - qs['genre'] = qs['genrer'].none() + qs['genre'] = qs['genre'].none() qs['collection'] = qs['collection'].none() - if c == 'art': - qs['book'] = qs['book'].none() - qs['pdbook'] = qs['pdbook'].none() - qs['snippet'] = qs['snippet'].none() - if c in ('text', 'audio', 'daisy'): - qs['art'] = qs['art'].none() - if c == 'audio': - qs['book'] = qs['book'].filter(media__type='mp3') - qs['pdbook'] = qs['book'].none() - qs['snippet'] = qs['snippet'].filter(book__media__type='mp3') - elif c == 'daisy': - qs['book'] = qs['book'].filter(media__type='daisy') - qs['snippet'] = qs['snippet'].filter(book__media__type='daisy') + if c == 'audio': + qs['book'] = qs['book'].filter(media__type='mp3') + qs['pdbook'] = qs['book'].none() + qs['snippet'] = qs['snippet'].filter(book__media__type='mp3') + elif c == 'daisy': + qs['book'] = qs['book'].filter(media__type='daisy') + qs['snippet'] = qs['snippet'].filter(book__media__type='daisy') if self.cleaned_data['lang']: qs['author'] = qs['author'].none() qs['pdauthor'] = qs['pdauthor'].none() qs['theme'] = qs['theme'].none() qs['genre'] = qs['genre'].none() - qs['art'] = qs['art'].none() qs['collection'] = qs['collection'].none() qs['book'] = qs['book'].filter(language=self.cleaned_data['lang']) qs['pdbook'] = qs['pdbook'].none() @@ -151,30 +121,28 @@ class SearchFilters(forms.Form): qs['book'] = qs['book'].filter(tag_relations__tag=t) qs['pdbook'] = qs['pdbook'].none() qs['snippet'] = qs['snippet'].filter(book__tag_relations__tag=t) - qs['art'] = qs['art'].filter(tag_relations__tag=t) return qs def results(self): qs = self.get_querysets() query = self.cleaned_data['q'] - squery = UnaccentSearchQuery(query, config='polish') - query = SearchQuery(query, config='polish') + squery = UnaccentSearchQuery(query, config=settings.SEARCH_CONFIG) + query = SearchQuery(query, config=settings.SEARCH_CONFIG) books = qs['book'].annotate( search_vector=UnaccentSearchVector('title') ).filter(search_vector=squery) - books = books.exclude(ancestor__in=books) + books = books.exclude(ancestor__in=books).order_by('-popularity__count') snippets = qs['snippet'].filter(search_vector=squery).annotate( headline=SearchHeadline( 'text', query, - config='polish', + config=settings.SEARCH_CONFIG, start_sel='', stop_sel='', - highlight_all=True ) - )[:100] + ).order_by('-book__popularity__count', 'sec')[:100] snippets_by_book = {} for snippet in snippets: snippet_list = snippets_by_book.setdefault(snippet.book, []) @@ -195,9 +163,6 @@ class SearchFilters(forms.Form): search_vector=UnaccentSearchVector('title') ).filter(search_vector=squery), 'book': books[:100], - 'art': qs['art'].annotate( - search_vector=UnaccentSearchVector('title') - ).filter(search_vector=squery)[:100], 'snippet': snippets_by_book, 'pdauthor': pdcounter.models.Author.search(squery, qs=qs['pdauthor']), 'pdbook': pdcounter.models.BookStub.search(squery, qs=qs['pdbook']),