def simple_search(request): search_form = SimpleSearchForm(request.GET, auto_id=False) if not search_form.is_valid(): return HttpResponse( json.dumps({"error": _("Invalid search data.")}), content_type="application/json", status=400, ) cleaned = search_form.cleaned_data # get language language = locale_or_default(cleaned["language"] or request.LANGUAGE_CODE) lang_name = settings.LANGUAGES_DICT.get(language.lower()) or "" # get product and product titles product, product_titles = _get_product_title(cleaned["product"]) # get page try: page = int(request.GET.get("page", 1)) except ValueError: page = 1 # create search object search = CompoundSearch(locale=language, product=product) # apply aaq/kb configs if cleaned["w"] & constants.WHERE_WIKI: search.add(WikiSearch) if cleaned["w"] & constants.WHERE_SUPPORT: search.add(QuestionSearch) # execute search search.run(cleaned["q"], page=page) total = search.total results = search.results # generate fallback results if necessary fallback_results = None if total == 0: fallback_results = _fallback_results(language, cleaned["product"]) # create results dictionary for instant search data = { "num_results": total, "total": total, "results": results, "fallback_results": fallback_results, "product_titles": product_titles, "q": cleaned["q"], "w": cleaned["w"], "lang_name": lang_name, "products": [ {"slug": p.slug, "title": pgettext("DB: products.Product.title", p.title)} for p in Product.objects.filter(visible=True) ], "pagination": _make_pagination(page, total), } if product: data["product"] = product.slug if not results: data["message"] = constants.NO_MATCH json_data = JSONRenderer().render(data) return HttpResponse(json_data, content_type="application/json")
def simple_search(request): is_json = request.GET.get("format") == "json" search_form = SimpleSearchForm(request.GET, auto_id=False) if not search_form.is_valid(): if not is_json: return render(request, "search/form.html", {"search_form": search_form}) return HttpResponse( json.dumps({"error": _("Invalid search data.")}), content_type="application/json", status=400, ) cleaned = search_form.cleaned_data # get language language = locale_or_default(cleaned["language"] or request.LANGUAGE_CODE) lang_name = settings.LANGUAGES_DICT.get(language.lower()) or "" # get product and product titles product, product_titles = _get_product_title(cleaned["product"]) # create search object search = CompoundSearch() # apply aaq/kb configs if cleaned["w"] & constants.WHERE_WIKI: search.add(WikiSearch(query=cleaned["q"], locale=language, product=product)) if cleaned["w"] & constants.WHERE_SUPPORT: search.add(QuestionSearch(query=cleaned["q"], locale=language, product=product)) # execute search page = paginate( request, search, per_page=settings.SEARCH_RESULTS_PER_PAGE, paginator_cls=SumoSearchPaginator, ) total = search.total results = search.results # generate fallback results if necessary fallback_results = None if total == 0: fallback_results = _fallback_results(language, cleaned["product"]) data = { "num_results": total, "results": results, "fallback_results": fallback_results, "product_titles": ", ".join(product_titles), "q": cleaned["q"], "w": cleaned["w"], "lang_name": lang_name, "products": Product.objects.filter(visible=True), } if not is_json: data.update( { "product": product, "pages": page, "search_form": search_form, } ) return render(request, "search/results.html", data) # create results dictionary for instant search data.update( { "total": total, "products": [ {"slug": p.slug, "title": pgettext("DB: products.Product.title", p.title)} for p in data["products"] ], "pagination": _make_pagination(page), } ) if product: data["product"] = product.slug if not results: data["message"] = constants.NO_MATCH json_data = JSONRenderer().render(data) return HttpResponse(json_data, content_type="application/json")