diff --git a/bookwyrm/forms/admin.py b/bookwyrm/forms/admin.py
index 0678c6650..acff6cfaa 100644
--- a/bookwyrm/forms/admin.py
+++ b/bookwyrm/forms/admin.py
@@ -77,6 +77,23 @@ class SiteForm(CustomForm):
"instance_short_description": forms.TextInput(
attrs={"aria-describedby": "desc_instance_short_description"}
),
+ }
+
+
+class RegistrationForm(CustomForm):
+ class Meta:
+ model = models.SiteSettings
+ fields = [
+ "allow_registration",
+ "allow_invite_requests",
+ "registration_closed_text",
+ "invite_request_text",
+ "invite_request_question",
+ "invite_question_text",
+ "require_confirm_email",
+ ]
+
+ widgets = {
"require_confirm_email": forms.CheckboxInput(
attrs={"aria-describedby": "desc_require_confirm_email"}
),
@@ -86,6 +103,23 @@ class SiteForm(CustomForm):
}
+class RegistrationLimitedForm(CustomForm):
+ class Meta:
+ model = models.SiteSettings
+ fields = [
+ "registration_closed_text",
+ "invite_request_text",
+ "invite_request_question",
+ "invite_question_text",
+ ]
+
+ widgets = {
+ "invite_request_text": forms.Textarea(
+ attrs={"aria-describedby": "desc_invite_request_text"}
+ ),
+ }
+
+
class ThemeForm(CustomForm):
class Meta:
model = models.Theme
diff --git a/bookwyrm/templates/settings/layout.html b/bookwyrm/templates/settings/layout.html
index f195bf754..274777b4c 100644
--- a/bookwyrm/templates/settings/layout.html
+++ b/bookwyrm/templates/settings/layout.html
@@ -101,6 +101,15 @@
{% trans "Site Settings" %}
{% block site-subtabs %}{% endblock %}
+
+ {% if perms.bookwyrm.manage_registration %}
+ {% url 'settings-registration' as url %}
+ {% trans "Registration" %}
+ {% else %}
+ {% url 'settings-registration-limited' as url %}
+ {% trans "Registration" %}
+ {% endif %}
+
{% url 'settings-themes' as url %}
{% trans "Themes" %}
diff --git a/bookwyrm/templates/settings/registration.html b/bookwyrm/templates/settings/registration.html
new file mode 100644
index 000000000..5ec7004da
--- /dev/null
+++ b/bookwyrm/templates/settings/registration.html
@@ -0,0 +1,83 @@
+{% extends 'settings/layout.html' %}
+{% load i18n %}
+
+{% block title %}{% trans "Registration" %}{% endblock %}
+
+{% block header %}{% trans "Registration" %}{% 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/registration_limited.html b/bookwyrm/templates/settings/registration_limited.html
new file mode 100644
index 000000000..1479e7d54
--- /dev/null
+++ b/bookwyrm/templates/settings/registration_limited.html
@@ -0,0 +1,75 @@
+{% extends 'settings/layout.html' %}
+{% load i18n %}
+
+{% block title %}{% trans "Registration" %}{% endblock %}
+
+{% block header %}{% trans "Registration" %}{% endblock %}
+
+{% block panel %}
+{% if success %}
+
+
+
+ {% trans "Settings saved" %}
+
+
+{% endif %}
+
+{% if form.errors %}
+
+
+
+ {% trans "Unable to save settings" %}
+
+
+{% endif %}
+
+{% if site.allow_registration %}
+
+ {% trans "Registration is enabled on this instance" %}
+
+{% else %}
+
+{% endif %}
+{% endblock %}
+
diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py
index 90d0d0edc..adfa3f100 100644
--- a/bookwyrm/urls.py
+++ b/bookwyrm/urls.py
@@ -86,6 +86,16 @@ urlpatterns = [
r"^settings/dashboard/?$", views.Dashboard.as_view(), name="settings-dashboard"
),
re_path(r"^settings/site-settings/?$", views.Site.as_view(), name="settings-site"),
+ re_path(
+ r"^settings/site-registration/?$",
+ views.RegistrationLimited.as_view(),
+ name="settings-registration-limited",
+ ),
+ re_path(
+ r"^settings/site-registration-admin/?$",
+ views.Registration.as_view(),
+ name="settings-registration",
+ ),
re_path(r"^settings/themes/?$", views.Themes.as_view(), name="settings-themes"),
re_path(
r"^settings/themes/(?P\d+)/delete/?$",
diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py
index bc70490c5..66e01524d 100644
--- a/bookwyrm/views/__init__.py
+++ b/bookwyrm/views/__init__.py
@@ -23,7 +23,7 @@ from .admin.reports import (
unsuspend_user,
moderator_delete_user,
)
-from .admin.site import Site
+from .admin.site import Site, Registration, RegistrationLimited
from .admin.themes import Themes, delete_theme
from .admin.user_admin import UserAdmin, UserAdminList
diff --git a/bookwyrm/views/admin/site.py b/bookwyrm/views/admin/site.py
index df3b12aa0..5fe88a553 100644
--- a/bookwyrm/views/admin/site.py
+++ b/bookwyrm/views/admin/site.py
@@ -35,6 +35,60 @@ class Site(View):
return TemplateResponse(request, "settings/site.html", data)
+@method_decorator(login_required, name="dispatch")
+@method_decorator(
+ permission_required("bookwyrm.edit_instance_settings", raise_exception=True),
+ name="dispatch",
+)
+class RegistrationLimited(View):
+ """Things related to registering that non-admins owners can change"""
+
+ def get(self, request):
+ """edit form"""
+ site = models.SiteSettings.objects.get()
+ data = {"form": forms.RegistrationLimitedForm(instance=site)}
+ return TemplateResponse(request, "settings/registration_limited.html", data)
+
+ def post(self, request):
+ """edit the site settings"""
+ site = models.SiteSettings.objects.get()
+ form = forms.RegistrationLimitedForm(request.POST, request.FILES, instance=site)
+ if not form.is_valid():
+ data = {"form": form}
+ return TemplateResponse(request, "settings/registration_limited.html", data)
+ site = form.save(request)
+
+ data = {"form": forms.RegistrationLimitedForm(instance=site), "success": True}
+ return TemplateResponse(request, "settings/registration_limited.html", data)
+
+
+@method_decorator(login_required, name="dispatch")
+@method_decorator(
+ permission_required("bookwyrm.manage_registration", raise_exception=True),
+ name="dispatch",
+)
+class Registration(View):
+ """Control everything about registration"""
+
+ def get(self, request):
+ """edit form"""
+ site = models.SiteSettings.objects.get()
+ data = {"form": forms.RegistrationForm(instance=site)}
+ return TemplateResponse(request, "settings/registration.html", data)
+
+ def post(self, request):
+ """edit the site settings"""
+ site = models.SiteSettings.objects.get()
+ form = forms.RegistrationForm(request.POST, request.FILES, instance=site)
+ if not form.is_valid():
+ data = {"form": form}
+ return TemplateResponse(request, "settings/registration.html", data)
+ site = form.save(request)
+
+ data = {"form": forms.RegistrationForm(instance=site), "success": True}
+ return TemplateResponse(request, "settings/registration.html", data)
+
+
@login_required
@permission_required("bookwyrm.edit_instance_settings", raise_exception=True)
def email_preview(request):