Exemple #1
0
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
Exemple #2
0
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
Exemple #3
0
 def test_form_suggestion(self):
     form = SearchForm({'q': 'exampl'})
     self.assertEqual(form.get_suggestion(), '')
Exemple #4
0
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')
Exemple #6
0
 def test_form_suggestion(self):
     form = SearchForm({"q": "exampl"},
                       searchqueryset=SearchQuerySet("whoosh"))
     self.assertEqual(form.get_suggestion(), "example")
Exemple #7
0
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'},
                       searchqueryset=SearchQuerySet('whoosh'))
     self.assertEqual(form.get_suggestion(), 'example')
Exemple #9
0
 def test_form_suggestion(self):
     form = SearchForm({'q': 'exampl'})
     self.assertEqual(form.get_suggestion(), 'example')
Exemple #10
0
 def test_form_suggestion(self):
     form = SearchForm({"q": "exampl"}, searchqueryset=SearchQuerySet("whoosh"))
     self.assertEqual(form.get_suggestion(), "example")
Exemple #11
0
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),
    )
Exemple #12
0
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)