Beispiel #1
0
def question_search(request, keywords):
    def question_search(keywords, orderby):
        return Question.objects.filter(Q(title__icontains=keywords) | Q(html__icontains=keywords))

    from forum.modules import get_handler

    question_search = get_handler('question_search', question_search)
    initial = question_search(keywords)

    return question_list(request, initial, _("questions matching '%(keywords)s'") % {'keywords': keywords},
            base_path="%s?t=question&q=%s" % (reverse('search'), django_urlquote(keywords)))
Beispiel #2
0
def question_search(request, keywords):
    def question_search(keywords):
        return Question.objects.filter(Q(title__icontains=keywords) | Q(body__icontains=keywords))

    from forum.modules import get_handler

    question_search = get_handler('question_search', question_search)
    initial = question_search(keywords)

    return question_list(request, initial, _("questions matching '%(keywords)s'") % {'keywords': keywords},
            base_path="%s?t=question&q=%s" % (reverse('search'), django_urlquote(keywords)), sort=False)
Beispiel #3
0
def search(request): #generates listing of questions matching a search query - including tags and just words
    """generates listing of questions matching a search query
    supports full text search in mysql db using sphinx and internally in postgresql
    falls back on simple partial string matching approach if
    full text search function is not available
    """
    if request.method == "GET":
        keywords = request.GET.get("q")
        search_type = request.GET.get("t")
        try:
            page = int(request.GET.get('page', '1'))
        except ValueError:
            page = 1
        if keywords is None:
            return HttpResponseRedirect(reverse(index))
        if search_type == 'tag':
            return HttpResponseRedirect(reverse('tags') + '?q=%s&page=%s' % (keywords.strip(), page))
        elif search_type == "user":
            return HttpResponseRedirect(reverse('users') + '?q=%s&page=%s' % (keywords.strip(), page))
        elif search_type == "question":
            
            template_file = "questions.html"
            # Set flag to False by default. If it is equal to True, then need to be saved.
            pagesize_changed = False
            # get pagesize from session, if failed then get default value
            user_page_size = request.session.get("pagesize", QUESTIONS_PAGE_SIZE)
            # set pagesize equal to logon user specified value in database
            if request.user.is_authenticated() and request.user.questions_per_page > 0:
                user_page_size = request.user.questions_per_page

            try:
                page = int(request.GET.get('page', '1'))
                # get new pagesize from UI selection
                pagesize = int(request.GET.get('pagesize', user_page_size))
                if pagesize <> user_page_size:
                    pagesize_changed = True

            except ValueError:
                page = 1
                pagesize  = user_page_size

            # save this pagesize to user database
            if pagesize_changed:
                request.session["pagesize"] = pagesize
                if request.user.is_authenticated():
                    user = request.user
                    user.questions_per_page = pagesize
                    user.save()

            view_id = request.GET.get('sort', None)
            view_dic = {"latest":"-added_at", "active":"-last_activity_at", "hottest":"-answer_count", "mostvoted":"-score" }
            try:
                orderby = view_dic[view_id]
            except KeyError:
                view_id = "latest"
                orderby = "-added_at"

            def question_search(keywords, orderby):
                objects = Question.objects.filter(deleted=False).extra(where=['title like %s'], params=['%' + keywords + '%']).order_by(orderby)
                # RISK - inner join queries
                return objects.select_related();

            from forum.modules import get_handler

            question_search = get_handler('question_search', question_search)
            
            objects = question_search(keywords, orderby)

            objects_list = Paginator(objects, pagesize)
            questions = objects_list.page(page)

            # Get related tags from this page objects
            related_tags = []
            for question in questions.object_list:
                tags = list(question.tags.all())
                for tag in tags:
                    if tag not in related_tags:
                        related_tags.append(tag)

            #if is_search is true in the context, prepend this string to soting tabs urls
            search_uri = "?q=%s&page=%d&t=question" % ("+".join(keywords.split()),  page)

            return render_to_response(template_file, {
                "questions" : questions,
                "tab_id" : view_id,
                "questions_count" : objects_list.count,
                "tags" : related_tags,
                "searchtag" : None,
                "searchtitle" : keywords,
                "keywords" : keywords,
                "is_unanswered" : False,
                "is_search": True, 
                "search_uri":  search_uri, 
                "context" : {
                    'is_paginated' : True,
                    'pages': objects_list.num_pages,
                    'page': page,
                    'has_previous': questions.has_previous(),
                    'has_next': questions.has_next(),
                    'previous': questions.previous_page_number(),
                    'next': questions.next_page_number(),
                    'base_url' : request.path + '?t=question&q=%s&sort=%s&' % (keywords, view_id),
                    'pagesize' : pagesize
                }}, context_instance=RequestContext(request))
 
    else:
        raise Http404