email templates (#328)
This commit is contained in:
parent
eea83214cb
commit
05adbace24
|
@ -0,0 +1,25 @@
|
||||||
|
from django.template import Library, Template
|
||||||
|
|
||||||
|
register = Library()
|
||||||
|
|
||||||
|
|
||||||
|
@register.inclusion_tag("emails/_body_content.html", takes_context=True)
|
||||||
|
def email_body_content(context, content):
|
||||||
|
template = Template(content)
|
||||||
|
return {"content": template.render(context)}
|
||||||
|
|
||||||
|
|
||||||
|
@register.inclusion_tag("emails/_button.html", takes_context=True)
|
||||||
|
def email_button(context, button_text, button_link):
|
||||||
|
text_template = Template(button_text)
|
||||||
|
link_template = Template(button_link)
|
||||||
|
return {
|
||||||
|
"button_text": text_template.render(context),
|
||||||
|
"button_link": link_template.render(context),
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@register.inclusion_tag("emails/_footer.html", takes_context=True)
|
||||||
|
def email_footer(context, content):
|
||||||
|
template = Template(content)
|
||||||
|
return {"content": template.render(context)}
|
|
@ -0,0 +1,3 @@
|
||||||
|
{% autoescape off %}
|
||||||
|
<p style="font-family: sans-serif; font-size: 14px; font-weight: normal; margin: 0; margin-bottom: 15px;">{{ content }}</p>
|
||||||
|
{% endautoescape %}
|
|
@ -0,0 +1,17 @@
|
||||||
|
{% autoescape off %}
|
||||||
|
<table role="presentation" border="0" cellpadding="0" cellspacing="0" class="btn btn-primary" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; box-sizing: border-box; width: 100%;" width="100%">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td align="left" style="font-family: sans-serif; font-size: 14px; vertical-align: top; padding-bottom: 15px;" valign="top">
|
||||||
|
<table role="presentation" border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: auto;">
|
||||||
|
<tbody>
|
||||||
|
<tr>
|
||||||
|
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top; border-radius: 5px; text-align: center; background-color: #3498db;" valign="top" align="center" bgcolor="#3498db"> <a href="{{ button_link }}" target="_blank" style="border: solid 1px #3498db; border-radius: 5px; box-sizing: border-box; cursor: pointer; display: inline-block; font-size: 14px; font-weight: bold; margin: 0; padding: 12px 25px; text-decoration: none; text-transform: capitalize; background-color: #3498db; border-color: #3498db; color: #ffffff;">{{ button_text }}</a> </td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</tbody>
|
||||||
|
</table>
|
||||||
|
{% endautoescape %}
|
|
@ -0,0 +1,7 @@
|
||||||
|
{% autoescape off %}
|
||||||
|
<tr>
|
||||||
|
<td class="content-block" style="font-family: sans-serif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; color: #999999; font-size: 12px; text-align: center;" valign="top" align="center">
|
||||||
|
{{ content }}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endautoescape %}
|
|
@ -0,0 +1,27 @@
|
||||||
|
{% extends "emails/base.html" %}
|
||||||
|
{% load mail_tags %}
|
||||||
|
{% autoescape off %}
|
||||||
|
{% block title %}{{settings.MAIN_DOMAIN}} - New Account Created{% endblock title %}
|
||||||
|
{% block subtitle %}{{settings.MAIN_DOMAIN}} - New Account Created{% endblock subtitle %}
|
||||||
|
|
||||||
|
{% block body_greeting %}
|
||||||
|
{% email_body_content "Hi there," %}
|
||||||
|
{% endblock body_greeting %}
|
||||||
|
|
||||||
|
{% block body_content %}
|
||||||
|
{% email_body_content "Your email address was used to create a new account at {{config.site_name}} (https://{{settings.MAIN_DOMAIN}})." %}
|
||||||
|
{% email_body_content "To confirm your new account, go to this link:" %}
|
||||||
|
{% endblock body_content %}
|
||||||
|
|
||||||
|
{% block body_button %}
|
||||||
|
{% email_button button_text="Confirm New Account" button_link="https://{{settings.MAIN_DOMAIN}}/auth/reset/{{reset.token}}/" %}
|
||||||
|
{% endblock body_button %}
|
||||||
|
|
||||||
|
{% block body_signature %}
|
||||||
|
{% email_body_content "Thanks, Admins @{{settings.MAIN_DOMAIN}}" %}
|
||||||
|
{% endblock body_signature %}
|
||||||
|
|
||||||
|
{% block extra_footer %}
|
||||||
|
{% email_footer "If this was not you, then please ignore this message - your email will not be used to make an account if this link is not visited." %}
|
||||||
|
{% endblock extra_footer %}
|
||||||
|
{% endautoescape %}
|
|
@ -0,0 +1,163 @@
|
||||||
|
{% autoescape off %}
|
||||||
|
<!doctype html>
|
||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
|
||||||
|
<title>{% block title %}{% endblock title %}</title>
|
||||||
|
<style>
|
||||||
|
@media only screen and (max-width: 620px) {
|
||||||
|
table.body h1 {
|
||||||
|
font-size: 28px !important;
|
||||||
|
margin-bottom: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.body p,
|
||||||
|
table.body ul,
|
||||||
|
table.body ol,
|
||||||
|
table.body td,
|
||||||
|
table.body span,
|
||||||
|
table.body a {
|
||||||
|
font-size: 16px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.body .wrapper,
|
||||||
|
table.body .article {
|
||||||
|
padding: 10px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.body .content {
|
||||||
|
padding: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.body .container {
|
||||||
|
padding: 0 !important;
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.body .main {
|
||||||
|
border-left-width: 0 !important;
|
||||||
|
border-radius: 0 !important;
|
||||||
|
border-right-width: 0 !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.body .btn table {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.body .btn a {
|
||||||
|
width: 100% !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
table.body .img-responsive {
|
||||||
|
height: auto !important;
|
||||||
|
max-width: 100% !important;
|
||||||
|
width: auto !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media all {
|
||||||
|
.ExternalClass {
|
||||||
|
width: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.ExternalClass,
|
||||||
|
.ExternalClass p,
|
||||||
|
.ExternalClass span,
|
||||||
|
.ExternalClass font,
|
||||||
|
.ExternalClass td,
|
||||||
|
.ExternalClass div {
|
||||||
|
line-height: 100%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.apple-link a {
|
||||||
|
color: inherit !important;
|
||||||
|
font-family: inherit !important;
|
||||||
|
font-size: inherit !important;
|
||||||
|
font-weight: inherit !important;
|
||||||
|
line-height: inherit !important;
|
||||||
|
text-decoration: none !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
#MessageViewBody a {
|
||||||
|
color: inherit;
|
||||||
|
text-decoration: none;
|
||||||
|
font-size: inherit;
|
||||||
|
font-family: inherit;
|
||||||
|
font-weight: inherit;
|
||||||
|
line-height: inherit;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary table td:hover {
|
||||||
|
background-color: #34495e !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.btn-primary a:hover {
|
||||||
|
background-color: #34495e !important;
|
||||||
|
border-color: #34495e !important;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
<body style="background-color: #f6f6f6; font-family: sans-serif; -webkit-font-smoothing: antialiased; font-size: 14px; line-height: 1.4; margin: 0; padding: 0; -ms-text-size-adjust: 100%; -webkit-text-size-adjust: 100%;">
|
||||||
|
<span class="preheader" style="color: transparent; display: none; height: 0; max-height: 0; max-width: 0; opacity: 0; overflow: hidden; mso-hide: all; visibility: hidden; width: 0;">{% block subtitle %}{% endblock subtitle %}</span>
|
||||||
|
<table role="presentation" border="0" cellpadding="0" cellspacing="0" class="body" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background-color: #f6f6f6; width: 100%;" width="100%" bgcolor="#f6f6f6">
|
||||||
|
<tr>
|
||||||
|
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;" valign="top"> </td>
|
||||||
|
<td class="container" style="font-family: sans-serif; font-size: 14px; vertical-align: top; display: block; max-width: 580px; padding: 10px; width: 580px; margin: 0 auto;" width="580" valign="top">
|
||||||
|
<div class="content" style="box-sizing: border-box; display: block; margin: 0 auto; max-width: 580px; padding: 10px;">
|
||||||
|
|
||||||
|
<!-- START CENTERED WHITE CONTAINER -->
|
||||||
|
<table role="presentation" class="main" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; background: #ffffff; border-radius: 3px; width: 100%;" width="100%">
|
||||||
|
{% block body %}
|
||||||
|
<!-- START MAIN CONTENT AREA -->
|
||||||
|
<tr>
|
||||||
|
<td class="wrapper" style="font-family: sans-serif; font-size: 14px; vertical-align: top; box-sizing: border-box; padding: 20px;" valign="top">
|
||||||
|
<table role="presentation" border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;" width="100%">
|
||||||
|
<tr>
|
||||||
|
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;" valign="top">
|
||||||
|
{% block body_greeting %}
|
||||||
|
{% endblock body_greeting %}
|
||||||
|
{% block body_content %}
|
||||||
|
{% endblock body_content %}
|
||||||
|
{% block body_button %}
|
||||||
|
{% endblock body_button %}
|
||||||
|
{% block body_signature %}
|
||||||
|
{% endblock body_signature %}
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endblock body %}
|
||||||
|
<!-- END MAIN CONTENT AREA -->
|
||||||
|
</table>
|
||||||
|
<!-- END CENTERED WHITE CONTAINER -->
|
||||||
|
|
||||||
|
<!-- START FOOTER -->
|
||||||
|
<div class="footer" style="clear: both; margin-top: 10px; text-align: center; width: 100%;">
|
||||||
|
<table role="presentation" border="0" cellpadding="0" cellspacing="0" style="border-collapse: separate; mso-table-lspace: 0pt; mso-table-rspace: 0pt; width: 100%;" width="100%">
|
||||||
|
{% block extra_footer %}
|
||||||
|
{% endblock extra_footer %}
|
||||||
|
{% block footer %}
|
||||||
|
<tr>
|
||||||
|
<td class="content-block" style="font-family: sans-serif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; color: #999999; font-size: 12px; text-align: center;" valign="top" align="center">
|
||||||
|
Visit our Site: <a href="https://{{settings.MAIN_DOMAIN}}" style="text-decoration: underline; color: #999999; font-size: 12px; text-align: center;">https://{{settings.MAIN_DOMAIN}}</a>.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td class="content-block powered-by" style="font-family: sans-serif; vertical-align: top; padding-bottom: 10px; padding-top: 10px; color: #999999; font-size: 12px; text-align: center;" valign="top" align="center">
|
||||||
|
Powered by <a href="https://jointakahe.org/" style="color: #999999; font-size: 12px; text-align: center; text-decoration: none;">Takahe</a>.
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
{% endblock footer %}
|
||||||
|
</table>
|
||||||
|
</div>
|
||||||
|
<!-- END FOOTER -->
|
||||||
|
</div>
|
||||||
|
</td>
|
||||||
|
<td style="font-family: sans-serif; font-size: 14px; vertical-align: top;" valign="top"> </td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
|
{% endautoescape %}
|
|
@ -0,0 +1,27 @@
|
||||||
|
{% extends "emails/base.html" %}
|
||||||
|
{% load mail_tags %}
|
||||||
|
{% autoescape off %}
|
||||||
|
{% block title %}{{settings.MAIN_DOMAIN}} - Password Reset Requested{% endblock title %}
|
||||||
|
{% block subtitle %}{{settings.MAIN_DOMAIN}} - Password Reset Requested{% endblock subtitle %}
|
||||||
|
|
||||||
|
{% block body_greeting %}
|
||||||
|
{% email_body_content "Hi there," %}
|
||||||
|
{% endblock body_greeting %}
|
||||||
|
|
||||||
|
{% block body_content %}
|
||||||
|
{% email_body_content "A password reset was requested for your account ({{reset.user.email}}) at {{Config.system.site_name}} (https://{{settings.MAIN_DOMAIN}})." %}
|
||||||
|
{% email_body_content "To reset your password, go to this link:" %}
|
||||||
|
{% endblock body_content %}
|
||||||
|
|
||||||
|
{% block body_button %}
|
||||||
|
{% email_button button_text="Reset Password" button_link="https://{{settings.MAIN_DOMAIN}}/auth/reset/{{reset.token}}/" %}
|
||||||
|
{% endblock body_button %}
|
||||||
|
|
||||||
|
{% block body_signature %}
|
||||||
|
{% email_body_content "Thanks, Admins @{{settings.MAIN_DOMAIN}}" %}
|
||||||
|
{% endblock body_signature %}
|
||||||
|
|
||||||
|
{% block extra_footer %}
|
||||||
|
{% email_footer "If this was not you, then please ignore this message - your password will not be reset if this link is not visited." %}
|
||||||
|
{% endblock extra_footer %}
|
||||||
|
{% endautoescape %}
|
|
@ -34,6 +34,14 @@ class PasswordResetStates(StateGraph):
|
||||||
"settings": settings,
|
"settings": settings,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
html_message=render_to_string(
|
||||||
|
"emails/account_new.html",
|
||||||
|
{
|
||||||
|
"reset": reset,
|
||||||
|
"config": Config.system,
|
||||||
|
"settings": settings,
|
||||||
|
},
|
||||||
|
),
|
||||||
from_email=settings.SERVER_EMAIL,
|
from_email=settings.SERVER_EMAIL,
|
||||||
recipient_list=[reset.user.email],
|
recipient_list=[reset.user.email],
|
||||||
)
|
)
|
||||||
|
@ -48,6 +56,14 @@ class PasswordResetStates(StateGraph):
|
||||||
"settings": settings,
|
"settings": settings,
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
html_message=render_to_string(
|
||||||
|
"emails/password_reset.html",
|
||||||
|
{
|
||||||
|
"reset": reset,
|
||||||
|
"config": Config.system,
|
||||||
|
"settings": settings,
|
||||||
|
},
|
||||||
|
),
|
||||||
from_email=settings.SERVER_EMAIL,
|
from_email=settings.SERVER_EMAIL,
|
||||||
recipient_list=[reset.user.email],
|
recipient_list=[reset.user.email],
|
||||||
)
|
)
|
||||||
|
|
Loading…
Reference in New Issue