Merge pull request #810 from mouse-reeve/server-details

Adds detail page for federated servers
This commit is contained in:
Mouse Reeve 2021-03-28 14:20:29 -07:00 committed by GitHub
commit f547df5940
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
8 changed files with 177 additions and 10 deletions

View file

@ -1,8 +1,21 @@
{% extends 'settings/admin_layout.html' %} {% extends 'settings/admin_layout.html' %}
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Reports" %}{% endblock %} {% block title %}
{% block header %}{% trans "Reports" %}{% endblock %} {% if server %}
{% blocktrans with server_name=server.server_name %}Reports: {{ server_name }}{% endblocktrans %}
{% else %}
{% trans "Reports" %}
{% endif %}
{% endblock %}
{% block header %}
{% if server %}
{% blocktrans with server_name=server.server_name %}Reports: <small>{{ server_name }}</small>{% endblocktrans %}
<a href="{% url 'settings-reports' %}" class="help has-text-weight-normal">Clear filters</a>
{% else %}
{% trans "Reports" %}
{% endif %}
{% endblock %}
{% block panel %} {% block panel %}
<div class="tabs"> <div class="tabs">
@ -17,6 +30,10 @@
</div> </div>
<div class="block"> <div class="block">
{% if not reports %}
<em>{% trans "No reports found." %}</em>
{% endif %}
{% for report in reports %} {% for report in reports %}
<div class="block"> <div class="block">
{% include 'moderation/report_preview.html' with report=report %} {% include 'moderation/report_preview.html' with report=report %}

View file

