Implement choosing source in search form
This commit is contained in:
parent
fc86aae119
commit
75e9831d1c
|
@ -127,7 +127,8 @@ def run_main_query(client, user, query, custom_query=False, index=None, size=Non
|
||||||
search_query = construct_query(query, size)
|
search_query = construct_query(query, size)
|
||||||
try:
|
try:
|
||||||
response = client.search(body=search_query, index=index)
|
response = client.search(body=search_query, index=index)
|
||||||
except RequestError:
|
except RequestError as err:
|
||||||
|
print("OpenSearch error", err)
|
||||||
return False
|
return False
|
||||||
filter_blacklisted(user, response)
|
filter_blacklisted(user, response)
|
||||||
return response
|
return response
|
||||||
|
@ -141,6 +142,9 @@ def query_results(request, size=None):
|
||||||
results with the other data we have.
|
results with the other data we have.
|
||||||
"""
|
"""
|
||||||
# is_anonymous = isinstance(request.user, AnonymousUser)
|
# is_anonymous = isinstance(request.user, AnonymousUser)
|
||||||
|
message = None
|
||||||
|
message_class = None
|
||||||
|
add_bool = []
|
||||||
if request.user.is_anonymous:
|
if request.user.is_anonymous:
|
||||||
sizes = settings.OPENSEARCH_MAIN_SIZES_ANON
|
sizes = settings.OPENSEARCH_MAIN_SIZES_ANON
|
||||||
else:
|
else:
|
||||||
|
@ -149,14 +153,39 @@ def query_results(request, size=None):
|
||||||
if "size" in request.POST:
|
if "size" in request.POST:
|
||||||
size = request.POST["size"]
|
size = request.POST["size"]
|
||||||
if size not in sizes:
|
if size not in sizes:
|
||||||
return False
|
message = "Size is not permitted"
|
||||||
|
message_class = "danger"
|
||||||
|
return {"message": message, "class": message_class}
|
||||||
|
if "source" in request.POST:
|
||||||
|
source = request.POST["source"]
|
||||||
|
if source not in settings.OPENSEARCH_MAIN_SOURCES:
|
||||||
|
message = "Invalid source"
|
||||||
|
message_class = "danger"
|
||||||
|
return {"message": message, "class": message_class}
|
||||||
|
if source != "all":
|
||||||
|
add_bool.append({"src": source})
|
||||||
|
|
||||||
|
if "check-sentiment" in request.POST:
|
||||||
|
if "sentiment" in request.POST:
|
||||||
|
sentiment = request.POST["sentiment"]
|
||||||
|
try:
|
||||||
|
sentiment = float(sentiment)
|
||||||
|
except ValueError:
|
||||||
|
message = "Sentiment is not a float"
|
||||||
|
message_class = "danger"
|
||||||
|
return {"message": message, "class": message_class}
|
||||||
|
|
||||||
if "query" in request.POST:
|
if "query" in request.POST:
|
||||||
query = request.POST["query"]
|
query = request.POST["query"]
|
||||||
|
search_query = construct_query(query, size)
|
||||||
|
if add_bool:
|
||||||
|
for item in add_bool:
|
||||||
|
search_query["query"]["bool"]["must"].append({"match": item})
|
||||||
results = run_main_query(
|
results = run_main_query(
|
||||||
client,
|
client,
|
||||||
request.user, # passed through run_main_query to filter_blacklisted
|
request.user, # passed through run_main_query to filter_blacklisted
|
||||||
query,
|
search_query,
|
||||||
|
custom_query=True,
|
||||||
size=size,
|
size=size,
|
||||||
)
|
)
|
||||||
if not results:
|
if not results:
|
||||||
|
@ -208,28 +237,34 @@ def construct_query(query, size):
|
||||||
query = {
|
query = {
|
||||||
"size": size,
|
"size": size,
|
||||||
"query": {
|
"query": {
|
||||||
"query_string": {
|
"bool": {
|
||||||
"query": query,
|
"must": [
|
||||||
# "fields": fields,
|
{
|
||||||
# "default_field": "msg",
|
"query_string": {
|
||||||
# "type": "best_fields",
|
"query": query,
|
||||||
"fuzziness": "AUTO",
|
# "fields": fields,
|
||||||
"fuzzy_transpositions": True,
|
# "default_field": "msg",
|
||||||
"fuzzy_max_expansions": 50,
|
# "type": "best_fields",
|
||||||
"fuzzy_prefix_length": 0,
|
"fuzziness": "AUTO",
|
||||||
# "minimum_should_match": 1,
|
"fuzzy_transpositions": True,
|
||||||
"default_operator": "or",
|
"fuzzy_max_expansions": 50,
|
||||||
"analyzer": "standard",
|
"fuzzy_prefix_length": 0,
|
||||||
"lenient": True,
|
# "minimum_should_match": 1,
|
||||||
"boost": 1,
|
"default_operator": "or",
|
||||||
"allow_leading_wildcard": True,
|
"analyzer": "standard",
|
||||||
# "enable_position_increments": False,
|
"lenient": True,
|
||||||
"phrase_slop": 3,
|
"boost": 1,
|
||||||
# "max_determinized_states": 10000,
|
"allow_leading_wildcard": True,
|
||||||
"quote_field_suffix": "",
|
# "enable_position_increments": False,
|
||||||
"quote_analyzer": "standard",
|
"phrase_slop": 3,
|
||||||
"analyze_wildcard": False,
|
# "max_determinized_states": 10000,
|
||||||
"auto_generate_synonyms_phrase_query": True,
|
"quote_field_suffix": "",
|
||||||
|
"quote_analyzer": "standard",
|
||||||
|
"analyze_wildcard": False,
|
||||||
|
"auto_generate_synonyms_phrase_query": True,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"sort": [
|
"sort": [
|
||||||
|
|
|
@ -0,0 +1,5 @@
|
||||||
|
{% if message is not None %}
|
||||||
|
<div class="notification is-{{ class }}" hx-ext="remove-me" remove-me="3s">
|
||||||
|
{{ message }}
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
|
@ -65,6 +65,7 @@
|
||||||
<div class="control has-icons-left">
|
<div class="control has-icons-left">
|
||||||
<span class="select">
|
<span class="select">
|
||||||
<select name="source">
|
<select name="source">
|
||||||
|
<option selected value="all">All</option>
|
||||||
<option value="irc">IRC</option>
|
<option value="irc">IRC</option>
|
||||||
<option value="dis">Discord</option>
|
<option value="dis">Discord</option>
|
||||||
</select>
|
</select>
|
||||||
|
@ -81,9 +82,9 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="column">
|
<div class="column">
|
||||||
<div class="field has-addons">
|
<div class="field has-addons" id="sentiment">
|
||||||
<div class="control">
|
<div class="control">
|
||||||
<input id="sliderWithValue" class="slider has-output-tooltip is-fullwidth" min="-1" max="1" value="0" step="0.05" type="range">
|
<input disabled="undefined" name="sentiment" id="sliderWithValue" class="slider has-output-tooltip is-fullwidth" min="-1" max="1" value="0" step="0.05" type="range">
|
||||||
<output for="sliderWithValue" class="slider-output">0</output>
|
<output for="sliderWithValue" class="slider-output">0</output>
|
||||||
<script>bulmaSlider.attach();</script>
|
<script>bulmaSlider.attach();</script>
|
||||||
</div>
|
</div>
|
||||||
|
@ -93,15 +94,20 @@
|
||||||
</a>
|
</a>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</div>
|
||||||
|
<label class="checkbox">
|
||||||
|
<input type="checkbox" name="check-sentiment"
|
||||||
|
_="on click toggle @disabled on #sliderWithValue">
|
||||||
|
Check sentiment
|
||||||
|
</label>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="is-hidden"></div>
|
<div class="is-hidden"></div>
|
||||||
</form>
|
</form>
|
||||||
</div>
|
</div>
|
||||||
<div class="block">
|
<div class="block">
|
||||||
<div id="results">
|
<div id="results">
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
|
||||||
<div id="modals-here">
|
<div id="modals-here">
|
||||||
</div>
|
</div>
|
||||||
{% endblock %}
|
{% endblock %}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load index %}
|
{% load index %}
|
||||||
|
{% include 'partials/notify.html' %}
|
||||||
{% if results is not None %}
|
{% if results is not None %}
|
||||||
<div style="display: none" id="jsonData" data-json="{{ data }}">
|
<div style="display: none" id="jsonData" data-json="{{ data }}">
|
||||||
</div>
|
</div>
|
||||||
|
|
|
@ -43,8 +43,9 @@ class DrilldownSearch(View):
|
||||||
# return HttpResponseForbidden()
|
# return HttpResponseForbidden()
|
||||||
|
|
||||||
context = query_results(request)
|
context = query_results(request)
|
||||||
if not context:
|
if "message" in context:
|
||||||
return HttpResponseForbidden()
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
context["data"] = json.dumps(
|
context["data"] = json.dumps(
|
||||||
[
|
[
|
||||||
{
|
{
|
||||||
|
|
|
@ -79,6 +79,8 @@ class InsightsNicks(LoginRequiredMixin, APIView):
|
||||||
return HttpResponse("No nick")
|
return HttpResponse("No nick")
|
||||||
net = request.data["net"]
|
net = request.data["net"]
|
||||||
nick = request.data["nick"]
|
nick = request.data["nick"]
|
||||||
|
if not nick:
|
||||||
|
return HttpResponseForbidden()
|
||||||
nicks = get_nicks(request, net, [nick])
|
nicks = get_nicks(request, net, [nick])
|
||||||
# Filter Guest
|
# Filter Guest
|
||||||
nicks = [x for x in nicks if not x.startswith("Guest")]
|
nicks = [x for x in nicks if not x.startswith("Guest")]
|
||||||
|
|
Loading…
Reference in New Issue