diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 03cf4772e..2271077b1 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -18,6 +18,12 @@ def email_data(): } +def test_email(user): + """Just an admin checking if emails are sending""" + data = email_data() + send_email(user.email, *format_email("test", data)) + + def email_confirmation_email(user): """newly registered users confirm email address""" data = email_data() diff --git a/bookwyrm/templates/email/test/html_content.html b/bookwyrm/templates/email/test/html_content.html new file mode 100644 index 000000000..7cf577f45 --- /dev/null +++ b/bookwyrm/templates/email/test/html_content.html @@ -0,0 +1,12 @@ +{% extends 'email/html_layout.html' %} +{% load i18n %} + +{% block content %} +

+{% blocktrans trimmed %} +This is a test email. +{% endblocktrans %} +

+ + +{% endblock %} diff --git a/bookwyrm/templates/email/test/subject.html b/bookwyrm/templates/email/test/subject.html new file mode 100644 index 000000000..6ddada523 --- /dev/null +++ b/bookwyrm/templates/email/test/subject.html @@ -0,0 +1,4 @@ +{% load i18n %} +{% blocktrans trimmed %} +Test email +{% endblocktrans %} diff --git a/bookwyrm/templates/email/test/text_content.html b/bookwyrm/templates/email/test/text_content.html new file mode 100644 index 000000000..9d8a8f685 --- /dev/null +++ b/bookwyrm/templates/email/test/text_content.html @@ -0,0 +1,9 @@ +{% extends 'email/text_layout.html' %} +{% load i18n %} +{% block content %} +{% blocktrans trimmed %} +This is a test email. +{% endblocktrans %} + + +{% endblock %} diff --git a/bookwyrm/templates/settings/email_config.html b/bookwyrm/templates/settings/email_config.html new file mode 100644 index 000000000..3b10761ec --- /dev/null +++ b/bookwyrm/templates/settings/email_config.html @@ -0,0 +1,96 @@ +{% extends 'settings/layout.html' %} +{% load humanize %} +{% load i18n %} +{% load celery_tags %} + +{% block title %}{% trans "Email Configuration" %}{% endblock %} + +{% block header %}{% trans "Email Configuration" %}{% endblock %} + +{% block panel %} + +{% if error %} +
+ + + {% trans "Error sending test email:" %} + {{ error }} + +
+{% elif success %} +
+ + + {% trans "Successfully sent test email." %} + +
+{% endif %} + +
+
+
+ {% trans "Email sender:" %} +
+
+ {{ email_sender }} +
+ +
+ {% trans "Email backend:" %} +
+
+ {{ email_backend }} +
+ +
+ {% trans "Host:" %} +
+
+ {{ email_host }} +
+ +
+ {% trans "Host user:" %} +
+
+ {% firstof email_host_user "-" %} +
+ +
+ {% trans "Port:" %} +
+
+ {{ email_port }} +
+ +
+ {% trans "Use TLS:" %} +
+
+ {{ email_use_tls|yesno }} +
+ +
+ {% trans "Use SSL:" %} +
+
+ {{ email_use_ssl|yesno }} +
+
+
+
+

+ {% blocktrans trimmed with email=request.user.email %} + Send test email to {{ email }} + {% endblocktrans %} +

