-def main(request):
- query = request.GET.get('q', '')
- query = ' '.join(query.split())
- # filter out private use characters
- import unicodedata
- query = ''.join(ch for ch in query if unicodedata.category(ch) != 'Co')
-
- if len(query) < 2:
- return render_to_response(
- 'catalogue/search_too_short.html', {'prefix': query},
- context_instance=RequestContext(request))
- elif len(query) > 256:
- return render_to_response(
- 'catalogue/search_too_long.html', {'prefix': query}, context_instance=RequestContext(request))
-
- query = remove_query_syntax_chars(query)
-
- words = query.split()
- if len(words) > 10:
- query = ' '.join(words[:10])
-
- search = Search()
-
- pd_authors = Author.objects.filter(name__icontains=query)
- existing_slugs = Tag.objects.filter(
- category='author', slug__in=list(pd_authors.values_list('slug', flat=True)))\
- .values_list('slug', flat=True)
- pd_authors = pd_authors.exclude(slug__in=existing_slugs)
-
- results_parts = []
-
- search_fields = []
- fieldsets = (
- (['authors'], True),
- (['title'], True),
- (['metadata'], True),
- (['text', 'themes_pl'], False),
- )
- for fieldset, is_book in fieldsets:
- search_fields += fieldset
- results_parts.append(search.search_words(words, search_fields, book=is_book))
-
- results = []
- ids_results = {}
- for results_part in results_parts:
- for result in sorted(SearchResult.aggregate(results_part), reverse=True):
- book_id = result.book_id
- if book_id in ids_results:
- ids_results[book_id].merge(result)
- else:
- results.append(result)
- ids_results[book_id] = result
-
- for result in results:
- search.get_snippets(result, query, num=3)
-
- suggestion = u''
-
- def ensure_exists(r):
- try:
- return r.book
- except Book.DoesNotExist:
- return False
-
- results = filter(ensure_exists, results)
-
- if not results and not pd_authors:
- form = PublishingSuggestForm(initial={"books": query + ", "})
- return render_to_response(
- 'catalogue/search_no_hits.html',
- {
- 'form': form,
- 'did_you_mean': suggestion
- },
- context_instance=RequestContext(request))
-
- if not results and len(pd_authors) == 1:
- return HttpResponseRedirect(pd_authors[0].get_absolute_url())
-
- return render_to_response(
- 'catalogue/search_multiple_hits.html',
- {
- 'pd_authors': pd_authors,
- 'results': results,
- 'did_you_mean': suggestion
- },
- context_instance=RequestContext(request))
+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)