From 9f1dc908af912391b36544df2d671bb3691e0a78 Mon Sep 17 00:00:00 2001 From: Henri Dickson <90480431+alphatownsman@users.noreply.github.com> Date: Fri, 1 Sep 2023 14:15:48 -0400 Subject: [PATCH] relay admin ui --- takahe/urls.py | 5 +++ templates/admin/_menu.html | 4 ++ templates/admin/identities.html | 1 + templates/admin/relays.html | 69 +++++++++++++++++++++++++++++++++ users/models/relay_actor.py | 11 ++++++ users/views/admin/__init__.py | 1 + users/views/admin/relays.py | 37 ++++++++++++++++++ 7 files changed, 128 insertions(+) create mode 100644 templates/admin/relays.html create mode 100644 users/views/admin/relays.py diff --git a/takahe/urls.py b/takahe/urls.py index ae961b648..2dbae1aa8 100644 --- a/takahe/urls.py +++ b/takahe/urls.py @@ -138,6 +138,11 @@ "admin/domains//delete/", admin.DomainDelete.as_view(), ), + path( + "admin/relays/", + admin.RelayRoot.as_view(), + name="admin_relays", + ), path( "admin/federation/", admin.FederationRoot.as_view(), diff --git a/templates/admin/_menu.html b/templates/admin/_menu.html index 0b0ec10f3..07fe06aef 100644 --- a/templates/admin/_menu.html +++ b/templates/admin/_menu.html @@ -45,6 +45,10 @@

Administration

Federation + + + Relays + Users diff --git a/templates/admin/identities.html b/templates/admin/identities.html index 15bbea2b4..3cad8782c 100644 --- a/templates/admin/identities.html +++ b/templates/admin/identities.html @@ -52,6 +52,7 @@ Remote {{ identity.followers_count }} local follower{{ identity.followers_count|pluralize }} {% endif %} + {{ identity.actor_type }} diff --git a/templates/admin/relays.html b/templates/admin/relays.html new file mode 100644 index 000000000..7f54fc45d --- /dev/null +++ b/templates/admin/relays.html @@ -0,0 +1,69 @@ +{% extends "admin/base_main.html" %} +{% load activity_tags %} + +{% block subtitle %}Relay{% endblock %} + +{% block settings_content %} + + + {% for identity in page_obj %} + + + + + + + + + {% empty %} + + + + {% endfor %} +
+ + + {{ identity.actor_uri }} + {{ identity.domain.nodeinfo.metadata.nodeName }} + {% if identity.domain.nodeinfo.software %} + {{ identity.domain.nodeinfo.software.name }} / {{ identity.domain.nodeinfo.software.version }} + {% endif %} + + {% if identity.restriction == 1 %} + Limited + {% elif identity.restriction == 2 %} + Blocked + {% endif %} + + {% if identity.follow_state == 'accepting' or identity.follow_state == 'accepted' %} + ACTIVE + {% elif identity.follow_state == 'unrequested' or identity.follow_state == 'pending_approval' %} + ACTIVATING + {% else %} + DEACTIVATING + {% endif %} + ({{ identity.follow_state }}) + +
+ + {% csrf_token %} + +
+
+
+ + {% csrf_token %} + +
+
+ There are no relay yet. +
+
+   invalid actor uri will not show in this list; (un)subscribing may take a while; use remove only when it's stuck in (DE)ACTIVATING state for a long time. +
+ {% include "admin/_pagination.html" with nouns="relay,relays" %} +{% endblock %} diff --git a/users/models/relay_actor.py b/users/models/relay_actor.py index 869e7140c..3edd9101a 100644 --- a/users/models/relay_actor.py +++ b/users/models/relay_actor.py @@ -61,6 +61,17 @@ def unsubscribe(cls, relay_uri): } ) + @classmethod + def remove(cls, relay_uri): + from .follow import Follow + + Follow.objects.filter( + source__actor_uri=cls.actor_uri, target__actor_uri=relay_uri + ).delete() + Follow.objects.filter( + target__actor_uri=cls.actor_uri, source__actor_uri=relay_uri + ).delete() + @classmethod def handle_internal_unfollow(cls, payload): """ diff --git a/users/views/admin/__init__.py b/users/views/admin/__init__.py index 3330b1bf8..e4305ab69 100644 --- a/users/views/admin/__init__.py +++ b/users/views/admin/__init__.py @@ -31,6 +31,7 @@ from users.views.admin.hashtags import HashtagEdit, HashtagEnable, Hashtags # noqa from users.views.admin.identities import IdentitiesRoot, IdentityEdit # noqa from users.views.admin.invites import InviteCreate, InvitesRoot, InviteView # noqa +from users.views.admin.relays import RelayRoot # noqa from users.views.admin.reports import ReportsRoot, ReportView # noqa from users.views.admin.settings import ( # noqa BasicSettings, diff --git a/users/views/admin/relays.py b/users/views/admin/relays.py new file mode 100644 index 000000000..bce676a1c --- /dev/null +++ b/users/views/admin/relays.py @@ -0,0 +1,37 @@ +from django.db import models +from django.shortcuts import redirect +from django.utils.decorators import method_decorator +from django.views.generic import ListView + +from users.decorators import admin_required +from users.models import Identity, RelayActor + + +@method_decorator(admin_required, name="dispatch") +class RelayRoot(ListView): + template_name = "admin/relays.html" + paginate_by = 30 + + def get(self, request, *args, **kwargs): + self.extra_context = { + "section": "relays", + } + return super().get(request, *args, **kwargs) + + def get_queryset(self): + identities = ( + Identity.objects.filter(inbound_follows__source=RelayActor.get_identity()) + .annotate(follow_state=models.F("inbound_follows__state")) + .order_by("-created") + ) + return identities + + def post(self, request, *args, **kwargs): + actor_uri = request.POST.get("actor_uri") + if "subscribe" in request.GET: + RelayActor.subscribe(actor_uri) + elif "unsubscribe" in request.GET: + RelayActor.unsubscribe(actor_uri) + elif "remove" in request.GET: + RelayActor.remove(actor_uri) + return redirect(".")