+
+ {% csrf_token %} + +
+
+ +{% endblock %} + diff --git a/bookwyrm/templates/settings/layout.html b/bookwyrm/templates/settings/layout.html index f195bf754..729bc1efd 100644 --- a/bookwyrm/templates/settings/layout.html +++ b/bookwyrm/templates/settings/layout.html @@ -81,12 +81,14 @@ {% url 'settings-imports' as url %} {% trans "Imports" %} - - {% endif %} {% if perms.bookwyrm.edit_instance_settings %} diff --git a/bookwyrm/tests/views/admin/test_email_config.py b/bookwyrm/tests/views/admin/test_email_config.py new file mode 100644 index 000000000..3aa16cb1d --- /dev/null +++ b/bookwyrm/tests/views/admin/test_email_config.py @@ -0,0 +1,46 @@ +""" test for app action functionality """ +from unittest.mock import patch + +from django.contrib.auth.models import Group +from django.template.response import TemplateResponse +from django.test import TestCase +from django.test.client import RequestFactory + +from bookwyrm import models, views +from bookwyrm.management.commands import initdb +from bookwyrm.tests.validate_html import validate_html + + +class EmailConfigViews(TestCase): + """every response to a get request, html or json""" + + # pylint: disable=invalid-name + def setUp(self): + """we need basic test data and mocks""" + self.factory = RequestFactory() + with patch("bookwyrm.suggested_users.rerank_suggestions_task.delay"), patch( + "bookwyrm.activitystreams.populate_stream_task.delay" + ), patch("bookwyrm.lists_stream.populate_lists_task.delay"): + self.local_user = models.User.objects.create_user( + "mouse@local.com", + "mouse@mouse.mouse", + "password", + local=True, + localname="mouse", + ) + initdb.init_groups() + initdb.init_permissions() + group = Group.objects.get(name="admin") + self.local_user.groups.set([group]) + models.SiteSettings.objects.create() + + def test_email_config_get(self): + """there are so many views, this just makes sure it LOADS""" + view = views.EmailConfig.as_view() + request = self.factory.get("") + request.user = self.local_user + + result = view(request) + self.assertIsInstance(result, TemplateResponse) + validate_html(result.render()) + self.assertEqual(result.status_code, 200) diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 90d0d0edc..2af2ece06 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -119,7 +119,7 @@ urlpatterns = [ ), re_path( r"^settings/email-preview/?$", - views.admin.site.email_preview, + views.admin.email_config.email_preview, name="settings-email-preview", ), re_path( @@ -314,6 +314,11 @@ urlpatterns = [ re_path( r"^settings/celery/?$", views.CeleryStatus.as_view(), name="settings-celery" ), + re_path( + r"^settings/email-config/?$", + views.EmailConfig.as_view(), + name="settings-email-config", + ), # landing pages re_path(r"^about/?$", views.about, name="about"), re_path(r"^privacy/?$", views.privacy, name="privacy"), diff --git a/bookwyrm/views/__init__.py b/bookwyrm/views/__init__.py index bc70490c5..a2b5dd625 100644 --- a/bookwyrm/views/__init__.py +++ b/bookwyrm/views/__init__.py @@ -10,6 +10,7 @@ from .admin.federation import Federation, FederatedServer from .admin.federation import AddFederatedServer, ImportServerBlocklist from .admin.federation import block_server, unblock_server, refresh_server from .admin.email_blocklist import EmailBlocklist +from .admin.email_config import EmailConfig from .admin.imports import ImportList, disable_imports, enable_imports from .admin.ip_blocklist import IPBlocklist from .admin.invite import ManageInvites, Invite, InviteRequest diff --git a/bookwyrm/views/admin/email_config.py b/bookwyrm/views/admin/email_config.py new file mode 100644 index 000000000..474c3ea5a --- /dev/null +++ b/bookwyrm/views/admin/email_config.py @@ -0,0 +1,65 @@ +""" is your email running? """ +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 emailing +from bookwyrm import settings + +# pylint: disable= no-self-use +@method_decorator(login_required, name="dispatch") +@method_decorator( + permission_required("bookwyrm.edit_instance_settings", raise_exception=True), + name="dispatch", +) +class EmailConfig(View): + """View and test your emailing setup""" + + def get(self, request): + """View email config""" + data = view_data() + # TODO: show email previews + return TemplateResponse(request, "settings/email_config.html", data) + + def post(self, request): + """Send test email""" + data = view_data() + try: + emailing.test_email(request.user) + data["success"] = True + except Exception as err: # pylint: disable=broad-except + data["error"] = err + return TemplateResponse(request, "settings/email_config.html", data) + + +def view_data(): + """helper to get data for view""" + return { + "email_backend": settings.EMAIL_BACKEND, + "email_host": settings.EMAIL_HOST, + "email_port": settings.EMAIL_PORT, + "Email_host_user": settings.EMAIL_HOST_USER, + "email_use_tls": settings.EMAIL_USE_TLS, + "email_use_ssl": settings.EMAIL_USE_SSL, + "email_sender": settings.EMAIL_SENDER, + } + + +@login_required +@permission_required("bookwyrm.edit_instance_settings", raise_exception=True) +def email_preview(request): + """for development, renders and example email template""" + template = request.GET.get("email") + data = emailing.email_data() + data["subject_path"] = f"email/{template}/subject.html" + data["html_content_path"] = f"email/{template}/html_content.html" + data["text_content_path"] = f"email/{template}/text_content.html" + data["reset_link"] = "https://example.com/link" + data["invite_link"] = "https://example.com/link" + data["confirmation_link"] = "https://example.com/link" + data["confirmation_code"] = "AKJHKDGKJSDFG" + data["reporter"] = "ConcernedUser" + data["reportee"] = "UserName" + data["report_link"] = "https://example.com/link" + return TemplateResponse(request, "email/preview.html", data) diff --git a/bookwyrm/views/admin/site.py b/bookwyrm/views/admin/site.py index df3b12aa0..e2574f1dd 100644 --- a/bookwyrm/views/admin/site.py +++ b/bookwyrm/views/admin/site.py @@ -4,7 +4,7 @@ from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views import View -from bookwyrm import emailing, forms, models +from bookwyrm import forms, models # pylint: disable= no-self-use @@ -33,22 +33,3 @@ class Site(View): data = {"site_form": forms.SiteForm(instance=site), "success": True} return TemplateResponse(request, "settings/site.html", data) - - -@login_required -@permission_required("bookwyrm.edit_instance_settings", raise_exception=True) -def email_preview(request): - """for development, renders and example email template""" - template = request.GET.get("email") - data = emailing.email_data() - data["subject_path"] = f"email/{template}/subject.html" - data["html_content_path"] = f"email/{template}/html_content.html" - data["text_content_path"] = f"email/{template}/text_content.html" - data["reset_link"] = "https://example.com/link" - data["invite_link"] = "https://example.com/link" - data["confirmation_link"] = "https://example.com/link" - data["confirmation_code"] = "AKJHKDGKJSDFG" - data["reporter"] = "ConcernedUser" - data["reportee"] = "UserName" - data["report_link"] = "https://example.com/link" - return TemplateResponse(request, "email/preview.html", data)