Implement network page

This commit is contained in:
Mark Veidemanis 2022-07-26 22:15:30 +01:00
parent c993bb9c6e
commit df049f822c
Signed by: m
GPG Key ID: 5ACFCEED46C0904F
13 changed files with 304 additions and 15 deletions

View File

@ -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"),

View File

@ -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

View File

@ -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,

View File

@ -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,

View File

@ -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):

View File

@ -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>

View File

@ -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>

View File

@ -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>

View File

@ -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 }}

View File

@ -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 %}

View File

@ -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)

View File

@ -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)