fixes
[wolnelektury.git] / src / search / views.py
index e06b1cc..b5cc0ba 100644 (file)
@@ -11,6 +11,7 @@ from catalogue.models import Book, Tag
 from pdcounter.models import Author
 from picture.models import Picture
 from search.index import Search, SearchResult, PictureResult
 from pdcounter.models import Author
 from picture.models import Picture
 from search.index import Search, SearchResult, PictureResult
+from .forms import SearchFilters
 from suggest.forms import PublishingSuggestForm
 import re
 import json
 from suggest.forms import PublishingSuggestForm
 import re
 import json
@@ -85,15 +86,19 @@ def hint(request, mozhint=False, param='term'):
         for author in authors[:limit]
     ]
     if len(data) < limit:
         for author in authors[:limit]
     ]
     if len(data) < limit:
-        data += [
-            {
-                'label': b.title,
-                'author': b.author_unicode(),
-                'id': b.id,
-                'url': b.get_absolute_url()
-            }
-            for b in Book.objects.filter(findable=True, title__iregex='\m' + prefix)[:limit-len(data)]
-        ]
+        for b in Book.objects.filter(findable=True, title__iregex='\m' + prefix)[:limit-len(data)]:
+            author_str = b.author_unicode()
+            translator = b.translator()
+            if translator:
+                author_str += ' (tłum. ' + translator + ')'
+            data.append(
+                {
+                    'label': b.title,
+                    'author': author_str,
+                    'id': b.id,
+                    'url': b.get_absolute_url()
+                }
+            )
 
     if mozhint:
         data = [
 
     if mozhint:
         data = [
@@ -112,8 +117,29 @@ def hint(request, mozhint=False, param='term'):
         return JsonResponse(data, safe=False)
 
 
         return JsonResponse(data, safe=False)
 
 
+
+@cache.never_cache
+def search(request):
+    filters = SearchFilters(request.GET)
+    ctx = {
+        'title': 'Wynik wyszukiwania',
+        'query': request.GET.get('q', ''),
+        'filters': filters,
+    }
+    if filters.is_valid():
+        ctx['results'] = filters.results()
+        for k, v in ctx['results'].items():
+            if v:
+                ctx['hasresults'] = True
+                break
+    return render(request, 'search/results.html', ctx)
+
+
 @cache.never_cache
 def main(request):
 @cache.never_cache
 def main(request):
+    if request.EXPERIMENTS['layout'].value:
+        return search(request)
+
     query = request.GET.get('q', '')
 
     format = request.GET.get('format')
     query = request.GET.get('q', '')
 
     format = request.GET.get('format')
@@ -189,9 +215,9 @@ def main(request):
                 'genre': genre,
             },
             'tags': {
                 'genre': genre,
             },
             'tags': {
-                'epoch': Tag.objects.filter(category='epoch'),
-                'genre': Tag.objects.filter(category='genre'),
-                'kind': Tag.objects.filter(category='kind'),
+                'epoch': Tag.objects.filter(category='epoch', for_books=True),
+                'genre': Tag.objects.filter(category='genre', for_books=True),
+                'kind': Tag.objects.filter(category='kind', for_books=True),
             },
         })
 
             },
         })
 
@@ -227,11 +253,11 @@ def search_books(query, lang=None, only_audio=False, only_synchro=False, epoch=N
 
     def ensure_exists(r):
         try:
 
     def ensure_exists(r):
         try:
-            r.book
+            if not r.book:
+                return False
         except Book.DoesNotExist:
             return False
 
         except Book.DoesNotExist:
             return False
 
-        print(lang, r.book.language)
         if lang and r.book.language != lang:
             return False
         if only_audio and not r.book.has_mp3_file():
         if lang and r.book.language != lang:
             return False
         if only_audio and not r.book.has_mp3_file():
@@ -278,7 +304,8 @@ def search_pictures(query, epoch=None, kind=None, genre=None):
 
     def ensure_exists(r):
         try:
 
     def ensure_exists(r):
         try:
-            return r.picture
+            if not r.picture:
+                return False
         except Picture.DoesNotExist:
             return False
 
         except Picture.DoesNotExist:
             return False
 
@@ -289,6 +316,8 @@ def search_pictures(query, epoch=None, kind=None, genre=None):
         if genre and not r.picture.tags.filter(category='genre', slug=genre).exists():
             return False
 
         if genre and not r.picture.tags.filter(category='genre', slug=genre).exists():
             return False
 
+        return True
+
     results = [r for r in results if ensure_exists(r)]
     return results
 
     results = [r for r in results if ensure_exists(r)]
     return results