diff --git a/app/urls.py b/app/urls.py index 0a88d94..f1b38b2 100644 --- a/app/urls.py +++ b/app/urls.py @@ -22,7 +22,7 @@ from django.views.generic import TemplateView from core.ui.views.drilldown import Drilldown from core.views import Billing, Cancel, Home, Order, Portal, Signup from core.views.callbacks import Callback -from core.views.charts import SentimentChartJSONView, VolumeChartJSONView +from core.views.dynamic.search import APISearch, Search urlpatterns = [ path("", Home.as_view(), name="home"), @@ -43,14 +43,6 @@ urlpatterns = [ path("accounts/", include("django.contrib.auth.urls")), path("accounts/signup/", Signup.as_view(), name="signup"), path("ui/drilldown/", Drilldown.as_view(), name="drilldown"), - path( - "ui/drilldown/chart/volume/json/", - VolumeChartJSONView.as_view(), - name="chart_volume_json", - ), - path( - "ui/drilldown/chart/sentiment/json/", - SentimentChartJSONView.as_view(), - name="chart_sentiment_json", - ), + path("parts/search/", Search.as_view(), name="search"), + path("api/search/", APISearch.as_view(), name="api_search"), ] + static(settings.STATIC_URL, document_root=settings.STATIC_ROOT) diff --git a/core/static/chart.js b/core/static/chart.js new file mode 100644 index 0000000..f5580da --- /dev/null +++ b/core/static/chart.js @@ -0,0 +1,34 @@ +function loadJson(selector) { + return JSON.parse(document.querySelector(selector).getAttribute('data-json')); + } + + +var jsonData = loadJson('#jsonData'); +var data = jsonData.map((item) => item.value); +var labels = jsonData.map((item) => item.date); + +var config = { + type: 'line', + data: { + labels: labels, + datasets: [ + { + label: 'Sentiment', + backgroundColor: 'black', + borderColor: 'lightblue', + data: data, + fill: false + } + ] + }, + options: { + responsive: true, + + } +} +var element = document.getElementById('volume'); +element.removeAttribute("height"); +element.removeAttribute("width"); + +var ctx = document.getElementById('volume').getContext('2d'); +new Chart(ctx, config); diff --git a/core/templates/base.html b/core/templates/base.html index e6b3912..61086a0 100644 --- a/core/templates/base.html +++ b/core/templates/base.html @@ -10,6 +10,7 @@ + + + + +
+
+ + + + +
+
+ + + {% endif %} + +{% endblock %} diff --git a/core/templates/ui/chart.html b/core/templates/ui/chart.html new file mode 100644 index 0000000..af8c093 --- /dev/null +++ b/core/templates/ui/chart.html @@ -0,0 +1,11 @@ +{% load static %} + + + + + + + + + + \ No newline at end of file diff --git a/core/templates/ui/drilldown.html b/core/templates/ui/drilldown.html index aa801f2..39ca518 100644 --- a/core/templates/ui/drilldown.html +++ b/core/templates/ui/drilldown.html @@ -1,8 +1,7 @@ {% extends "base.html" %} {% load static %} {% block content %} - - +
{% csrf_token %} @@ -79,102 +78,16 @@
- - -
- {% if results is not None %} -
-
- - - - - - - - - - - - - - {% for item in results %} - - - - - - - - - {% endfor %} - -
TSmsghostnickchannelnet
{{ item.ts }}{{ item.msg }}{{ item.host }}{{ item.nick }}{{ item.channel }}{{ item.net }}
-
-
-
-
-
-

{{ card }} hits

-
- {% if redacted != 0 %} -
-

{{ redacted }} redacted

-
- {% endif %} - - {% if exemption is not None %} -
-

god mode

-
- {% endif %} -
-

{{ took }}ms

-
-
-
- -
-
-
- - - - - -
-
-
-
- - - - -
-
-
- - {% endif %} + +
+
{% endblock %} diff --git a/core/templates/ui/results.html b/core/templates/ui/results.html new file mode 100644 index 0000000..9251cba --- /dev/null +++ b/core/templates/ui/results.html @@ -0,0 +1,66 @@ +{% load static %} + +
+{% if results is not None %} + +
+
+
+ + + +
+
+
+
+
+ + + + + + + + + + + + + + {% for item in results %} + + + + + + + + + {% endfor %} + +
TSmsghostnickchannelnet
{{ item.ts }}{{ item.msg }}{{ item.host }}{{ item.nick }}{{ item.channel }}{{ item.net }}
+
+
+
+
+
+

{{ card }} hits

+
+ {% if redacted != 0 %} +
+

{{ redacted }} redacted

+
+ {% endif %} + + {% if exemption is not None %} +
+

god mode

+
+ {% endif %} +
+

{{ took }}ms

+
+
+
+ {% endif %} +
\ No newline at end of file diff --git a/core/ui/views/drilldown.py b/core/ui/views/drilldown.py index b0d4144..9bef317 100644 --- a/core/ui/views/drilldown.py +++ b/core/ui/views/drilldown.py @@ -1,14 +1,11 @@ -import pprint - from django.conf import settings from django.contrib.auth.mixins import LoginRequiredMixin from django.shortcuts import render from django.views import View -from core.lib.opensearch import initialise_opensearch, run_main_query +from core.lib.opensearch import initialise_opensearch client = initialise_opensearch() -pp = pprint.PrettyPrinter(indent=4) class Drilldown(LoginRequiredMixin, View): @@ -24,36 +21,3 @@ class Drilldown(LoginRequiredMixin, View): "timescales": settings.OPENSEARCH_MAIN_TIMESCALES, } return render(request, self.template_name, context) - - def post(self, request): - if not request.user.has_plan(self.plan_name): - return render(request, "denied.html") - 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 render(request, "denied.html") - # pp.pprint(results) - 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 render(request, self.template_name, context) - return render(request, self.template_name) diff --git a/core/views/__init__.py b/core/views/__init__.py index f4f909c..6f7d219 100644 --- a/core/views/__init__.py +++ b/core/views/__init__.py @@ -41,14 +41,17 @@ class Order(LoginRequiredMixin, View): def get(self, request, plan_name): plan = Plan.objects.get(name=plan_name) try: - session = stripe.checkout.Session.create( - payment_method_types=settings.ALLOWED_PAYMENT_METHODS, - mode="subscription", - customer=request.user.stripe_id, - line_items=assemble_plan_map(product_id_filter=plan.product_id), - success_url=request.build_absolute_uri(reverse("success")), - cancel_url=request.build_absolute_uri(reverse("cancel")), - ) + cast = { + "payment_method_types": settings.ALLOWED_PAYMENT_METHODS, + "mode": "subscription", + "customer": request.user.stripe_id, + "line_items": assemble_plan_map(product_id_filter=plan.product_id), + "success_url": request.build_absolute_uri(reverse("success")), + "cancel_url": request.build_absolute_uri(reverse("cancel")), + } + if request.user.is_superuser: + cast["discounts"] = [{"coupon": settings.STRIPE_ADMIN_COUPON}] + session = stripe.checkout.Session.create(**cast) Session.objects.create(user=request.user, session=session.id) return redirect(session.url) # return JsonResponse({'id': session.id}) diff --git a/core/views/charts.py b/core/views/charts.py deleted file mode 100644 index 047c89d..0000000 --- a/core/views/charts.py +++ /dev/null @@ -1,71 +0,0 @@ -from chartjs.views.lines import BaseLineChartView -from django.contrib.auth.mixins import LoginRequiredMixin -from django.utils.decorators import method_decorator -from django.views.decorators.csrf import csrf_exempt - - -class CSRFExemptMixin(object): - @method_decorator(csrf_exempt) - def dispatch(self, *args, **kwargs): - return super(CSRFExemptMixin, self).dispatch(*args, **kwargs) - - -class VolumeChartJSONView(CSRFExemptMixin, LoginRequiredMixin, BaseLineChartView): - def post(self, request, *args, **kwargs): - print("POST") - context = self.get_context_data(**kwargs) - return self.render_to_response(context) - - def get_context_data(self, **kwargs): - data = super(VolumeChartJSONView, self).get_context_data(**kwargs) - # data["colors"] = islice(next_color(), 0, 50) - print("KWARGS", kwargs) - return data - - def get_labels(self): - """Return 7 labels for the x-axis.""" - return ["January", "February", "March", "April", "May", "June", "July"] - - def get_providers(self): - """Return names of datasets.""" - return ["Central", "Eastside", "Westside"] - - def get_data(self): - """Return 3 datasets to plot.""" - - return [ - [75, 44, 92, 11, 44, 95, 35], - [41, 92, 18, 3, 73, 87, 92], - [87, 21, 94, 3, 90, 13, 65], - ] - - -class SentimentChartJSONView(CSRFExemptMixin, LoginRequiredMixin, BaseLineChartView): - def post(self, request, *args, **kwargs): - print("POST") - print(request.POST) - context = self.get_context_data(**kwargs) - return self.render_to_response(context) - - def get_context_data(self, **kwargs): - data = super(SentimentChartJSONView, self).get_context_data(**kwargs) - # data["colors"] = islice(next_color(), 0, 50) - print("KWARGS", kwargs) - return data - - def get_labels(self): - """Return 7 labels for the x-axis.""" - return ["January", "February", "March", "April", "May", "June", "July"] - - def get_providers(self): - """Return names of datasets.""" - return ["Central", "Eastside", "Westside"] - - def get_data(self): - """Return 3 datasets to plot.""" - - return [ - [75, 44, 92, 11, 44, 95, 35], - [41, 92, 18, 3, 73, 87, 92], - [87, 21, 94, 3, 90, 13, 65], - ] diff --git a/core/views/dynamic/__init__.py b/core/views/dynamic/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/core/views/dynamic/search.py b/core/views/dynamic/search.py new file mode 100644 index 0000000..2de083c --- /dev/null +++ b/core/views/dynamic/search.py @@ -0,0 +1,86 @@ +from rest_framework.views import APIView +import logging +from django.conf import settings +from django.shortcuts import render +from django.http import HttpResponse, JsonResponse +from django.contrib.auth.mixins import LoginRequiredMixin +import json +from django.views.decorators.csrf import csrf_exempt +from django.views import View +from rest_framework.parsers import JSONParser +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 + # pp.pprint(results) + 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) + print("context: ", context) + context['data'] = json.dumps( + [ + { + 'id': item.get('id'), + 'value': item.get("sentiment", 0), + 'date': item.get("ts"), + } + for item in context["results"] + ] + ) + print("context['data']: ", context['data']) + if context: + print("OGING TO RENDER") + 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): + print("POST") + if not request.user.has_plan(self.plan_name): + return JsonResponse({"success": False}) + print("PERMS") + + context = query_results(request, request.POST) + print("CONTEXT", context) + return JsonResponse(context) diff --git a/requirements.txt b/requirements.txt index c41bf94..e2c90e5 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,3 @@ crispy-bulma opensearch-py stripe django-rest-framework -django-chartjs