Implement network page
This commit is contained in:
parent
c993bb9c6e
commit
df049f822c
29
app/urls.py
29
app/urls.py
|
@ -38,12 +38,15 @@ from core.views.dynamic.insights import (
|
||||||
InsightsSearch,
|
InsightsSearch,
|
||||||
)
|
)
|
||||||
from core.views.dynamic.manage.threshold.irc import (
|
from core.views.dynamic.manage.threshold.irc import (
|
||||||
|
ThresholdIRCNetworkChannels,
|
||||||
|
ThresholdIRCNetworkInfo,
|
||||||
|
ThresholdIRCNetworkRelays,
|
||||||
ThresholdIRCNetworks,
|
ThresholdIRCNetworks,
|
||||||
ThresholdIRCStats,
|
ThresholdIRCStats,
|
||||||
)
|
)
|
||||||
|
|
||||||
# Management stuff
|
# Management stuff
|
||||||
from core.views.manage.threshold import ThresholdIRCOverview
|
from core.views.manage.threshold import ThresholdIRCNetwork, ThresholdIRCOverview
|
||||||
|
|
||||||
urlpatterns = [
|
urlpatterns = [
|
||||||
path("", Home.as_view(), name="home"),
|
path("", Home.as_view(), name="home"),
|
||||||
|
@ -81,15 +84,35 @@ urlpatterns = [
|
||||||
name="threshold_irc_overview",
|
name="threshold_irc_overview",
|
||||||
),
|
),
|
||||||
path(
|
path(
|
||||||
"manage/threshold/irc/stats/",
|
"manage/threshold/irc/overview/stats/",
|
||||||
ThresholdIRCStats.as_view(),
|
ThresholdIRCStats.as_view(),
|
||||||
name="threshold_irc_stats",
|
name="threshold_irc_stats",
|
||||||
),
|
),
|
||||||
path(
|
path(
|
||||||
"manage/threshold/irc/networks/",
|
"manage/threshold/irc/overview/networks/",
|
||||||
ThresholdIRCNetworks.as_view(),
|
ThresholdIRCNetworks.as_view(),
|
||||||
name="threshold_irc_networks",
|
name="threshold_irc_networks",
|
||||||
),
|
),
|
||||||
|
path(
|
||||||
|
"manage/threshold/irc/network/<str:net>/",
|
||||||
|
ThresholdIRCNetwork.as_view(),
|
||||||
|
name="threshold_irc_network",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"manage/threshold/irc/network/<str:net>/info/",
|
||||||
|
ThresholdIRCNetworkInfo.as_view(),
|
||||||
|
name="threshold_irc_network_info",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"manage/threshold/irc/network/<str:net>/relays/",
|
||||||
|
ThresholdIRCNetworkRelays.as_view(),
|
||||||
|
name="threshold_irc_network_relays",
|
||||||
|
),
|
||||||
|
path(
|
||||||
|
"manage/threshold/irc/network/<str:net>/channels/",
|
||||||
|
ThresholdIRCNetworkChannels.as_view(),
|
||||||
|
name="threshold_irc_network_channels",
|
||||||
|
),
|
||||||
##
|
##
|
||||||
path("api/chans/", ThresholdChans.as_view(), name="chans"),
|
path("api/chans/", ThresholdChans.as_view(), name="chans"),
|
||||||
path("api/users/", ThresholdUsers.as_view(), name="users"),
|
path("api/users/", ThresholdUsers.as_view(), name="users"),
|
||||||
|
|
|
@ -17,3 +17,30 @@ def get_irc_networks():
|
||||||
if not networks:
|
if not networks:
|
||||||
return {}
|
return {}
|
||||||
return networks
|
return networks
|
||||||
|
|
||||||
|
|
||||||
|
def get_irc_network(net):
|
||||||
|
url = f"irc/network/{net}"
|
||||||
|
payload = {}
|
||||||
|
network = threshold_request(url, payload)
|
||||||
|
if not network:
|
||||||
|
return {}
|
||||||
|
return network
|
||||||
|
|
||||||
|
|
||||||
|
def get_irc_relays(net):
|
||||||
|
url = f"irc/network/{net}/relays"
|
||||||
|
payload = {}
|
||||||
|
relays = threshold_request(url, payload)
|
||||||
|
if not relays:
|
||||||
|
return []
|
||||||
|
return relays
|
||||||
|
|
||||||
|
|
||||||
|
def get_irc_channels(net):
|
||||||
|
url = f"irc/network/{net}/channels"
|
||||||
|
payload = {}
|
||||||
|
channels = threshold_request(url, payload)
|
||||||
|
if not channels:
|
||||||
|
return []
|
||||||
|
return channels
|
||||||
|
|
|
@ -10,7 +10,6 @@ def construct_query(net, nicks):
|
||||||
# Construct the query
|
# Construct the query
|
||||||
query_nicks = [{"match": {"nick": x}} for x in nicks]
|
query_nicks = [{"match": {"nick": x}} for x in nicks]
|
||||||
query_should = query_nicks
|
query_should = query_nicks
|
||||||
# print("QUERY SHOULD", query_should)
|
|
||||||
# Get the initial query
|
# Get the initial query
|
||||||
query = {
|
query = {
|
||||||
"size": settings.META_QUERY_SIZE,
|
"size": settings.META_QUERY_SIZE,
|
||||||
|
|
|
@ -11,7 +11,6 @@ def construct_query(net, nicks):
|
||||||
query_nicks = [{"match": {"nick": x}} for x in nicks]
|
query_nicks = [{"match": {"nick": x}} for x in nicks]
|
||||||
query_users = [{"match": {"user": x}} for x in nicks]
|
query_users = [{"match": {"user": x}} for x in nicks]
|
||||||
query_should = query_nicks + query_users
|
query_should = query_nicks + query_users
|
||||||
# print("QUERY SHOULD", query_should)
|
|
||||||
# Get the initial query
|
# Get the initial query
|
||||||
query = {
|
query = {
|
||||||
"size": settings.NICKTRACE_QUERY_SIZE,
|
"size": settings.NICKTRACE_QUERY_SIZE,
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
import logging
|
import logging
|
||||||
from json import dumps
|
from json import dumps
|
||||||
|
from operator import itemgetter
|
||||||
|
from typing import OrderedDict
|
||||||
|
|
||||||
import requests
|
import requests
|
||||||
from django.conf import settings
|
from django.conf import settings
|
||||||
|
@ -27,6 +29,12 @@ def sort_data(data):
|
||||||
for item in data:
|
for item in data:
|
||||||
if isinstance(data[item], list):
|
if isinstance(data[item], list):
|
||||||
data[item].sort()
|
data[item].sort()
|
||||||
|
elif isinstance(data[item], dict):
|
||||||
|
|
||||||
|
# if all([isinstance(x, int) for k, v in
|
||||||
|
# data[item].items() for x in v.values()]):
|
||||||
|
sorted_item = sorted(data[item].items(), key=itemgetter(1), reverse=True)
|
||||||
|
data[item] = OrderedDict({k: v for k, v in sorted_item})
|
||||||
|
|
||||||
|
|
||||||
def threshold_request(url, data):
|
def threshold_request(url, data):
|
||||||
|
|
|
@ -0,0 +1,22 @@
|
||||||
|
<div id="channels">
|
||||||
|
{% if channels is not None %}
|
||||||
|
<div class="content" style="max-height: 30em; overflow: auto;">
|
||||||
|
<div class="table-container">
|
||||||
|
<table class="table is-fullwidth is-hoverable">
|
||||||
|
<tbody>
|
||||||
|
{% for channel, info in channels.items %}
|
||||||
|
<tr>
|
||||||
|
<td>
|
||||||
|
{{ channel }}
|
||||||
|
<span class="tag">
|
||||||
|
{{ info }}
|
||||||
|
</span>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
|
@ -0,0 +1,51 @@
|
||||||
|
<div id="info">
|
||||||
|
{% if network is not None %}
|
||||||
|
<div class="content" style="max-height: 30em; overflow: auto;">
|
||||||
|
<div class="table-container">
|
||||||
|
<table class="table is-fullwidth is-hoverable">
|
||||||
|
<thead>
|
||||||
|
<th>attribute</th>
|
||||||
|
<th>value</th>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for key, item in network.items %}
|
||||||
|
<tr>
|
||||||
|
<th>{{ key }}</th>
|
||||||
|
<td>
|
||||||
|
{% if key == 'security' %}
|
||||||
|
{% if item == 'none' %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-lock-open" aria-hidden="true"></i>
|
||||||
|
</span>
|
||||||
|
{% elif item == 'ssl' %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-lock" aria-hidden="true"></i>
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
{% elif key == 'relays' %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-brands fa-unity"></i>
|
||||||
|
</span>
|
||||||
|
{% elif key == 'channels' %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-hashtag"></i>
|
||||||
|
</span>
|
||||||
|
{% elif key == 'records' %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-album"></i>
|
||||||
|
</span>
|
||||||
|
{% elif key == 'host' %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-router"></i>
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
{{ item }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
|
@ -0,0 +1,59 @@
|
||||||
|
<div id="relays">
|
||||||
|
{% if relays is not None %}
|
||||||
|
<div class="content" style="max-height: 30em; overflow: auto;">
|
||||||
|
<div class="table-container">
|
||||||
|
<table class="table is-fullwidth is-hoverable">
|
||||||
|
<thead>
|
||||||
|
<th>net</th>
|
||||||
|
<th>id</th>
|
||||||
|
<th>registered</th>
|
||||||
|
<th>enabled</th>
|
||||||
|
<th>
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-hashtag"></i>
|
||||||
|
</span>
|
||||||
|
</th>
|
||||||
|
<th>nick</th>
|
||||||
|
</thead>
|
||||||
|
<tbody>
|
||||||
|
{% for relay in relays %}
|
||||||
|
<tr>
|
||||||
|
<th>{{ relay.net }}</th>
|
||||||
|
<td>{{ relay.id }}</td>
|
||||||
|
<td>
|
||||||
|
{% if relay.registered %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-check" aria-hidden="true"></i>
|
||||||
|
</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-xmark" aria-hidden="true"></i>
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{% if relay.enabled %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-check" aria-hidden="true"></i>
|
||||||
|
</span>
|
||||||
|
{% else %}
|
||||||
|
<span class="icon">
|
||||||
|
<i class="fa-solid fa-xmark" aria-hidden="true"></i>
|
||||||
|
</span>
|
||||||
|
{% endif %}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
|
||||||
|
{{ relay.chans }}
|
||||||
|
</td>
|
||||||
|
<td>
|
||||||
|
{{ relay.nick }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endfor %}
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endif %}
|
||||||
|
</div>
|
|
@ -9,21 +9,21 @@
|
||||||
</thead>
|
</thead>
|
||||||
{% for key, net in networks.items %}
|
{% for key, net in networks.items %}
|
||||||
<tr>
|
<tr>
|
||||||
<th>{{ key }}</th>
|
<th><a href="{% url 'threshold_irc_network' key %}">{{ key }}</a></th>
|
||||||
<td>
|
<td>
|
||||||
<span class="icon has-text-info has-tooltip-info">
|
<span class="icon">
|
||||||
<i class="fa-brands fa-unity"></i>
|
<i class="fa-brands fa-unity"></i>
|
||||||
</span>
|
</span>
|
||||||
{{ net.relays }}
|
{{ net.relays }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span class="icon has-text-info has-tooltip-info">
|
<span class="icon">
|
||||||
<i class="fa-solid fa-hashtag"></i>
|
<i class="fa-solid fa-hashtag"></i>
|
||||||
</span>
|
</span>
|
||||||
{{ net.channels }}
|
{{ net.channels }}
|
||||||
</td>
|
</td>
|
||||||
<td>
|
<td>
|
||||||
<span class="icon has-text-info has-tooltip-info">
|
<span class="icon">
|
||||||
<i class="fa-solid fa-album"></i>
|
<i class="fa-solid fa-album"></i>
|
||||||
</span>
|
</span>
|
||||||
{{ net.records }}
|
{{ net.records }}
|
|
@ -0,0 +1,60 @@
|
||||||
|
{% extends "base.html" %}
|
||||||
|
{% block content %}
|
||||||
|
|
||||||
|
<div
|
||||||
|
style="display: none;"
|
||||||
|
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||||
|
hx-post="{% url 'threshold_irc_network_info' net %}"
|
||||||
|
hx-trigger="load"
|
||||||
|
hx-target="#info"
|
||||||
|
hx-swap="outerHTML">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
style="display: none;"
|
||||||
|
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||||
|
hx-post="{% url 'threshold_irc_network_relays' net %}"
|
||||||
|
hx-trigger="load"
|
||||||
|
hx-target="#relays"
|
||||||
|
hx-swap="outerHTML">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div
|
||||||
|
style="display: none;"
|
||||||
|
hx-headers='{"X-CSRFToken": "{{ csrf_token }}"}'
|
||||||
|
hx-post="{% url 'threshold_irc_network_channels' net %}"
|
||||||
|
hx-trigger="load"
|
||||||
|
hx-target="#channels"
|
||||||
|
hx-swap="outerHTML">
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column">
|
||||||
|
<div class="box">
|
||||||
|
<div id="info">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<div class="box">
|
||||||
|
<div id="relays">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="columns">
|
||||||
|
<div class="column">
|
||||||
|
<div class="box">
|
||||||
|
<div id="channels">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
<div class="column">
|
||||||
|
<div class="box">
|
||||||
|
<div id="alerts">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
{% endblock %}
|
|
@ -1,12 +1,18 @@
|
||||||
from django.shortcuts import render
|
from django.shortcuts import render
|
||||||
from django.views import View
|
from django.views import View
|
||||||
|
|
||||||
from core.lib.manage.threshold import get_irc_networks, get_irc_stats
|
from core.lib.manage.threshold import (
|
||||||
|
get_irc_channels,
|
||||||
|
get_irc_network,
|
||||||
|
get_irc_networks,
|
||||||
|
get_irc_relays,
|
||||||
|
get_irc_stats,
|
||||||
|
)
|
||||||
from core.views.manage.permissions import SuperUserRequiredMixin
|
from core.views.manage.permissions import SuperUserRequiredMixin
|
||||||
|
|
||||||
|
|
||||||
class ThresholdIRCStats(SuperUserRequiredMixin, View):
|
class ThresholdIRCStats(SuperUserRequiredMixin, View):
|
||||||
stats_template = "dynamic/manage/threshold/irc/stats.html"
|
stats_template = "dynamic/manage/threshold/irc/overview/stats.html"
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
stats = get_irc_stats()
|
stats = get_irc_stats()
|
||||||
|
@ -15,9 +21,36 @@ class ThresholdIRCStats(SuperUserRequiredMixin, View):
|
||||||
|
|
||||||
|
|
||||||
class ThresholdIRCNetworks(SuperUserRequiredMixin, View):
|
class ThresholdIRCNetworks(SuperUserRequiredMixin, View):
|
||||||
stats_template = "dynamic/manage/threshold/irc/networks.html"
|
template_name = "dynamic/manage/threshold/irc/overview/networks.html"
|
||||||
|
|
||||||
def post(self, request):
|
def post(self, request):
|
||||||
stats = get_irc_networks()
|
networks = get_irc_networks()
|
||||||
context = {"networks": stats}
|
context = {"networks": networks}
|
||||||
return render(request, self.stats_template, context)
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
|
|
||||||
|
class ThresholdIRCNetworkInfo(SuperUserRequiredMixin, View):
|
||||||
|
template_name = "dynamic/manage/threshold/irc/network/info.html"
|
||||||
|
|
||||||
|
def post(self, request, net):
|
||||||
|
network = get_irc_network(net)
|
||||||
|
context = {"network": network}
|
||||||
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
|
|
||||||
|
class ThresholdIRCNetworkRelays(SuperUserRequiredMixin, View):
|
||||||
|
template_name = "dynamic/manage/threshold/irc/network/relays.html"
|
||||||
|
|
||||||
|
def post(self, request, net):
|
||||||
|
relays = get_irc_relays(net)
|
||||||
|
context = {"relays": relays["relays"]}
|
||||||
|
return render(request, self.template_name, context)
|
||||||
|
|
||||||
|
|
||||||
|
class ThresholdIRCNetworkChannels(SuperUserRequiredMixin, View):
|
||||||
|
template_name = "dynamic/manage/threshold/irc/network/channels.html"
|
||||||
|
|
||||||
|
def post(self, request, net):
|
||||||
|
channels = get_irc_channels(net)
|
||||||
|
context = {"channels": channels["channels"]}
|
||||||
|
return render(request, self.template_name, context)
|
||||||
|
|
|
@ -9,3 +9,11 @@ class ThresholdIRCOverview(SuperUserRequiredMixin, View):
|
||||||
|
|
||||||
def get(self, request):
|
def get(self, request):
|
||||||
return render(request, self.template_name)
|
return render(request, self.template_name)
|
||||||
|
|
||||||
|
|
||||||
|
class ThresholdIRCNetwork(SuperUserRequiredMixin, View):
|
||||||
|
template_name = "manage/threshold/irc/network.html"
|
||||||
|
|
||||||
|
def get(self, request, net):
|
||||||
|
context = {"net": net}
|
||||||
|
return render(request, self.template_name, context)
|
||||||
|
|
Loading…
Reference in New Issue