fixes to vierwer/folding catalogue in menu
[wolnelektury.git] / apps / search / views.py
index 72852d0..9a0b469 100644 (file)
@@ -3,7 +3,6 @@
 from django.conf import settings
 from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext
 from django.conf import settings
 from django.shortcuts import render_to_response, get_object_or_404
 from django.template import RequestContext
-from django.contrib.auth.decorators import login_required
 from django.views.decorators import cache
 from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponsePermanentRedirect
 from django.utils.translation import ugettext as _
 from django.views.decorators import cache
 from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponsePermanentRedirect
 from django.utils.translation import ugettext as _
@@ -13,9 +12,7 @@ from catalogue.models import Book, Tag, Fragment
 from pdcounter.models import Author as PDCounterAuthor, BookStub as PDCounterBook
 from catalogue.views import JSONResponse
 from search import Search, SearchResult
 from pdcounter.models import Author as PDCounterAuthor, BookStub as PDCounterBook
 from catalogue.views import JSONResponse
 from search import Search, SearchResult
-from lucene import StringReader
 from suggest.forms import PublishingSuggestForm
 from suggest.forms import PublishingSuggestForm
-from time import sleep
 import re
 #import enchant
 import json
 import re
 #import enchant
 import json
@@ -28,6 +25,13 @@ def match_word_re(word):
         return "[[:<:]]%s[[:>:]]" % word
 
 
         return "[[:<:]]%s[[:>:]]" % word
 
 
+query_syntax_chars = re.compile(r"[\\/*:(){}]")
+
+
+def remove_query_syntax_chars(query, replace=' '):
+    return query_syntax_chars.sub(' ', query)
+
+
 def did_you_mean(query, tokens):
     return query
     # change = {}
 def did_you_mean(query, tokens):
     return query
     # change = {}
@@ -59,6 +63,8 @@ def hint(request):
     if len(prefix) < 2:
         return JSONResponse([])
 
     if len(prefix) < 2:
         return JSONResponse([])
 
+    prefix = remove_query_syntax_chars(prefix)
+
     search = Search()
     # tagi beda ograniczac tutaj
     # ale tagi moga byc na ksiazce i na fragmentach
     search = Search()
     # tagi beda ograniczac tutaj
     # ale tagi moga byc na ksiazce i na fragmentach
@@ -114,6 +120,9 @@ def main(request):
         return render_to_response('catalogue/search_too_short.html',
                                   {'prefix': query},
             context_instance=RequestContext(request))
         return render_to_response('catalogue/search_too_short.html',
                                   {'prefix': query},
             context_instance=RequestContext(request))
+
+    query = remove_query_syntax_chars(query)
+    
     search = Search()
 
     theme_terms = search.index.analyze(text=query, field="themes_pl") \
     search = Search()
 
     theme_terms = search.index.analyze(text=query, field="themes_pl") \
@@ -124,15 +133,17 @@ def main(request):
     tags = split_tags(tags)
 
     author_results = search.search_phrase(query, 'authors', book=True)
     tags = split_tags(tags)
 
     author_results = search.search_phrase(query, 'authors', book=True)
+    translator_results = search.search_phrase(query, 'translators', book=True)
+
     title_results = search.search_phrase(query, 'title', book=True)
 
     # Boost main author/title results with mixed search, and save some of its results for end of list.
     # boost author, title results
     title_results = search.search_phrase(query, 'title', book=True)
 
     # Boost main author/title results with mixed search, and save some of its results for end of list.
     # boost author, title results
-    author_title_mixed = search.search_some(query, ['authors', 'title', 'tags'], query_terms=theme_terms)
+    author_title_mixed = search.search_some(query, ['authors', 'translators', 'title', 'tags'], query_terms=theme_terms)
     author_title_rest = []
 
     for b in author_title_mixed:
     author_title_rest = []
 
     for b in author_title_mixed:
-        also_in_mixed = filter(lambda ba: ba.book_id == b.book_id, author_results + title_results)
+        also_in_mixed = filter(lambda ba: ba.book_id == b.book_id, author_results + translator_results + title_results)
         for b2 in also_in_mixed:
             b2.boost *= 1.1
         if also_in_mixed is []:
         for b2 in also_in_mixed:
             b2.boost *= 1.1
         if also_in_mixed is []:
