From d8a20175b685e26df3fc40f338a2cf074b26ccf6 Mon Sep 17 00:00:00 2001 From: Mouse Reeve Date: Sun, 21 Mar 2021 11:43:14 -0700 Subject: [PATCH] Adds email template layout and formatting --- bookwyrm/emailing.py | 32 ++++++++++++------ bookwyrm/static/images/logo-small.png | Bin 7039 -> 7314 bytes bookwyrm/templates/email/html_layout.html | 26 ++++++++++++++ .../templates/email/invite/html_content.html | 17 +++++++++- bookwyrm/templates/email/invite/subject.html | 2 +- .../templates/email/invite/text_content.html | 10 +++++- .../email/password_reset/html_content.html | 15 +++++++- .../email/password_reset/subject.html | 2 +- .../email/password_reset/text_content.html | 9 ++++- bookwyrm/templates/email/preview.html | 19 +++++++++++ bookwyrm/templates/email/snippets/action.html | 5 +++ bookwyrm/templates/email/text_layout.html | 3 ++ .../templates/password_reset_request.html | 7 +++- bookwyrm/urls.py | 9 +++-- bookwyrm/views/site.py | 16 ++++++++- 15 files changed, 152 insertions(+), 20 deletions(-) create mode 100644 bookwyrm/templates/email/html_layout.html create mode 100644 bookwyrm/templates/email/preview.html create mode 100644 bookwyrm/templates/email/snippets/action.html create mode 100644 bookwyrm/templates/email/text_layout.html diff --git a/bookwyrm/emailing.py b/bookwyrm/emailing.py index 7069286d7..4025aa220 100644 --- a/bookwyrm/emailing.py +++ b/bookwyrm/emailing.py @@ -4,25 +4,37 @@ from django.template.loader import get_template from bookwyrm import models from bookwyrm.tasks import app +from bookwyrm.settings import DOMAIN + + +def email_data(): + """ fields every email needs """ + site = models.SiteSettings.objects.get() + if site.logo_small: + logo_path = '/images/{}'.format(site.logo_small.url) + else: + logo_path = '/static/images/logo-small.png' + + return { + "site_name": site.name, + "logo": logo_path, + "domain": DOMAIN, + "user": None, + } def invite_email(invite_request): """ send out an invite code """ - site = models.SiteSettings.objects.get() - data = { - "site_name": site.name, - "invite_link": invite_request.invite.link, - } + data = email_data() + data["invite_link"] = invite_request.invite.link send_email.delay(invite_request.email, "invite", data) def password_reset_email(reset_code): """ generate a password reset email """ - site = models.SiteSettings.objects.get() - data = { - "site_name": site.name, - "reset_link": reset_code.link, - } + data = email_data() + data["reset_link"] = reset_code.link + data["user"] = reset_code.user.diplay_name send_email.delay(reset_code.user.email, "password_reset", data) diff --git a/bookwyrm/static/images/logo-small.png b/bookwyrm/static/images/logo-small.png index 10ea7a38fce9c962399af6697619cc9952cde89a..72f49ef78b35ce0ab8408ea3a254398274a219bf 100644 GIT binary patch delta 6585 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 Z{|EBj^_`|r6vqGn002ovPDHLkV1lYr@3Q~^ diff --git a/bookwyrm/templates/email/html_layout.html b/bookwyrm/templates/email/html_layout.html new file mode 100644 index 000000000..02527ff52 --- /dev/null +++ b/bookwyrm/templates/email/html_layout.html @@ -0,0 +1,26 @@ +{% load i18n %} +
+ + +
+

+ {% if user %}{{ user }},{% else %}{% trans "Hi there," %}{% endif %} +

+ {% block content %}{% endblock %} +
+ +
+

{% blocktrans %}BookWyrm hosted on {{ site_name }}{% endblocktrans %}

+ {% if user %} +

{% trans "Email preference" %}

+ {% endif %} +
+
diff --git a/bookwyrm/templates/email/invite/html_content.html b/bookwyrm/templates/email/invite/html_content.html index 672d34077..358e23dc1 100644 --- a/bookwyrm/templates/email/invite/html_content.html +++ b/bookwyrm/templates/email/invite/html_content.html @@ -1,2 +1,17 @@ +{% extends 'email/html_layout.html' %} {% load i18n %} -{% blocktrans %}Join {{ site_name }}{% endblocktrans %} + +{% block content %} +

+ {% blocktrans %}You're invited to join {{ site_name }}!{% endblocktrans %} +

+ +{% trans "Join Now" as text %} +{% include 'email/snippets/action.html' with path=invite_link text=text %} + +

+ {% url 'code-of-conduct' as coc_path %} + {% url 'about' as about_path %} + {% blocktrans %}Learn more about this instance.{% endblocktrans %} +

+{% endblock %} diff --git a/bookwyrm/templates/email/invite/subject.html b/bookwyrm/templates/email/invite/subject.html index b3c4a141d..efb8be5ae 100644 --- a/bookwyrm/templates/email/invite/subject.html +++ b/bookwyrm/templates/email/invite/subject.html @@ -1,2 +1,2 @@ {% load i18n %} -{% blocktrans %}You're invited! Join {{ site_name }}{% endblocktrans %} +{% blocktrans %}You're invited to join {{ site_name }}!{% endblocktrans %} diff --git a/bookwyrm/templates/email/invite/text_content.html b/bookwyrm/templates/email/invite/text_content.html index 7add9010f..c3fcdc04e 100644 --- a/bookwyrm/templates/email/invite/text_content.html +++ b/bookwyrm/templates/email/invite/text_content.html @@ -1,2 +1,10 @@ +{% extends 'email/text_layout.html' %} {% load i18n %} -{% blocktrans %}Join {{ site_name }}: {{ invite_link }}{% endblocktrans %} +{% block content %} +{% blocktrans %}You're invited to join {{ site_name }}! Click the link below to create an account.{% endblocktrans %} + +{{ invite_link }} + +{% trans "Learn more about this instance:" %} https://{{ domain }}{% url 'about' %} + +{% endblock %} diff --git a/bookwyrm/templates/email/password_reset/html_content.html b/bookwyrm/templates/email/password_reset/html_content.html index e3a006b04..eef0e5e59 100644 --- a/bookwyrm/templates/email/password_reset/html_content.html +++ b/bookwyrm/templates/email/password_reset/html_content.html @@ -1,2 +1,15 @@ +{% extends 'email/html_layout.html' %} {% load i18n %} -{% blocktrans %}Your password reset link is: {{ reset_link }}{% endblocktrans %} + +{% block content %} +

+ {% blocktrans %}You requested to reset your {{ site_name }} password. Click the link below to set a new password and log in to your account.{% endblocktrans %} +

+ +{% trans "Reset Password" as text %} +{% include 'email/snippets/action.html' with path=reset_link text=text %} + +

+ {% trans "If you didn't request to reset your password, you can ignore this email." %} +

+{% endblock %} diff --git a/bookwyrm/templates/email/password_reset/subject.html b/bookwyrm/templates/email/password_reset/subject.html index b216a6c26..886801402 100644 --- a/bookwyrm/templates/email/password_reset/subject.html +++ b/bookwyrm/templates/email/password_reset/subject.html @@ -1,2 +1,2 @@ {% load i18n %} -{% blocktrans %}Reset your password on {{ site_name }}{% endblocktrans %} +{% blocktrans %}Reset your {{ site_name }} password{% endblocktrans %} diff --git a/bookwyrm/templates/email/password_reset/text_content.html b/bookwyrm/templates/email/password_reset/text_content.html index e3a006b04..b5cf754ef 100644 --- a/bookwyrm/templates/email/password_reset/text_content.html +++ b/bookwyrm/templates/email/password_reset/text_content.html @@ -1,2 +1,9 @@ +{% extends 'email/text_layout.html' %} {% load i18n %} -{% blocktrans %}Your password reset link is: {{ reset_link }}{% endblocktrans %} +{% block content %} +{% blocktrans %}You requested to reset your {{ site_name }} password. Click the link below to set a new password and log in to your account.{% endblocktrans %} + +{{ reset_link }} + +{% trans "If you didn't request to reset your password, you can ignore this email." %} +{% endblock %} diff --git a/bookwyrm/templates/email/preview.html b/bookwyrm/templates/email/preview.html new file mode 100644 index 000000000..66d856c08 --- /dev/null +++ b/bookwyrm/templates/email/preview.html @@ -0,0 +1,19 @@ + + +
+ Subject: {% include subject_path %} +
+
+ + Html email: +
+ {% include html_content_path %} +
+
+ + Text email: +
+ {% include text_content_path %} +
+ + diff --git a/bookwyrm/templates/email/snippets/action.html b/bookwyrm/templates/email/snippets/action.html new file mode 100644 index 000000000..56feb9efd --- /dev/null +++ b/bookwyrm/templates/email/snippets/action.html @@ -0,0 +1,5 @@ +

+ + {{ text }} + +

diff --git a/bookwyrm/templates/email/text_layout.html b/bookwyrm/templates/email/text_layout.html new file mode 100644 index 000000000..cd0444f16 --- /dev/null +++ b/bookwyrm/templates/email/text_layout.html @@ -0,0 +1,3 @@ +{% load i18n %} +{% if user %}{{ user.display_name }},{% else %}{% trans "Hi there," %}{% endif %} +{% block content %}{% endblock %} diff --git a/bookwyrm/templates/password_reset_request.html b/bookwyrm/templates/password_reset_request.html index 97191afa4..5d877442f 100644 --- a/bookwyrm/templates/password_reset_request.html +++ b/bookwyrm/templates/password_reset_request.html @@ -8,7 +8,9 @@

{% trans "Reset Password" %}

- {% if message %}

{{ message }}

{% endif %} + + {% if message %}

{{ message }}

{% endif %} +

{% trans "A link to reset your password will be sent to your email address" %}

{% csrf_token %} @@ -16,6 +18,9 @@
+ {% if error %} +

{{ error }}

+ {% endif %}
diff --git a/bookwyrm/urls.py b/bookwyrm/urls.py index 30c1bba4e..4aced6fe6 100644 --- a/bookwyrm/urls.py +++ b/bookwyrm/urls.py @@ -48,6 +48,11 @@ urlpatterns = [ ), # admin re_path(r"^settings/site-settings", views.Site.as_view(), name="settings-site"), + re_path( + r"^settings/email-preview", + views.site.email_preview, + name="settings-email-preview", + ), re_path( r"^settings/federation", views.Federation.as_view(), name="settings-federation" ), @@ -87,8 +92,8 @@ urlpatterns = [ ), re_path(r"^report/?$", views.make_report, name="report"), # landing pages - re_path(r"^about/?$", views.About.as_view()), - path("", views.Home.as_view()), + re_path(r"^about/?$", views.About.as_view(), name="about"), + path("", views.Home.as_view(), name="landing"), re_path(r"^discover/?$", views.Discover.as_view()), re_path(r"^notifications/?$", views.Notifications.as_view()), # feeds diff --git a/bookwyrm/views/site.py b/bookwyrm/views/site.py index ce64e6e0f..5b33b92a7 100644 --- a/bookwyrm/views/site.py +++ b/bookwyrm/views/site.py @@ -5,7 +5,7 @@ from django.template.response import TemplateResponse from django.utils.decorators import method_decorator from django.views import View -from bookwyrm import forms, models +from bookwyrm import emailing, forms, models # pylint: disable= no-self-use @@ -33,3 +33,17 @@ class Site(View): form.save() return redirect("settings-site") + + +@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"] = "email/{}/subject.html".format(template) + data["html_content_path"] = "email/{}/html_content.html".format(template) + data["text_content_path"] = "email/{}/text_content.html".format(template) + data["reset_link"] = "https://example.com/link" + data["invite_link"] = "https://example.com/link" + return TemplateResponse(request, "email/preview.html", data)