diff --git a/bookwyrm/forms/admin.py b/bookwyrm/forms/admin.py index 72f50ccb8..c246acb74 100644 --- a/bookwyrm/forms/admin.py +++ b/bookwyrm/forms/admin.py @@ -177,6 +177,13 @@ class ServerForm(CustomForm): exclude = ["remote_id"] +class FederationSettings(CustomForm): + class Meta: + model = models.SiteSettings + fields = [ + "disable_federation", + ] + class AutoModRuleForm(CustomForm): class Meta: model = models.AutoMod diff --git a/bookwyrm/migrations/0210_sitesettings_disable_federation.py b/bookwyrm/migrations/0210_sitesettings_disable_federation.py new file mode 100644 index 000000000..b4630bc28 --- /dev/null +++ b/bookwyrm/migrations/0210_sitesettings_disable_federation.py @@ -0,0 +1,18 @@ +# Generated by Django 4.2.15 on 2024-08-27 19:38 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("bookwyrm", "0209_user_show_ratings"), + ] + + operations = [ + migrations.AddField( + model_name="sitesettings", + name="disable_federation", + field=models.BooleanField(default=False), + ), + ] diff --git a/bookwyrm/models/site.py b/bookwyrm/models/site.py index 6c2a73422..15af25c1c 100644 --- a/bookwyrm/models/site.py +++ b/bookwyrm/models/site.py @@ -83,6 +83,7 @@ class SiteSettings(SiteModel): invite_question_text = models.CharField( max_length=255, blank=True, default="What is your favourite book?" ) + # images logo = models.ImageField(upload_to="logos/", null=True, blank=True) logo_small = models.ImageField(upload_to="logos/", null=True, blank=True) @@ -103,6 +104,7 @@ class SiteSettings(SiteModel): import_limit_reset = models.IntegerField(default=0) user_exports_enabled = models.BooleanField(default=False) user_import_time_limit = models.IntegerField(default=48) + disable_federation = models.BooleanField(default=False) field_tracker = FieldTracker(fields=["name", "instance_tagline", "logo"]) diff --git a/bookwyrm/templates/settings/federation/settings.html b/bookwyrm/templates/settings/federation/settings.html new file mode 100644 index 000000000..79c78bd49 --- /dev/null +++ b/bookwyrm/templates/settings/federation/settings.html @@ -0,0 +1,48 @@ +{% extends 'settings/layout.html' %} +{% load i18n %} +{% block title %}{% trans "Federation Settings" %}{% endblock %} + +{% block header %}{% trans "Federated Settings" %}{% endblock %} + +{% block panel %} +{% if success %} +
+ + + {% trans "Settings saved" %} + +
+{% endif %} + +{% if form.errors %} +
+ + + {% trans "Unable to save settings" %} + +
+{% endif %} + +
+ {% csrf_token %} +
+
+ +
+
+ +
+ + +{% endblock %} + diff --git a/bookwyrm/templates/settings/layout.html b/bookwyrm/templates/settings/layout.html index 70c7ef0f4..79abea191 100644 --- a/bookwyrm/templates/settings/layout.html +++ b/bookwyrm/templates/settings/layout.html @@ -41,12 +41,19 @@ {% url 'settings-invites' as alt_url %} {% trans "Invites" %} - {% if perms.bookwyrm.control_federation %} + + {% endif %} + {% if perms.bookwyrm.control_federation %} + + {% endif %} {% if perms.bookwyrm.moderate_user %} diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index cd75eb0c0..61b8e05bb 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -162,6 +162,11 @@ urlpatterns = [ views.ActivateUserAdmin.as_view(), name="settings-activate-user", ), + re_path( + r"^settings/federation-settings/?$", + views.FederationSettings.as_view(), + name="settings-federation-settings", + ), re_path( r"^settings/federation/(?P(federated|blocked))?/?$", views.Federation.as_view(), diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index ebc851847..28cf56792 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -10,6 +10,7 @@ from .admin.dashboard import Dashboard from .admin.federation import Federation, FederatedServer from .admin.federation import AddFederatedServer, ImportServerBlocklist from .admin.federation import block_server, unblock_server, refresh_server +from .admin.federation_settings import FederationSettings from .admin.email_blocklist import EmailBlocklist from .admin.email_config import EmailConfig from .admin.imports import ( diff --git a/bookwyrm/views/admin/federation_settings.py b/bookwyrm/views/admin/federation_settings.py new file mode 100644 index 000000000..127f85a12 --- /dev/null +++ b/bookwyrm/views/admin/federation_settings.py @@ -0,0 +1,36 @@ +""" big picture settings about how the instance shares data """ +from django.contrib.auth.decorators import login_required, permission_required +from django.template.response import TemplateResponse +from django.utils.decorators import method_decorator +from django.views import View + +from bookwyrm import forms, models + + +# pylint: disable= no-self-use +@method_decorator(login_required, name="dispatch") +@method_decorator( + permission_required("bookwyrm.control_federation", raise_exception=True), + name="dispatch", +) +class FederationSettings(View): + """what servers do we federate with""" + + def get(self, request): + """show the current settings""" + site = models.SiteSettings.objects.get() + data = { + "form": forms.FederationSettings(instance=site), + } + return TemplateResponse(request, "settings/federation/settings.html", data) + + def post(self, request): + """Update federation settings""" + site = models.SiteSettings.objects.get() + form = forms.FederationSettings(request.POST, instance=site) + if not form.is_valid(): + data = {"form": form} + return TemplateResponse(request, "settings/federation/settings.html", data) + form.save(request) + data = {"form": forms.FederationSettings(instance=site), "success": True} + return TemplateResponse(request, "settings/federation/settings.html", data)