Implement editing aliases
This commit is contained in:
parent
6b0851ab6f
commit
3486f30f37
|
@ -25,6 +25,7 @@ from core.views import Billing, Cancel, Home, Order, Portal, Signup
|
||||||
from core.views.callbacks import Callback
|
from core.views.callbacks import Callback
|
||||||
from core.views.manage.threshold.irc import (
|
from core.views.manage.threshold.irc import (
|
||||||
ThresholdIRCAliases,
|
ThresholdIRCAliases,
|
||||||
|
ThresholdIRCAliasesEdit,
|
||||||
ThresholdIRCNetworkActions,
|
ThresholdIRCNetworkActions,
|
||||||
ThresholdIRCNetworkActionsRelay,
|
ThresholdIRCNetworkActionsRelay,
|
||||||
ThresholdIRCNetworkChannels,
|
ThresholdIRCNetworkChannels,
|
||||||
|
@ -35,7 +36,6 @@ from core.views.manage.threshold.irc import (
|
||||||
ThresholdIRCNetworkRelayStatus,
|
ThresholdIRCNetworkRelayStatus,
|
||||||
ThresholdIRCNetworks,
|
ThresholdIRCNetworks,
|
||||||
ThresholdIRCStats,
|
ThresholdIRCStats,
|
||||||
ThresholdIRCAliasesEdit,
|
|
||||||
)
|
)
|
||||||
|
|
||||||
# Management stuff
|
# Management stuff
|
||||||
|
|
|
@ -104,3 +104,10 @@ def del_relay(net, num):
|
||||||
payload = {}
|
payload = {}
|
||||||
deleted = threshold_request(url, payload, method="DELETE")
|
deleted = threshold_request(url, payload, method="DELETE")
|
||||||
return deleted
|
return deleted
|
||||||
|
|
||||||
|
|
||||||
|
def update_aliases(aliases):
|
||||||
|
url = "aliases"
|
||||||
|
payload = aliases
|
||||||
|
deleted = threshold_request(url, payload, method="POST")
|
||||||
|
return deleted
|
||||||
|
|
|
@ -51,13 +51,14 @@ def sort_data(data):
|
||||||
data[item] = OrderedDict({k: v for k, v in sorted_item})
|
data[item] = OrderedDict({k: v for k, v in sorted_item})
|
||||||
|
|
||||||
|
|
||||||
def threshold_request(url, data, method="POST"):
|
def threshold_request(url, data, method="POST", esc=False):
|
||||||
headers = {
|
headers = {
|
||||||
"ApiKey": settings.THRESHOLD_API_KEY,
|
"ApiKey": settings.THRESHOLD_API_KEY,
|
||||||
"Token": settings.THRESHOLD_API_TOKEN,
|
"Token": settings.THRESHOLD_API_TOKEN,
|
||||||
}
|
}
|
||||||
for key in data:
|
if esc:
|
||||||
data[key] = escape(data[key])
|
for key in data:
|
||||||
|
data[key] = escape(data[key])
|
||||||
|
|
||||||
if method == "POST":
|
if method == "POST":
|
||||||
method = requests.post
|
method = requests.post
|
||||||
|
@ -96,7 +97,7 @@ def threshold_request(url, data, method="POST"):
|
||||||
def get_chans(net, query):
|
def get_chans(net, query):
|
||||||
url = "chans"
|
url = "chans"
|
||||||
payload = {"net": net, "query": query}
|
payload = {"net": net, "query": query}
|
||||||
channels = threshold_request(url, payload)
|
channels = threshold_request(url, payload, esc=True)
|
||||||
if not channels:
|
if not channels:
|
||||||
return []
|
return []
|
||||||
return channels["chans"]
|
return channels["chans"]
|
||||||
|
@ -105,7 +106,7 @@ def get_chans(net, query):
|
||||||
def get_users(net, query):
|
def get_users(net, query):
|
||||||
url = "users"
|
url = "users"
|
||||||
payload = {"net": net, "query": query}
|
payload = {"net": net, "query": query}
|
||||||
users = threshold_request(url, payload)
|
users = threshold_request(url, payload, esc=True)
|
||||||
if not users:
|
if not users:
|
||||||
return []
|
return []
|
||||||
return users["users"]
|
return users["users"]
|
||||||
|
@ -114,7 +115,7 @@ def get_users(net, query):
|
||||||
def annotate_online(net, query):
|
def annotate_online(net, query):
|
||||||
url = "online"
|
url = "online"
|
||||||
payload = {"net": net, "query": query}
|
payload = {"net": net, "query": query}
|
||||||
online_info = threshold_request(url, payload)
|
online_info = threshold_request(url, payload, esc=True)
|
||||||
if not online_info:
|
if not online_info:
|
||||||
return {}
|
return {}
|
||||||
return online_info
|
return online_info
|
||||||
|
@ -123,7 +124,7 @@ def annotate_online(net, query):
|
||||||
def annotate_num_users(net, query):
|
def annotate_num_users(net, query):
|
||||||
url = "num_users"
|
url = "num_users"
|
||||||
payload = {"net": net, "query": query}
|
payload = {"net": net, "query": query}
|
||||||
user_num_map = threshold_request(url, payload)
|
user_num_map = threshold_request(url, payload, esc=True)
|
||||||
if not user_num_map:
|
if not user_num_map:
|
||||||
return {}
|
return {}
|
||||||
return user_num_map
|
return user_num_map
|
||||||
|
@ -132,7 +133,7 @@ def annotate_num_users(net, query):
|
||||||
def annotate_num_chans(net, query):
|
def annotate_num_chans(net, query):
|
||||||
url = "num_chans"
|
url = "num_chans"
|
||||||
payload = {"net": net, "query": query}
|
payload = {"net": net, "query": query}
|
||||||
chan_num_map = threshold_request(url, payload)
|
chan_num_map = threshold_request(url, payload, esc=True)
|
||||||
if not chan_num_map:
|
if not chan_num_map:
|
||||||
return {}
|
return {}
|
||||||
return chan_num_map
|
return chan_num_map
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
{% load index %}
|
{% load index %}
|
||||||
{% load static %}
|
{% load static %}
|
||||||
{% load joinsep %}
|
{% load nsep %}
|
||||||
|
|
||||||
<script src="{% static 'modal.js' %}"></script>
|
<script src="{% static 'modal.js' %}"></script>
|
||||||
<div class="modal is-active is-clipped">
|
<div class="modal is-active is-clipped">
|
||||||
|
@ -9,55 +9,55 @@
|
||||||
<div class="box">
|
<div class="box">
|
||||||
<h4 class="subtitle is-4">Edit aliases</h4>
|
<h4 class="subtitle is-4">Edit aliases</h4>
|
||||||
<form
|
<form
|
||||||
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||||
hx-post="{% url 'threshold_irc_aliases_edit' %}"
|
hx-post="{% url 'threshold_irc_aliases_edit' %}"
|
||||||
hx-target="#aliases"
|
hx-target="#aliases"
|
||||||
hx-swap="outerHTML">
|
hx-swap="outerHTML">
|
||||||
<div class="content" style="max-height: 30em; overflow: auto;">
|
<div class="content" style="max-height: 30em; overflow: auto;">
|
||||||
<div class="table-container">
|
<div class="table-container">
|
||||||
<table class="table is-fullwidth is-hoverable">
|
<table class="table is-fullwidth is-hoverable">
|
||||||
<thead>
|
<thead>
|
||||||
<th>num</th>
|
<th>num</th>
|
||||||
<th>nick</th>
|
<th>nick</th>
|
||||||
<th>realname</th>
|
<th>realname</th>
|
||||||
<th>emails</th>
|
<th>emails</th>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
{% for alias in aliases %}
|
{% for alias in aliases %}
|
||||||
<tr>
|
<tr>
|
||||||
<td>
|
<td>
|
||||||
{{ alias.num }}
|
{{ alias.num }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<input class="input" type="text" name="{{ alias.num }}|nick" value="{{ alias.nick }}">
|
<input class="input" type="text" name="{{ alias.num }}|nick" value="{{ alias.nick }}">
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<input class="input" type="text" name="{{ alias.num }}|realname" value="{{ alias.realname }}">
|
<input class="input" type="text" name="{{ alias.num }}|realname" value="{{ alias.realname }}">
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<div class="field">
|
<div class="field">
|
||||||
<textarea class="textarea" name="{{ alias.num }}|emails">{{ alias.emails|joinsep:'\n' }}</textarea>
|
<textarea class="textarea" name="{{ alias.num }}|emails">{{ alias.emails|nsep }}</textarea>
|
||||||
</div>
|
</div>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
{% endfor %}
|
{% endfor %}
|
||||||
|
|
||||||
</tbody>
|
</tbody>
|
||||||
</table>
|
</table>
|
||||||
|
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
<button
|
||||||
<button
|
class="button is-primary modal-close-button">
|
||||||
class="button is-primary modal-close-button">
|
Cancel
|
||||||
Cancel
|
</button>
|
||||||
</button>
|
<button class="button is-primary modal-close-button">Submit</button>
|
||||||
<button class="button is-primary modal-close-button">Submit</button>
|
|
||||||
|
|
||||||
</form>
|
</form>
|
||||||
|
|
||||||
</div>
|
</div>
|
||||||
<button class="modal-close is-large" aria-label="close"></button>
|
<button class="modal-close is-large" aria-label="close"></button>
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
from django import template
|
||||||
|
|
||||||
|
register = template.Library()
|
||||||
|
|
||||||
|
@register.filter
|
||||||
|
def nsep(lst):
|
||||||
|
return "\n".join(lst)
|
|
@ -214,6 +214,7 @@ class ThresholdIRCAliases(SuperUserRequiredMixin, APIView):
|
||||||
}
|
}
|
||||||
return render(request, self.template_name, context)
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
|
|
||||||
class ThresholdIRCAliasesEdit(SuperUserRequiredMixin, APIView):
|
class ThresholdIRCAliasesEdit(SuperUserRequiredMixin, APIView):
|
||||||
template_name = "manage/threshold/irc/overview/modals/edit-aliases.html"
|
template_name = "manage/threshold/irc/overview/modals/edit-aliases.html"
|
||||||
parser_classes = [FormParser]
|
parser_classes = [FormParser]
|
||||||
|
@ -236,7 +237,7 @@ class ThresholdIRCAliasesEdit(SuperUserRequiredMixin, APIView):
|
||||||
message_class = "success"
|
message_class = "success"
|
||||||
new_aliases = {}
|
new_aliases = {}
|
||||||
for item in request.data:
|
for item in request.data:
|
||||||
if not "|" in item:
|
if "|" not in item:
|
||||||
continue
|
continue
|
||||||
spl = item.split("|")
|
spl = item.split("|")
|
||||||
if len(spl) != 2:
|
if len(spl) != 2:
|
||||||
|
@ -247,7 +248,6 @@ class ThresholdIRCAliasesEdit(SuperUserRequiredMixin, APIView):
|
||||||
value = request.data[item]
|
value = request.data[item]
|
||||||
if field == "emails":
|
if field == "emails":
|
||||||
value = request.data[item].split("\n")
|
value = request.data[item].split("\n")
|
||||||
print("EMAILS", )
|
|
||||||
for email in value:
|
for email in value:
|
||||||
# Check field isn't just empty
|
# Check field isn't just empty
|
||||||
if len(email) != 0:
|
if len(email) != 0:
|
||||||
|
@ -256,18 +256,16 @@ class ThresholdIRCAliasesEdit(SuperUserRequiredMixin, APIView):
|
||||||
message = f"Invalid email: {email}"
|
message = f"Invalid email: {email}"
|
||||||
message_class = "danger"
|
message_class = "danger"
|
||||||
break
|
break
|
||||||
# Need to exit here and not run the update
|
|
||||||
# Or just let threshold do the validation
|
|
||||||
if num not in new_aliases:
|
if num not in new_aliases:
|
||||||
new_aliases[num] = {field: value}
|
new_aliases[num] = {field: value}
|
||||||
else:
|
else:
|
||||||
new_aliases[num][field] = value
|
new_aliases[num][field] = value
|
||||||
print("NEW", new_aliases)
|
if not message_class == "danger":
|
||||||
#if not message_class = "danger":
|
updated = threshold.update_aliases(new_aliases)
|
||||||
# updated = threshold.update_aliases(new_aliases)
|
if not updated:
|
||||||
# if not updated:
|
message = updated["reason"]
|
||||||
# message = updated["reason"]
|
message_class = "danger"
|
||||||
# message_class = "danger"
|
|
||||||
template_name = "manage/threshold/irc/overview/aliases.html"
|
template_name = "manage/threshold/irc/overview/aliases.html"
|
||||||
aliases = threshold.get_aliases()
|
aliases = threshold.get_aliases()
|
||||||
context = {
|
context = {
|
||||||
|
@ -277,6 +275,7 @@ class ThresholdIRCAliasesEdit(SuperUserRequiredMixin, APIView):
|
||||||
}
|
}
|
||||||
return render(request, template_name, context)
|
return render(request, template_name, context)
|
||||||
|
|
||||||
|
|
||||||
class ThresholdIRCNetworkActions(SuperUserRequiredMixin, View):
|
class ThresholdIRCNetworkActions(SuperUserRequiredMixin, View):
|
||||||
template_name = "manage/threshold/irc/network/actions.html"
|
template_name = "manage/threshold/irc/network/actions.html"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue