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 %}
+
+
+
+
+{% 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)