Implement paginated sortable table for results
This commit is contained in:
@@ -6,7 +6,7 @@ from django.http import HttpResponse, JsonResponse
|
||||
from django.shortcuts import render
|
||||
from django.urls import reverse
|
||||
from django.views import View
|
||||
from django_tables2 import SingleTableMixin
|
||||
from django_tables2 import SingleTableView
|
||||
from rest_framework.parsers import FormParser
|
||||
from rest_framework.views import APIView
|
||||
|
||||
@@ -20,30 +20,6 @@ from core.lib.threshold import (
|
||||
from core.views.ui.tables import DrilldownTable
|
||||
|
||||
|
||||
class DrilldownTableView(View, SingleTableMixin):
|
||||
table_class = DrilldownTable
|
||||
template_name = "ui/drilldown/table_results.html"
|
||||
paginate_by = 5
|
||||
|
||||
def post(self, request):
|
||||
context = query_results(request)
|
||||
table = DrilldownTable(context["results"])
|
||||
context["table"] = table
|
||||
del context["results"]
|
||||
if "message" in context:
|
||||
return render(request, self.template_name, context)
|
||||
|
||||
if self.request.htmx:
|
||||
template_name = "ui/drilldown/table_results.html"
|
||||
else:
|
||||
template_name = "ui/drilldown/table_results_partial.html"
|
||||
|
||||
if context:
|
||||
return render(request, template_name, context)
|
||||
else:
|
||||
return HttpResponse("No results")
|
||||
|
||||
|
||||
def parse_dates(dates):
|
||||
spl = dates.split(" - ")
|
||||
if all(spl):
|
||||
@@ -76,12 +52,52 @@ def create_tags(query):
|
||||
return tags
|
||||
|
||||
|
||||
def drilldown_search(request):
|
||||
template_name = "ui/drilldown/results.html"
|
||||
def make_table(context):
|
||||
table = DrilldownTable(context["object_list"])
|
||||
context["table"] = table
|
||||
# del context["results"]
|
||||
return context
|
||||
|
||||
|
||||
def make_graph(results):
|
||||
graph = json.dumps(
|
||||
[
|
||||
{
|
||||
"text": item.get("msg", None) or item.get("id"),
|
||||
"nick": item.get("nick", None),
|
||||
"value": item.get("sentiment", None) or None,
|
||||
"date": item.get("ts"),
|
||||
}
|
||||
for item in results
|
||||
]
|
||||
)
|
||||
return graph
|
||||
|
||||
|
||||
def drilldown_search(request, return_context=False, template=None):
|
||||
if not template:
|
||||
template_name = "ui/drilldown/table_results.html"
|
||||
else:
|
||||
template_name = template
|
||||
if request.user.is_anonymous:
|
||||
sizes = settings.OPENSEARCH_MAIN_SIZES_ANON
|
||||
else:
|
||||
sizes = settings.OPENSEARCH_MAIN_SIZES
|
||||
|
||||
if request.GET:
|
||||
print("GET")
|
||||
if not request.htmx:
|
||||
print("NOT REQUEST HTMX")
|
||||
template_name = "ui/drilldown/drilldown.html"
|
||||
query_params = request.GET.dict()
|
||||
elif request.POST:
|
||||
print("POST")
|
||||
query_params = request.POST.dict()
|
||||
else:
|
||||
print("ELSE")
|
||||
template_name = "ui/drilldown/drilldown.html"
|
||||
context = {"sizes": sizes}
|
||||
return render(request, template_name, context)
|
||||
|
||||
# Parse the dates
|
||||
if "dates" in query_params:
|
||||
@@ -99,54 +115,126 @@ def drilldown_search(request):
|
||||
context = query_results(request, query_params)
|
||||
elif request.POST:
|
||||
context = query_results(request, query_params)
|
||||
print("QUERY PARAMS", query_params)
|
||||
|
||||
# Turn the query into tags for populating the taglist
|
||||
tags = create_tags(query_params["query"])
|
||||
context["tags"] = tags
|
||||
if "query" in query_params:
|
||||
tags = create_tags(query_params["query"])
|
||||
context["tags"] = tags
|
||||
|
||||
context["params"] = query_params
|
||||
if "message" in context:
|
||||
print("MESSAGE IN CONTEXT")
|
||||
return render(request, template_name, context)
|
||||
|
||||
context["data"] = json.dumps(
|
||||
[
|
||||
{
|
||||
"text": item.get("msg", None) or item.get("id"),
|
||||
"nick": item.get("nick", None),
|
||||
"value": item.get("sentiment", None) or None,
|
||||
"date": item.get("ts"),
|
||||
}
|
||||
for item in context["results"]
|
||||
]
|
||||
)
|
||||
# Create data for chart.js sentiment graph
|
||||
graph = make_graph(context["object_list"])
|
||||
context["data"] = graph
|
||||
print("MADE GRAPH")
|
||||
|
||||
if context:
|
||||
context["sizes"] = sizes
|
||||
context = make_table(context)
|
||||
|
||||
# URI we're passing to the template for linking
|
||||
if "csrfmiddlewaretoken" in query_params:
|
||||
del query_params["csrfmiddlewaretoken"]
|
||||
url_params = urllib.parse.urlencode(query_params)
|
||||
context["client_uri"] = url_params
|
||||
|
||||
# URI we're passing to the template for linking, table fields removed
|
||||
table_fields = ["page", "sort"]
|
||||
clean_params = {k: v for k, v in query_params.items() if k not in table_fields}
|
||||
clean_url_params = urllib.parse.urlencode(clean_params)
|
||||
context["uri"] = clean_url_params
|
||||
|
||||
response = render(request, template_name, context)
|
||||
if request.GET:
|
||||
return context
|
||||
print("IS GET")
|
||||
if request.htmx:
|
||||
print("IS HTMX PUSHING", url_params)
|
||||
response["HX-Push"] = reverse("home") + "?" + url_params
|
||||
elif request.POST:
|
||||
del query_params["csrfmiddlewaretoken"]
|
||||
url_params = urllib.parse.urlencode(query_params)
|
||||
print("IS POST")
|
||||
print("TEMPLATE", template_name)
|
||||
response["HX-Push"] = reverse("home") + "?" + url_params
|
||||
if return_context:
|
||||
return context
|
||||
return response
|
||||
else:
|
||||
print("NO RESULTS", context)
|
||||
return HttpResponse("No results")
|
||||
|
||||
|
||||
class DrilldownTableView(SingleTableView):
|
||||
table_class = DrilldownTable
|
||||
template_name = "ui/drilldown/table_results.html"
|
||||
paginate_by = 5
|
||||
|
||||
def get_queryset(self, request, **kwargs):
|
||||
print("QUERYSET KWARGS", kwargs)
|
||||
context = drilldown_search(request, return_context=True)
|
||||
# Save the context as we will need to merge other attributes later
|
||||
self.context = context
|
||||
print(
|
||||
"VIEW CONTEXT",
|
||||
{k: v for k, v in context.items() if k not in ["object_list", "data"]},
|
||||
)
|
||||
if "object_list" in context:
|
||||
return context["object_list"]
|
||||
else:
|
||||
print("NO OBJ LIST IN CONTEXT", context)
|
||||
return []
|
||||
|
||||
def get(self, request, *args, **kwargs):
|
||||
self.object_list = self.get_queryset(request)
|
||||
allow_empty = self.get_allow_empty()
|
||||
|
||||
if not allow_empty:
|
||||
# When pagination is enabled and object_list is a queryset,
|
||||
# it's better to do a cheap query than to load the unpaginated
|
||||
# queryset in memory.
|
||||
if self.get_paginate_by(self.object_list) is not None and hasattr(
|
||||
self.object_list, "exists"
|
||||
):
|
||||
is_empty = not self.object_list.exists() # noqa
|
||||
else:
|
||||
is_empty = not self.object_list # noqa
|
||||
context = self.get_context_data()
|
||||
if isinstance(self.context, HttpResponse):
|
||||
return self.context
|
||||
print(
|
||||
"TABLE CONTEXT",
|
||||
{k: v for k, v in context.items() if k not in ["object_list", "data"]},
|
||||
)
|
||||
for k, v in self.context.items():
|
||||
if k not in context:
|
||||
context[k] = v
|
||||
print(
|
||||
"FINAL CONTEXT",
|
||||
{k: v for k, v in context.items() if k not in ["object_list", "data"]},
|
||||
)
|
||||
if request.method == "GET":
|
||||
if not request.htmx:
|
||||
print("NOT REQUEST HTMX")
|
||||
self.template_name = "ui/drilldown/drilldown.html"
|
||||
response = self.render_to_response(context)
|
||||
# if not request.method == "GET":
|
||||
if "client_uri" in context:
|
||||
print("PUSHING CLIENT URI", context["client_uri"])
|
||||
response["HX-Push"] = reverse("home") + "?" + context["client_uri"]
|
||||
return response
|
||||
|
||||
def post(self, request, *args, **kwargs):
|
||||
return self.get(request, *args, **kwargs)
|
||||
|
||||
|
||||
class Drilldown(View):
|
||||
template_name = "ui/drilldown/drilldown.html"
|
||||
plan_name = "drilldown"
|
||||
|
||||
def get(self, request):
|
||||
if request.user.is_anonymous:
|
||||
sizes = settings.OPENSEARCH_MAIN_SIZES_ANON
|
||||
else:
|
||||
sizes = settings.OPENSEARCH_MAIN_SIZES
|
||||
|
||||
context = {}
|
||||
if request.GET:
|
||||
context = drilldown_search(request)
|
||||
context["sizes"] = sizes
|
||||
return render(request, self.template_name, context)
|
||||
return drilldown_search(request)
|
||||
|
||||
def post(self, request):
|
||||
return drilldown_search(request)
|
||||
|
||||
@@ -32,3 +32,5 @@ class DrilldownTable(Table):
|
||||
status = Column()
|
||||
user = Column()
|
||||
version_sentiment = Column()
|
||||
template_name = "ui/drilldown/table_results.html"
|
||||
paginate_by = 5
|
||||
|
||||
Reference in New Issue
Block a user