def search_helper(request, searchqueryset, pagination_function): """ Description: Helper function by searching Based off haystack.views.basic_search() Arguments: - request: HttpRequest object - searchqueryset: SearchQuerySet limited to a model by calling SearchQuerySet().models() - pagination_function: Helper function for use in paginating the search results Return: Dictionary with keys coming from pagination_function. Two New keys will be added to it: - query: search query - suggestion: backend-suggested search query Author: Nnoduka Eruchalu """ query = '' results = EmptySearchQuerySet() suggestion = False search_list = [] if request.GET.get('q'): form = SearchForm(request.GET, searchqueryset=searchqueryset, load_all=True) if form.is_valid(): query = form.cleaned_data['q'] results = form.search() # for odd reasons there are duplicates in the haystack results... search_list = list_dedup([r.object for r in results]) if results.query.backend.include_spelling: suggestion = form.get_suggestion() context = pagination_function(request, search_list) context['query'] = query context['suggestion'] = suggestion return context
def test_form_suggestion(self): form = SearchForm({'q': 'exampl'}) self.assertEqual(form.get_suggestion(), '')
def search(request): """ Returns messages corresponding to a query """ mlist_fqdn = request.GET.get("mlist") if mlist_fqdn is None: mlist = None else: try: mlist = MailingList.objects.get(name=mlist_fqdn) except MailingList.DoesNotExist: raise Http404("No archived mailing-list by that name.") if not is_mlist_authorized(request, mlist): return render(request, "hyperkitty/errors/private.html", { "mlist": mlist, }, status=403) query = '' results = EmptySearchQuerySet() sqs = RelatedSearchQuerySet() # Remove private non-subscribed lists if mlist is not None: sqs = sqs.filter(mailinglist__exact=mlist.name) else: excluded_mlists = MailingList.objects.filter( archive_policy=ArchivePolicy.private.value) if request.user.is_authenticated(): subscriptions = request.user.hyperkitty_profile.get_subscriptions() excluded_mlists = excluded_mlists.exclude( list_id__in=subscriptions.keys()) excluded_mlists = excluded_mlists.values_list("name", flat=True) sqs = sqs.exclude(mailinglist__in=excluded_mlists) # Sorting sort_mode = request.GET.get('sort') if sort_mode == "date-asc": sqs = sqs.order_by("date") elif sort_mode == "date-desc": sqs = sqs.order_by("-date") # Handle data if request.GET.get('q'): form = SearchForm( request.GET, searchqueryset=sqs, load_all=True) if form.is_valid(): query = form.cleaned_data['q'] results = form.search() else: form = SearchForm(searchqueryset=sqs, load_all=True) emails = paginate(results, page_num=request.GET.get('page')) for email in emails: if request.user.is_authenticated(): email.object.myvote = email.object.votes.filter(user=request.user).first() else: email.object.myvote = None context = { 'mlist' : mlist, 'form': form, 'emails': emails, 'query': query, 'sort_mode': sort_mode, 'suggestion': None, } if results.query.backend.include_spelling: context['suggestion'] = form.get_suggestion() return render(request, "hyperkitty/search_results.html", context)
def test_form_suggestion(self): form = SearchForm({'q': 'exampl'}, searchqueryset=SearchQuerySet('whoosh')) self.assertEqual(form.get_suggestion(), 'example')
def test_form_suggestion(self): form = SearchForm({"q": "exampl"}, searchqueryset=SearchQuerySet("whoosh")) self.assertEqual(form.get_suggestion(), "example")
def search(request): """ Returns messages corresponding to a query """ mlist_fqdn = request.GET.get("mlist") if mlist_fqdn is None: mlist = None else: try: mlist = MailingList.objects.get(name=mlist_fqdn) except MailingList.DoesNotExist: raise Http404("No archived mailing-list by that name.") if not is_mlist_authorized(request, mlist): return render(request, "hyperkitty/errors/private.html", { "mlist": mlist, }, status=403) query = '' results = EmptySearchQuerySet() sqs = RelatedSearchQuerySet() # Remove private non-subscribed lists if mlist is not None: sqs = sqs.filter(mailinglist__exact=mlist.name) else: excluded_mlists = MailingList.objects.filter( archive_policy=ArchivePolicy.private.value) if request.user.is_authenticated: subscriptions = get_subscriptions(request.user) excluded_mlists = excluded_mlists.exclude( list_id__in=subscriptions.keys()) excluded_mlists = excluded_mlists.values_list("name", flat=True) sqs = sqs.exclude(mailinglist__in=excluded_mlists) # Sorting sort_mode = request.GET.get('sort') if sort_mode == "date-asc": sqs = sqs.order_by("date") elif sort_mode == "date-desc": sqs = sqs.order_by("-date") # Handle data if request.GET.get('q'): form = SearchForm(request.GET, searchqueryset=sqs, load_all=True) if form.is_valid(): query = form.cleaned_data['q'] results = form.search() else: form = SearchForm(searchqueryset=sqs, load_all=True) try: emails = paginate( results, request.GET.get('page'), request.GET.get('count'), ) except Exception as e: backend = settings.HAYSTACK_CONNECTIONS[DEFAULT_ALIAS]["ENGINE"] if backend == "haystack.backends.whoosh_backend.WhooshEngine": from whoosh.qparser.common import QueryParserError search_exception = QueryParserError if backend == "xapian_backend.XapianEngine": from xapian import QueryParserError search_exception = QueryParserError if not isinstance(e, search_exception): raise emails = paginate([]) form.add_error( "q", ValidationError( _('Parsing error: %(error)s'), params={"error": e}, code="parse", )) for email in emails: if request.user.is_authenticated: email.object.myvote = email.object.votes.filter( user=request.user).first() else: email.object.myvote = None context = { 'mlist': mlist, 'form': form, 'emails': emails, 'query': query, 'sort_mode': sort_mode, 'suggestion': None, } if results.query.backend.include_spelling: context['suggestion'] = form.get_suggestion() return render(request, "hyperkitty/search_results.html", context)
def test_form_suggestion(self): form = SearchForm({'q': 'exampl'}) self.assertEqual(form.get_suggestion(), 'example')
def search(request): """ Description: Handles requests from site's search bar Based off haystack.views.basic_search() Arguments: request: HttpRequest object Return: HttpResponse object showing search results with following additional details - query: search query - suggestion: backend-suggested search query Author: Nnoduka Eruchalu """ query = "" results = EmptySearchQuerySet() suggestion = False if request.GET.get("q"): form = SearchForm(request.GET, searchqueryset=None, load_all=True) if form.is_valid(): query = form.cleaned_data["q"] results = form.search() if results.query.backend.include_spelling: suggestion = form.get_suggestion() search_list = [r.object for r in results] paginator = Paginator(search_list, settings.RESULTS_PER_PAGE) page = request.GET.get("page") try: results = paginator.page(page) except PageNotAnInteger: # if page is not an integer, deliver first page. results = paginator.page(1) except EmptyPage: # if page is out of range (e.g. 999), deliver last page of results results = paginator.page(paginator.num_pages) if results.has_next(): next_page_num = results.next_page_number() else: next_page_num = 0 # way of indicating no more pages... 1 index'd helped! if results.has_previous(): prev_page_num = results.previous_page_number() else: prev_page_num = 0 results = results.object_list return render_to_response( "search/search.html", { "query": query, "suggestion": suggestion, "results": results, "next_page": next_page_num, "prev_page": prev_page_num, }, context_instance=RequestContext(request), )
def search(request): """ Returns messages corresponding to a query """ mlist_fqdn = request.GET.get("mlist") if mlist_fqdn is None: mlist = None else: try: mlist = MailingList.objects.get(name=mlist_fqdn) except MailingList.DoesNotExist: raise Http404("No archived mailing-list by that name.") if not is_mlist_authorized(request, mlist): return render(request, "hyperkitty/errors/private.html", { "mlist": mlist, }, status=403) query = '' results = EmptySearchQuerySet() sqs = RelatedSearchQuerySet() # Remove private non-subscribed lists if mlist is not None: sqs = sqs.filter(mailinglist__exact=mlist.name) else: excluded_mlists = MailingList.objects.filter( archive_policy=ArchivePolicy.private.value) if request.user.is_authenticated(): subscriptions = request.user.hyperkitty_profile.get_subscriptions() excluded_mlists = excluded_mlists.exclude( name__in=subscriptions.keys()) excluded_mlists = excluded_mlists.values_list("name", flat=True) sqs = sqs.exclude(mailinglist__in=excluded_mlists) # Sorting sort_mode = request.GET.get('sort') if sort_mode == "date-asc": sqs = sqs.order_by("date") elif sort_mode == "date-desc": sqs = sqs.order_by("-date") # Handle data if request.GET.get('q'): form = SearchForm( request.GET, searchqueryset=sqs, load_all=True) if form.is_valid(): query = form.cleaned_data['q'] results = form.search() else: form = SearchForm(searchqueryset=sqs, load_all=True) messages = paginate(results, page_num=request.GET.get('page')) for message in messages: if request.user.is_authenticated(): message.object.myvote = message.object.votes.filter(user=request.user).first() else: message.object.myvote = None context = { 'mlist' : mlist, 'form': form, 'messages': messages, 'query': query, 'sort_mode': sort_mode, 'suggestion': None, } if results.query.backend.include_spelling: context['suggestion'] = form.get_suggestion() return render(request, "hyperkitty/search_results.html", context)