1 # -*- coding: utf-8 -*-
3 from django.shortcuts import render_to_response, get_object_or_404
4 from django.template import RequestContext
5 from django.contrib.auth.decorators import login_required
6 from django.views.decorators import cache
7 from django.http import HttpResponse, HttpResponseRedirect, Http404, HttpResponsePermanentRedirect
8 from django.utils.translation import ugettext as _
10 from catalogue.utils import get_random_hash
11 from catalogue.models import Book, Tag, Fragment
12 from catalogue.fields import dumps
13 from catalogue.views import JSONResponse
14 from search import Search, JVM, SearchResult
15 from lucene import StringReader
16 from suggest.forms import PublishingSuggestForm
20 dictionary = enchant.Dict('pl_PL')
23 def did_you_mean(query, tokens):
25 # sprawdzić, czy słowo nie jest aby autorem - proste szukanie termu w author!
27 print("%s ok? %s, sug: %s" %(t, dictionary.check(t), dictionary.suggest(t)))
28 if not dictionary.check(t):
30 change[t] = dictionary.suggest(t)[0]
37 for frm, to in change.items():
38 query = query.replace(frm, to)
44 prefix = request.GET.get('term', '')
46 return JSONResponse([])
47 JVM.attachCurrentThread()
52 tags = request.GET.get('tags', '')
53 hint.tags(Tag.get_tag_list(tags))
57 # tagi beda ograniczac tutaj
58 # ale tagi moga byc na ksiazce i na fragmentach
59 # jezeli tagi dot tylko ksiazki, to wazne zeby te nowe byly w tej samej ksiazce
60 # jesli zas dotycza themes, to wazne, zeby byly w tym samym fragmencie.
63 tags = s.hint_tags(prefix)
64 books = s.hint_books(prefix)
70 'category': _(t.category),
72 'url': t.get_absolute_url()}
75 'category': _('book'),
77 'url': b.get_absolute_url()}
81 def foo(s, q, tag_list=None):
84 tag_list = Tag.get_tag_list(tag_list)
95 JVM.attachCurrentThread() # where to put this?
102 if 'q' in request.GET:
103 tags = request.GET.get('tags', '')
104 query = request.GET['q']
105 book_id = request.GET.get('book', None)
107 if book_id is not None:
108 book = get_object_or_404(Book, id=book_id)
112 tag_list = Tag.get_tag_list(tags)
117 return render_to_response('catalogue/search_too_short.html', {'tags': tag_list, 'prefix': query},
118 context_instance=RequestContext(request))
124 toks = StringReader(query)
125 fuzzy = 'fuzzy' in request.GET
129 results = SearchResult.aggregate(srch.search_perfect_book(toks, fuzzy=fuzzy, hint=hint),
130 srch.search_book(toks, fuzzy=fuzzy, hint=hint),
131 srch.search_perfect_parts(toks, fuzzy=fuzzy, hint=hint),
132 srch.search_everywhere(toks, fuzzy=fuzzy, hint=hint))
137 results.sort(reverse=True)
144 if len(results) == 1:
145 if len(results[0].hits) == 0:
146 return HttpResponseRedirect(results[0].book.get_absolute_url())
147 elif len(results[0].hits) == 1 and results[0].hits[0] is not None:
148 frag = Fragment.objects.get(anchor=results[0].hits[0])
149 return HttpResponseRedirect(frag.get_absolute_url())
150 elif len(results) == 0:
151 form = PublishingSuggestForm(initial={"books": query + ", "})
152 return render_to_response('catalogue/search_no_hits.html',
153 {'tags': tag_list, 'prefix': query,
155 context_instance=RequestContext(request))
157 return render_to_response('catalogue/search_multiple_hits.html',
158 {'tags': tag_list, 'prefix': query,
160 context_instance=RequestContext(request))
162 # return render_to_response('newsearch/search.html', {'results': results,
163 # 'did_you_mean': (query is not None) and
164 # did_you_mean(query, srch.get_tokens(query, field='SIMPLE')),
166 # context_instance=RequestContext(request))