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)))
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)
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