@ -0,0 +1,68 @@
{% extends 'settings/admin_layout.html' %}
{% block title %}{{ server.server_name }}{% endblock %}
{% load i18n %}
{% block header %}
{{ server.server_name }}
<a href="{% url 'settings-federation' %}" class="has-text-weight-normal help">{% trans "Back to server list" %}</a>
{% endblock %}
{% block panel %}
<section class="block content">
<h2 class="title is-4">{% trans "Details" %}</h2>
<dl>
<div class="is-flex">
<dt>{% trans "Software:" %}</dt>
<dd>{{ server.application_type }}</dd>
</div>
<div class="is-flex">
<dt>{% trans "Version:" %}</dt>
<dd>{{ server.application_version }}</dd>
</div>
<div class="is-flex">
<dt>{% trans "Status:" %}</dt>
<dd>Federated</dd>
</div>
</dl>
</section>
<section class="block content">
<h2 class="title is-4">{% trans "Activity" %}</h2>
<dl>
<div class="is-flex">
<dt>{% trans "Users:" %}</dt>
<dd>
{{ users.count }}
{# {% if server.user_set.count %}(<a href="{% url 'settings-users' server=server.id %}">{% trans "View all users" %}</a>){% endif %} #}
</dd>
</div>
<div class="is-flex">
<dt>{% trans "Reports:" %}</dt>
<dd>
{{ reports.count }}
{% if reports.count %}(<a href="{% url 'settings-reports' %}?server={{ server.id }}">{% trans "View all" %}</a>){% endif %}
</dd>
</div>
<div class="is-flex">
<dt>{% trans "Followed by us:" %}</dt>
<dd>
{{ followed_by_us.count }}
</dd>
</div>
<div class="is-flex">
<dt>{% trans "Followed by them:" %}</dt>
<dd>
{{ followed_by_them.count }}
</dd>
</div>
<div class="is-flex">
<dt>{% trans "Blocked by us:" %}</dt>
<dd>
{{ blocked_by_us.count }}
</dd>
</div>
</dl>
</section>
{% endblock %}

View file

@ -1,5 +1,6 @@
{% extends 'settings/admin_layout.html' %} {% extends 'settings/admin_layout.html' %}
{% load i18n %} {% load i18n %}
{% block title %}{% trans "Federated Servers" %}{% endblock %}
{% block header %}{% trans "Federated Servers" %}{% endblock %} {% block header %}{% trans "Federated Servers" %}{% endblock %}
@ -7,17 +8,30 @@
<table class="table is-striped"> <table class="table is-striped">
<tr> <tr>
<th>{% trans "Server name" %}</th> {% url 'settings-federation' as url %}
<th>{% trans "Software" %}</th> <th>
{% trans "Server name" as text %}
{% include 'snippets/table-sort-header.html' with field="server_name" sort=sort text=text %}
</th>
<th>
{% trans "Date federated" as text %}
{% include 'snippets/table-sort-header.html' with field="created_date" sort=sort text=text %}
</th>
<th>
{% trans "Software" as text %}
{% include 'snippets/table-sort-header.html' with field="application_type" sort=sort text=text %}
</th>
<th>{% trans "Status" %}</th> <th>{% trans "Status" %}</th>
</tr> </tr>
{% for server in servers %} {% for server in servers %}
<tr> <tr>
<td>{{ server.server_name }}</td> <td><a href="{% url 'settings-federated-server' server.id %}">{{ server.server_name }}</a></td>
<td>{{ server.created_date }}</td>
<td>{{ server.application_type }} ({{ server.application_version }})</td> <td>{{ server.application_type }} ({{ server.application_version }})</td>
<td>{{ server.status }}</td> <td>{{ server.status }}</td>
</tr> </tr>
{% endfor %} {% endfor %}
</table> </table>
{% include 'snippets/pagination.html' with page=servers path=request.path %}
{% endblock %} {% endblock %}

View file

@ -0,0 +1,13 @@
{% load i18n %}
<a href="{{ url }}?sort={% if sort == field %}-{% endif %}{{ field }}">
{{ text }}
{% if sort == field %}
<span class="icon icon-arrow-down">
<span class="is-sr-only">{% trans "Sorted asccending" %}</span>
</span>
{% elif sort == "-"|add:field %}
<span class="icon icon-arrow-up">
<span class="is-sr-only">{% trans "Sorted descending" %}</span>
</span>
{% endif %}
</a>

View file

@ -55,7 +55,14 @@ urlpatterns = [
name="settings-email-preview", name="settings-email-preview",
), ),
re_path( re_path(
r"^settings/federation", views.Federation.as_view(), name="settings-federation" r"^settings/federation/?$",
views.Federation.as_view(),
name="settings-federation",
),
re_path(
r"^settings/federation/(?P<server>\d+)/?$",
views.FederatedServer.as_view(),
name="settings-federated-server",
), ),
re_path( re_path(
r"^settings/invites/?$", views.ManageInvites.as_view(), name="settings-invites" r"^settings/invites/?$", views.ManageInvites.as_view(), name="settings-invites"

View file

@ -6,7 +6,7 @@ from .books import Book, EditBook, ConfirmEditBook, Editions
from .books import upload_cover, add_description, switch_edition, resolve_book from .books import upload_cover, add_description, switch_edition, resolve_book
from .directory import Directory from .directory import Directory
from .error import not_found_page, server_error_page from .error import not_found_page, server_error_page
from .federation import Federation from .federation import Federation, FederatedServer
from .feed import DirectMessage, Feed, Replies, Status from .feed import DirectMessage, Feed, Replies, Status
from .follow import follow, unfollow from .follow import follow, unfollow
from .follow import accept_follow_request, delete_follow_request from .follow import accept_follow_request, delete_follow_request

View file

@ -1,10 +1,13 @@
""" manage federated servers """ """ manage federated servers """
from django.contrib.auth.decorators import login_required, permission_required from django.contrib.auth.decorators import login_required, permission_required
from django.core.paginator import Paginator
from django.shortcuts import get_object_or_404
from django.template.response import TemplateResponse from django.template.response import TemplateResponse
from django.utils.decorators import method_decorator from django.utils.decorators import method_decorator
from django.views import View from django.views import View
from bookwyrm import models from bookwyrm import models
from bookwyrm.settings import PAGE_LENGTH
# pylint: disable= no-self-use # pylint: disable= no-self-use
@ -17,7 +20,44 @@ class Federation(View):
""" what servers do we federate with """ """ what servers do we federate with """
def get(self, request): def get(self, request):
""" edit form """ """ list of servers """
try:
page = int(request.GET.get("page", 1))
except ValueError:
page = 1
servers = models.FederatedServer.objects.all() servers = models.FederatedServer.objects.all()
data = {"servers": servers}
sort = request.GET.get("sort")
sort_fields = ["created_date", "application_type", "server_name"]
if sort in sort_fields + ["-{:s}".format(f) for f in sort_fields]:
servers = servers.order_by(sort)
paginated = Paginator(servers, PAGE_LENGTH)
data = {"servers": paginated.page(page), "sort": sort}
return TemplateResponse(request, "settings/federation.html", data) return TemplateResponse(request, "settings/federation.html", data)
@method_decorator(login_required, name="dispatch")
@method_decorator(
permission_required("bookwyrm.control_federation", raise_exception=True),
name="dispatch",
)
class FederatedServer(View):
""" views for handling a specific federated server """
def get(self, request, server):
""" load a server """
server = get_object_or_404(models.FederatedServer, id=server)
users = server.user_set
data = {
"server": server,
"users": users,
"reports": models.Report.objects.filter(user__in=users.all()),
"followed_by_us": users.filter(followers__local=True),
"followed_by_them": users.filter(following__local=True),
"blocked_by_us": models.UserBlocks.objects.filter(
user_subject__in=users.all()
),
}
return TemplateResponse(request, "settings/federated_server.html", data)

View file

@ -24,10 +24,18 @@ class Reports(View):
def get(self, request): def get(self, request):
""" view current reports """ """ view current reports """
filters = {}
resolved = request.GET.get("resolved") == "true" resolved = request.GET.get("resolved") == "true"
server = request.GET.get("server")
if server:
server = get_object_or_404(models.FederatedServer, id=server)
filters["user__federated_server"] = server
filters["resolved"] = resolved
data = { data = {
"resolved": resolved, "resolved": resolved,
"reports": models.Report.objects.filter(resolved=resolved), "server": server,
"reports": models.Report.objects.filter(**filters),
} }
return TemplateResponse(request, "moderation/reports.html", data) return TemplateResponse(request, "moderation/reports.html", data)