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 %}
-
-
+
- {% if results is not None %}
-
-
-
-
-
- TS |
- msg |
- host |
- nick |
- channel |
- net |
-
-
-
-
- {% for item in results %}
-
- {{ item.ts }} |
- {{ item.msg }} |
- {{ item.host }} |
- {{ item.nick }} |
- {{ item.channel }} |
- {{ item.net }} |
-
- {% endfor %}
-
-
-
-
-
-
-
- {% if redacted != 0 %}
-
-
{{ redacted }} redacted
-
- {% endif %}
-
- {% if exemption is not None %}
-
- {% endif %}
-
-
-
-
-
-
- {% 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 %}
+
+
+
+
+
+
+
+ TS |
+ msg |
+ host |
+ nick |
+ channel |
+ net |
+
+
+
+
+ {% for item in results %}
+
+ {{ item.ts }} |
+ {{ item.msg }} |
+ {{ item.host }} |
+ {{ item.nick }} |
+ {{ item.channel }} |
+ {{ item.net }} |
+
+ {% endfor %}
+
+
+
+
+
+
+
+ {% if redacted != 0 %}
+
+
{{ redacted }} redacted
+
+ {% endif %}
+
+ {% if exemption is not None %}
+
+ {% endif %}
+
+
+
+ {% 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