@@ -155,15 +166,17 @@ def main(request):
                     return True
             return False
         return f
                     return True
             return False
         return f
-    f = already_found(author_results + title_results + text_phrase)
+    f = already_found(author_results + translator_results + title_results + text_phrase)
     everywhere = filter(lambda x: not f(x), everywhere)
 
     author_results = SearchResult.aggregate(author_results)
     everywhere = filter(lambda x: not f(x), everywhere)
 
     author_results = SearchResult.aggregate(author_results)
+    translator_results = SearchResult.aggregate(translator_results)
     title_results = SearchResult.aggregate(title_results)
 
     everywhere = SearchResult.aggregate(everywhere, author_title_rest)
 
     for field, res in [('authors', author_results),
     title_results = SearchResult.aggregate(title_results)
 
     everywhere = SearchResult.aggregate(everywhere, author_title_rest)
 
     for field, res in [('authors', author_results),
+                       ('translators', translator_results),
                        ('title', title_results),
                        ('text', text_phrase),
                        ('text', everywhere)]:
                        ('title', title_results),
                        ('text', text_phrase),
                        ('text', everywhere)]:
@@ -180,22 +193,25 @@ def main(request):
             return False
 
     author_results = filter(ensure_exists, author_results)
             return False
 
     author_results = filter(ensure_exists, author_results)
+    translator_results = filter(ensure_exists, translator_results)
     title_results = filter(ensure_exists, title_results)
     text_phrase = filter(ensure_exists, text_phrase)
     everywhere = filter(ensure_exists, everywhere)
 
     title_results = filter(ensure_exists, title_results)
     text_phrase = filter(ensure_exists, text_phrase)
     everywhere = filter(ensure_exists, everywhere)
 
-    results = author_results + title_results + text_phrase + everywhere
+    results = author_results + translator_results + title_results + text_phrase + everywhere
     # ensure books do exists & sort them
     # ensure books do exists & sort them
-    results.sort(reverse=True)
-
-    if len(results) == 1:
-        fragment_hits = filter(lambda h: 'fragment' in h, results[0].hits)
-        if len(fragment_hits) == 1:
-            #anchor = fragment_hits[0]['fragment']
-            #frag = Fragment.objects.get(anchor=anchor)
-            return HttpResponseRedirect(fragment_hits[0]['fragment'].get_absolute_url())
-        return HttpResponseRedirect(results[0].book.get_absolute_url())
-    elif len(results) == 0:
+    for res in (author_results, translator_results, title_results, text_phrase, everywhere):
+        res.sort(reverse=True)
+
+    # We don't want to redirect to book text, but rather display result page even with one result.
+    # if len(results) == 1:
+    #     fragment_hits = filter(lambda h: 'fragment' in h, results[0].hits)
+    #     if len(fragment_hits) == 1:
+    #         #anchor = fragment_hits[0]['fragment']
+    #         #frag = Fragment.objects.get(anchor=anchor)
+    #         return HttpResponseRedirect(fragment_hits[0]['fragment'].get_absolute_url())
+    #     return HttpResponseRedirect(results[0].book.get_absolute_url())
+    if len(results) == 0:
         form = PublishingSuggestForm(initial={"books": query + ", "})
         return render_to_response('catalogue/search_no_hits.html',
                                   {'tags': tags,
         form = PublishingSuggestForm(initial={"books": query + ", "})
         return render_to_response('catalogue/search_no_hits.html',
                                   {'tags': tags,
@@ -208,6 +224,7 @@ def main(request):
                               {'tags': tags,
                                'prefix': query,
                                'results': {'author': author_results,
                               {'tags': tags,
                                'prefix': query,
                                'results': {'author': author_results,
+                                           'translator': translator_results,
                                            'title': title_results,
                                            'content': text_phrase,
                                            'other': everywhere},
                                            'title': title_results,
                                            'content': text_phrase,
                                            'other': everywhere},