import json from django.conf import settings from django.contrib.auth.mixins import LoginRequiredMixin from django.http import HttpResponse, JsonResponse from django.shortcuts import render from django.views import View from core.lib.opensearch import initialise_opensearch, run_main_query client = initialise_opensearch() def query_results(request, post_params, api=False): fields = None if "fields" in request.POST: fields = request.POST.getlist("fields") if "size" in request.POST: size = request.POST["size"] if "query" in request.POST: query = request.POST["query"] results = run_main_query(client, request.user, query, fields, size) if not results: return False results_parsed = [] if "hits" in results.keys(): if "hits" in results["hits"]: for item in results["hits"]["hits"]: results_parsed.append(item["_source"]) context = { "query": query, "results": results_parsed, "card": results["hits"]["total"]["value"], "took": results["took"], "redacted": results["redacted"], "exemption": results["exemption"], "fields": settings.OPENSEARCH_MAIN_SEARCH_FIELDS, "sizes": settings.OPENSEARCH_MAIN_SIZES, "timescales": settings.OPENSEARCH_MAIN_TIMESCALES, } return context class Search(LoginRequiredMixin, View): # parser_classes = [JSONParser] template_name = "ui/results.html" plan_name = "drilldown" def post(self, request): if not request.user.has_plan(self.plan_name): return render(request, "denied.html") context = query_results(request, request.POST) context["data"] = json.dumps( [ { "id": item.get("id"), "value": item.get("sentiment", 0), "date": item.get("ts"), } for item in context["results"] ] ) if context: return render(request, self.template_name, context) else: return HttpResponse("No results") class APISearch(LoginRequiredMixin, View): # parser_classes = [JSONParser] template_name = "ui/results.html" plan_name = "drilldown" def post(self, request): if not request.user.has_plan(self.plan_name): return JsonResponse({"success": False}) context = query_results(request, request.POST) return JsonResponse(context)