diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py
index cf46baf3..fff3985e 100644
--- a/bookwyrm/emailing.py
+++ b/bookwyrm/emailing.py
@@ -28,7 +28,7 @@ def email_confirmation_email(user):
data = email_data()
data["confirmation_code"] = user.confirmation_code
data["confirmation_link"] = user.confirmation_link
- send_email.delay(user.email, *format_email("confirm_email", data))
+ send_email.delay(user.email, *format_email("confirm", data))
def invite_email(invite_request):
diff --git a/bookwyrm/templates/confirm_email.html b/bookwyrm/templates/confirm_email.html
deleted file mode 100644
index ac5b9282..00000000
--- a/bookwyrm/templates/confirm_email.html
+++ /dev/null
@@ -1 +0,0 @@
-{% extends "layout.html" %}
diff --git a/bookwyrm/templates/confirm_email/confirm_email.html b/bookwyrm/templates/confirm_email/confirm_email.html
new file mode 100644
index 00000000..85ca2bb1
--- /dev/null
+++ b/bookwyrm/templates/confirm_email/confirm_email.html
@@ -0,0 +1,44 @@
+{% extends "layout.html" %}
+{% load i18n %}
+
+{% block title %}{% trans "Confirm email" %}{% endblock %}
+
+{% block content %}
+
{% trans "Confirm your email address" %}
+
+
+
+
+
+ {% trans "A confirmation code has been sent to the email address you used to register your account." %}
+ {% if not valid %}
+ {% trans "Sorry! We couldn't find that code." %}
+ {% endif %}
+
+
+
+
+ {% trans "Can't find your code?" as button_text %}
+ {% include "snippets/toggle/open_button.html" with text=button_text controls_text="resend-form" focus="resend-form-header" %}
+ {% include "confirm_email/resend_form.html" with controls_text="resend-form" %}
+
+
+
+
+
+ {% include 'snippets/about.html' %}
+
+
+
+{% endblock %}
diff --git a/bookwyrm/templates/confirm_email/resend_form.html b/bookwyrm/templates/confirm_email/resend_form.html
new file mode 100644
index 00000000..00a89403
--- /dev/null
+++ b/bookwyrm/templates/confirm_email/resend_form.html
@@ -0,0 +1,19 @@
+{% extends "components/inline_form.html" %}
+{% load i18n %}
+{% block header %}
+{% trans "Resend confirmation link" %}
+{% endblock %}
+
+{% block form %}
+
+{% endblock %}
diff --git a/bookwyrm/templates/settings/site.html b/bookwyrm/templates/settings/site.html
index d36371a4..f64b529a 100644
--- a/bookwyrm/templates/settings/site.html
+++ b/bookwyrm/templates/settings/site.html
@@ -91,6 +91,13 @@
{% trans "Allow invite requests" %}
+
+
+
{% trans "(Recommended if registration is open)" %}
+
{{ site_form.registration_closed_text }}
diff --git a/bookwyrm/views/authentication.py b/bookwyrm/views/authentication.py
index edf960cc..dedcf408 100644
--- a/bookwyrm/views/authentication.py
+++ b/bookwyrm/views/authentication.py
@@ -144,18 +144,6 @@ class Register(View):
return redirect("get-started-profile")
-class ConfirmEmail(View):
- """enter code to confirm email address"""
-
- def get(self, request): # pylint: disable=unused-argument
- """you need a code! keep looking"""
- settings = models.SiteSettings.get()
- if request.user.is_authenticated or not settings.require_confirm_email:
- return redirect("/")
-
- return TemplateResponse(request, "confirm_email.html")
-
-
class ConfirmEmailCode(View):
"""confirm email address"""
@@ -166,10 +154,30 @@ class ConfirmEmailCode(View):
return redirect("/")
# look up the user associated with this code
- user = get_object_or_404(models.User, confirmation_code=code)
+ try:
+ user = models.User.objects.get(confirmation_code=code)
+ except models.User.DoesNotExist:
+ return TemplateResponse(request, "confirm_email/confirm_email.html", {"valid": False})
# update the user
user.is_active = True
user.deactivation_reason = None
user.save(broadcast=False, update_fields=["is_active", "deactivation_reason"])
# direct the user to log in
return redirect("login", confirmed="confirmed")
+
+
+class ConfirmEmail(View):
+ """enter code to confirm email address"""
+
+ def get(self, request): # pylint: disable=unused-argument
+ """you need a code! keep looking"""
+ settings = models.SiteSettings.get()
+ if request.user.is_authenticated or not settings.require_confirm_email:
+ return redirect("/")
+
+ return TemplateResponse(request, "confirm_email/confirm_email.html", {"valid": True})
+
+ def post(self, request):
+ """same as clicking the link"""
+ code = request.POST.get("code")
+ return ConfirmEmailCode().get(request, code)