From 4db47902706ecd791610b67f7a9d6bf0cecb7d36 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Thu, 16 Aug 2018 12:01:23 +0200 Subject: [PATCH] Custom HTML email renderers and new email style (#991) * Custom HTML email renderers * Move inline_css call * Small fixes * New HTML mail style for pretix * Thumbs * Inlinestyle for notifications * Documentation * Set line-height --- doc/development/api/email.rst | 109 ++++++ doc/development/api/index.rst | 3 +- src/pretix/base/__init__.py | 1 + src/pretix/base/email.py | 111 ++++++ src/pretix/base/models/event.py | 28 +- src/pretix/base/models/orders.py | 2 +- src/pretix/base/services/mail.py | 36 +- src/pretix/base/services/notifications.py | 3 +- src/pretix/base/settings.py | 4 + src/pretix/base/signals.py | 10 + .../base/templates/pretixbase/email/base.html | 329 ++++++++++-------- .../pretixbase/email/notification.html | 25 +- .../pretixbase/email/plainwrapper.html | 26 +- .../templates/pretixbase/email/separator.html | 15 + src/pretix/control/forms/event.py | 12 + .../templates/pretixcontrol/event/mail.html | 22 ++ src/pretix/control/urls.py | 2 + src/pretix/control/views/event.py | 42 ++- src/pretix/control/views/orders.py | 2 +- .../static/pretixbase/email/divider.png | Bin 0 -> 349 bytes .../static/pretixbase/email/divider.svg | 74 ++++ src/pretix/static/pretixbase/email/foot.png | Bin 0 -> 1130 bytes src/pretix/static/pretixbase/email/foot.svg | 75 ++++ src/pretix/static/pretixbase/email/head.png | Bin 0 -> 575 bytes src/pretix/static/pretixbase/email/head.svg | 75 ++++ src/pretix/static/pretixbase/email/thumb.png | Bin 0 -> 43180 bytes .../static/pretixcontrol/scss/_forms.scss | 12 + 27 files changed, 833 insertions(+), 185 deletions(-) create mode 100644 doc/development/api/email.rst create mode 100644 src/pretix/base/templates/pretixbase/email/separator.html create mode 100644 src/pretix/static/pretixbase/email/divider.png create mode 100644 src/pretix/static/pretixbase/email/divider.svg create mode 100644 src/pretix/static/pretixbase/email/foot.png create mode 100644 src/pretix/static/pretixbase/email/foot.svg create mode 100644 src/pretix/static/pretixbase/email/head.png create mode 100644 src/pretix/static/pretixbase/email/head.svg create mode 100644 src/pretix/static/pretixbase/email/thumb.png diff --git a/doc/development/api/email.rst b/doc/development/api/email.rst new file mode 100644 index 0000000000..d0e219207f --- /dev/null +++ b/doc/development/api/email.rst @@ -0,0 +1,109 @@ +.. highlight:: python + :linenothreshold: 5 + +Writing an HTML e-mail renderer plugin +====================================== + +An email renderer class controls how the HTML part of e-mails sent by pretix is built. +The creation of such a plugin is very similar to creating an export output. + +Please read :ref:`Creating a plugin ` first, if you haven't already. + +Output registration +------------------- + +The email HTML renderer API does not make a lot of usage from signals, however, it +does use a signal to get a list of all available email renderers. Your plugin +should listen for this signal and return the subclass of ``pretix.base.email.BaseHTMLMailRenderer`` +that we'll provide in this plugin:: + + from django.dispatch import receiver + + from pretix.base.signals import register_html_mail_renderers + + + @receiver(register_html_mail_renderers, dispatch_uid="renderer_custom") + def register_mail_renderers(sender, **kwargs): + from .email import MyMailRenderer + return MyMailRenderer + + +The renderer class +------------------ + +.. class:: pretix.base.email.BaseHTMLMailRenderer + + The central object of each email renderer is the subclass of ``BaseHTMLMailRenderer``. + + .. py:attribute:: BaseHTMLMailRenderer.event + + The default constructor sets this property to the event we are currently + working for. + + .. autoattribute:: identifier + + This is an abstract attribute, you **must** override this! + + .. autoattribute:: verbose_name + + This is an abstract attribute, you **must** override this! + + .. autoattribute:: thumbnail_filename + + This is an abstract attribute, you **must** override this! + + .. autoattribute:: is_available + + .. automethod:: render + + This is an abstract method, you **must** implement this! + +Helper class for template-base renderers +---------------------------------------- + +The email renderer that ships with pretix is based on Django templates to generate HTML. +In case you also want to render emails based on a template, we provided a ready-made base +class ``TemplateBasedMailRenderer`` that you can re-use to perform the following steps: + +* Convert the body text and the signature to HTML using our markdown renderer + +* Render the template + +* Call `inlinestyler`_ to convert all `` - - + table.layout > tr > td.header { + padding: 0 20px; + text-align: center; + } + + .header h2 { + margin-top: 20px; + margin-bottom: 10px; + font-size: 22px; + line-height: 26px; + } + + .header h1 { + margin-top: 0; + margin-bottom: 20px; + font-size: 26px; + line-height: 30px; + } + + .header h2 a, .header h1 a, .content h2 a, .content h3 a { + text-decoration: none; + } + + .content h2, .content h3 { + margin-bottom: 20px; + margin-top: 10px; + } + + a { + color: {{ color }}; + font-weight: bold; + } + + a:hover, a:focus { + color: {{ color }}; + text-decoration: underline; + } + + a:hover, a:active { + outline: 0; + } + + p { + margin: 0 0 10px; + + /* These are technically the same, but use both */ + overflow-wrap: break-word; + word-wrap: break-word; + + -ms-word-break: break-all; + /* This is the dangerous one in WebKit, as it breaks things wherever */ + word-break: break-all; + /* Instead use this non-standard one: */ + word-break: break-word; + + /* Adds a hyphen where the word breaks, if supported (No Blink) */ + -ms-hyphens: auto; + -moz-hyphens: auto; + -webkit-hyphens: auto; + hyphens: auto; + } + p:last-child { + margin-bottom: 0; + } + + .footer { + padding: 10px; + text-align: center; + font-size: 12px; + } + + .content { + padding: 0 18px; + } + + ::selection { + background: {{ color }}; + color: #FFF; + } + + table.layout { + width: 100%; + max-width: 600px; + border-spacing: 0px; + border-collapse: separate; + margin: auto; + } + + img.wide { + width: 100%; + height: auto; + } + + .content table { + width: 100%; + } + + .content table td { + vertical-align: top; + text-align: left; + padding: 0; + } + + a.button { + display: inline-block; + padding: 10px 16px; + font-size: 14px; + line-height: 1.33333; + border: 1px solid #cccccc; + border-radius: 6px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + margin: 5px; + text-decoration: none; + color: {{ color }}; + } + + {% block addcss %}{% endblock %} + + + + + +
+ - + + + + + {% include "pretixbase/email/separator.html" %} {% block content %} {% endblock %} + - +
- {% if event %} -

{{ event.name }}

- {% else %} -

{{ site }}

- {% endif %} +
+
+ + {% if event %} +

{{ event.name }} +

+ {% else %} +

{{ site }}

+ {% endif %} + {% block header %} +

{{ subject }}

+ {% endblock %} + +
+
+
+

+ diff --git a/src/pretix/base/templates/pretixbase/email/notification.html b/src/pretix/base/templates/pretixbase/email/notification.html index b0b48ecd2c..1f70849460 100644 --- a/src/pretix/base/templates/pretixbase/email/notification.html +++ b/src/pretix/base/templates/pretixbase/email/notification.html @@ -1,15 +1,20 @@ {% extends "pretixbase/email/base.html" %} {% load eventurl %} {% load i18n %} +{% block header %} +

+ {% if notification.url %}{% endif %} + {{ notification.title }} + {% if notification.url %}{% endif %} +

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

- {% if notification.url %}{% endif %} - {{ notification.title }} - {% if notification.url %}{% endif %} -

{% if notification.detail %}

{{ notification.detail }}

{% endif %} @@ -35,10 +40,17 @@

{% endif %}
+ + {% include "pretixbase/email/separator.html" %} +
{% trans "You receive these emails based on your notification settings." %}
@@ -48,6 +60,9 @@ {% trans "Click here disable all notifications immediately." %}
+ {% endblock %} diff --git a/src/pretix/base/templates/pretixbase/email/plainwrapper.html b/src/pretix/base/templates/pretixbase/email/plainwrapper.html index db8dc8eb49..264dac759a 100644 --- a/src/pretix/base/templates/pretixbase/email/plainwrapper.html +++ b/src/pretix/base/templates/pretixbase/email/plainwrapper.html @@ -4,17 +4,24 @@ {% block content %} +
{{ body|safe }}
+ {% if order %} - - - + {% include "pretixbase/email/separator.html" %} +
{% trans "You are receiving this email because you placed an order for the following event:" %}
{% trans "Event:" %} {{ event.name }}
@@ -24,18 +31,25 @@ {% trans "View order details" %}
+ {% endif %} {% if signature %} - - - + {% include "pretixbase/email/separator.html" %} +
{{ signature | safe }}
+ {% endif %} diff --git a/src/pretix/base/templates/pretixbase/email/separator.html b/src/pretix/base/templates/pretixbase/email/separator.html new file mode 100644 index 0000000000..e3a2073b08 --- /dev/null +++ b/src/pretix/base/templates/pretixbase/email/separator.html @@ -0,0 +1,15 @@ + + + + + + + + diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index a64a17897a..2d9a7a48f3 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -688,6 +688,11 @@ class MailSettingsForm(SettingsForm): ) }} ) + mail_html_renderer = forms.ChoiceField( + label=_("HTML mail renderer"), + required=True, + choices=[] + ) mail_text_order_placed = I18nFormField( label=_("Text"), @@ -850,6 +855,13 @@ class MailSettingsForm(SettingsForm): required=False ) + def __init__(self, *args, **kwargs): + event = kwargs.get('obj') + super().__init__(*args, **kwargs) + self.fields['mail_html_renderer'].choices = [ + (r.identifier, r.verbose_name) for r in event.get_html_mail_renderers().values() + ] + def clean(self): data = self.cleaned_data if not data.get('smtp_password') and data.get('smtp_username'): diff --git a/src/pretix/control/templates/pretixcontrol/event/mail.html b/src/pretix/control/templates/pretixcontrol/event/mail.html index 2e2350117a..6cdb0654bc 100644 --- a/src/pretix/control/templates/pretixcontrol/event/mail.html +++ b/src/pretix/control/templates/pretixcontrol/event/mail.html @@ -1,6 +1,7 @@ {% extends "pretixcontrol/event/settings_base.html" %} {% load i18n %} {% load bootstrap3 %} +{% load static %} {% block inside %}
@@ -13,6 +14,27 @@ {% bootstrap_field form.mail_text_signature layout="control" %} {% bootstrap_field form.mail_bcc layout="control" %} +
+ {% trans "E-mail design" %} +
+ {% for r in renderers.values %} +
+
+ + + + {% trans "Preview" %} + +
+
+ {% endfor %} +
+
{% trans "E-mail content" %}
diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index a62c02e50c..b6e99ee123 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -103,6 +103,8 @@ urlpatterns = [ name='event.settings.tickets.preview'), url(r'^settings/email$', event.MailSettings.as_view(), name='event.settings.mail'), url(r'^settings/email/preview$', event.MailSettingsPreview.as_view(), name='event.settings.mail.preview'), + url(r'^settings/email/layoutpreview$', event.MailSettingsRendererPreview.as_view(), + name='event.settings.mail.preview.layout'), url(r'^settings/invoice$', event.InvoiceSettings.as_view(), name='event.settings.invoice'), url(r'^settings/invoice/preview$', event.InvoicePreview.as_view(), name='event.settings.invoice.preview'), url(r'^settings/display', event.DisplaySettings.as_view(), name='event.settings.display'), diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 3e090b0003..8053566239 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -47,6 +47,7 @@ from pretix.control.forms.event import ( ) from pretix.control.permissions import EventPermissionRequiredMixin from pretix.control.signals import nav_event_settings +from pretix.helpers.database import rolledback_transaction from pretix.helpers.urls import build_absolute_uri from pretix.multidomain.urlreverse import get_domain from pretix.plugins.stripe.payment import StripeSettingsHolder @@ -462,6 +463,11 @@ class MailSettings(EventSettingsViewMixin, EventSettingsFormView): 'event': self.request.event.slug }) + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + ctx['renderers'] = self.request.event.get_html_mail_renderers() + return ctx + @transaction.atomic def post(self, request, *args, **kwargs): form = self.get_form() @@ -514,7 +520,8 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View): 'date': date_format(now() + timedelta(days=7), 'SHORT_DATE_FORMAT'), 'expire_date': date_format(now() + timedelta(days=15), 'SHORT_DATE_FORMAT'), 'payment_info': _('{} has been transferred to account <9999-9999-9999-9999> at {}').format( - money_filter(Decimal('42.23'), self.request.event.currency), date_format(now(), 'SHORT_DATETIME_FORMAT')) + money_filter(Decimal('42.23'), self.request.event.currency), + date_format(now(), 'SHORT_DATETIME_FORMAT')) } # create index-language mapping @@ -614,6 +621,36 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View): }) +class MailSettingsRendererPreview(MailSettingsPreview): + permission = 'can_change_event_settings' + + def post(self, request, *args, **kwargs): + return HttpResponse(status=405) + + def get(self, request, *args, **kwargs): + v = str(request.event.settings.mail_text_order_placed) + v = v.format_map(self.placeholders('mail_text_order_placed')) + renderers = request.event.get_html_mail_renderers() + if request.GET.get('renderer') in renderers: + with rolledback_transaction(): + order = request.event.orders.create(status=Order.STATUS_PENDING, datetime=now(), + expires=now(), code="PREVIEW", total=119) + item = request.event.items.create(name=ugettext("Sample product"), default_price=42.23, + description=ugettext("Sample product description")) + order.positions.create(item=item, attendee_name=ugettext("John Doe"), price=item.default_price) + v = renderers[request.GET.get('renderer')].render( + v, + str(request.event.settings.mail_text_signature), + ugettext('Your order: %(code)s') % {'code': order.code}, + order + ) + r = HttpResponse(v, content_type='text/html') + r._csp_ignore = True + return r + else: + raise Http404(_('Unknown e-mail renderer.')) + + class TicketSettingsPreview(EventPermissionRequiredMixin, View): permission = 'can_change_event_settings' @@ -1169,7 +1206,8 @@ class QuickSetupView(FormView): data={'plugin': 'pretix.plugins.banktransfer'}) plugins_active.append('pretix.plugins.banktransfer') self.request.event.settings.payment_banktransfer__enabled = True - self.request.event.settings.payment_banktransfer_bank_details = form.cleaned_data['payment_banktransfer_bank_details'] + self.request.event.settings.payment_banktransfer_bank_details = form.cleaned_data[ + 'payment_banktransfer_bank_details'] if form.cleaned_data.get('payment_stripe__enabled', None): if 'pretix.plugins.stripe' not in plugins_active: diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 2ac0352de1..108ad243a4 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -1286,7 +1286,7 @@ class OrderSendMail(EventPermissionRequiredMixin, OrderViewMixin, FormView): 'invoice_company': invoice_company, } email_template = LazyI18nString(form.cleaned_data['message']) - email_content = render_mail(email_template, email_context)[0] + email_content = render_mail(email_template, email_context) if self.request.POST.get('action') == 'preview': self.preview_output = [] self.preview_output.append( diff --git a/src/pretix/static/pretixbase/email/divider.png b/src/pretix/static/pretixbase/email/divider.png new file mode 100644 index 0000000000000000000000000000000000000000..45ec64c0e15d6415da7a8708436dd62730adf801 GIT binary patch literal 349 zcmeAS@N?(olHy`uVBq!ia0y~yV2S{;HCUK|-L1P+nfHmzkGcoSayYs+V7sKKq@G6i|_F zfKQ0)yLa#2zkmPX!-tO_KYsf3>C2ZdU%!6+{{8!pA3uKn{Q2wGuRnkO{Qdj)-@kwV z|Nm#%`MeIOagnEsV@Srmw^t9YZFFRCyBP1};=->L&?ObJphbM?3I|@Vi5(prrZ?`j z9=+{pasSh~v?4L%!}{?hfA$G^D#vaFp} z=R1GN{mbrqFBq}6fARfgRy%*6m;KW7m-Sy>{u2Gm;;-Qzd7y5)=BGEmNgrxr1scHu jG8D*Q0-OHzb2Z~+tI&o!7fLFDu4V9a^>bP0l+XkKy + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/pretix/static/pretixbase/email/foot.png b/src/pretix/static/pretixbase/email/foot.png new file mode 100644 index 0000000000000000000000000000000000000000..a9efb6555adc1658862cdd9df5a67ece0ae1aeca GIT binary patch literal 1130 zcmeAS@N?(olHy`uVBq!ia0y~yV2S{;Z8+F~~}U&3=GWA zJzX3_D(1YsdpGZqhXC7!O}s6I_x}5`H`iC|hdoRyGx9!maM^DePR(-7m3qH|OM^o+ zmx?ejtXXz%7Xw4X9S)$=w1qb?FodZkFfy$1Il#maaWnBX6N8e{wA9Yj$fSACf8Q4r z)Li;oU1`y(RUmTR>lLr9W-Z(KpLc^PBX`BFDM3D$MIKumGx6Q1jqGu1ZYfN>4WszRCMdC!;sd%rC6QH9MtX7K~%!W$a$H|u!w92Tg( ze}Da-ZDH3-=lCtRnCo}Zlyxs#a=J8oB#Oj+uYYd4L%$Z2jXAzklz((|HgK)DV5x;KdYS}KFTT7qNZpEajH&rEWx1RB+mdCF{AW>=!bHa+GFB}Q(p zN8dkfOYUM#72L2u02nZvbfTvRu1Ssb*|m#pe4hNl7>7BD=vxOHP6^JklA zJFZp`Urqh@Lh%4LMsB0+I^Fqv?@pNb-aF*T$f9#%PW#p0i`6IC1EroD+?Tg){KFYB zVPoYy+r0aVwP23n)`d-(P?*#I4;*!~SF&#=J= sXlRPoC#x@9pHvbY+hlHm4f)R?XrO*?PIuF9V7b8H>FVdQ&MBb@02)~HZvX%Q literal 0 HcmV?d00001 diff --git a/src/pretix/static/pretixbase/email/foot.svg b/src/pretix/static/pretixbase/email/foot.svg new file mode 100644 index 0000000000..9874f35704 --- /dev/null +++ b/src/pretix/static/pretixbase/email/foot.svg @@ -0,0 +1,75 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/pretix/static/pretixbase/email/head.png b/src/pretix/static/pretixbase/email/head.png new file mode 100644 index 0000000000000000000000000000000000000000..5b0dc3a7e5cb7634aa6c78a8f006f0cf31cd12d6 GIT binary patch literal 575 zcmV-F0>J%=P)eSaefwW^{L9a%BK_cXuvnZfkR6VQ^(G zZ*pgw?mQX*00F;AL_t(|+U?uXZi6rkh2g#b!!9Hc0|_L%->MD@wuJnjH>mZgIdRjk z?lS4yEXn7DzkGh|(GJ!KEJvB_U`@aR7O;SIE!hrM29~3U9V`KsqpWtYR$w_wwS!fG zmmftkBx9_0=%X135QD8mkFq94~=ZWmxfu)gM zp=N~*SnemFQL_qD1(w1BeqpA->izb|q%#u*mcrFAGf!YC$ifw{G)_ZdmcUYI@bq?I z{oXpBy@QXH$pP!1 zET{h!Hn3y>)}g9(>V6nkCI+m7DTfclL}v%qne6j{udPAYTmkEJs=T!og?FOB`gHwJ zB)!;eg(QXb0p; N002ovPDHLkV1lYI0B8UJ literal 0 HcmV?d00001 diff --git a/src/pretix/static/pretixbase/email/head.svg b/src/pretix/static/pretixbase/email/head.svg new file mode 100644 index 0000000000..6100087c5b --- /dev/null +++ b/src/pretix/static/pretixbase/email/head.svg @@ -0,0 +1,75 @@ + + + + + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/pretix/static/pretixbase/email/thumb.png b/src/pretix/static/pretixbase/email/thumb.png new file mode 100644 index 0000000000000000000000000000000000000000..813b47b668bb8e73b81be19a01a70aed7e6a80de GIT binary patch literal 43180 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 literal 0 HcmV?d00001 diff --git a/src/pretix/static/pretixcontrol/scss/_forms.scss b/src/pretix/static/pretixcontrol/scss/_forms.scss index 3ebb48b734..839f6d9174 100644 --- a/src/pretix/static/pretixcontrol/scss/_forms.scss +++ b/src/pretix/static/pretixcontrol/scss/_forms.scss @@ -354,3 +354,15 @@ table td > .checkbox input[type="checkbox"] { top: 2px; } } +.maildesignpreview { + label { + display: block; + } + img { + display: block; + width: 90%; + margin: 10px auto; + height: auto; + box-shadow: 0 1px 3px 0 #aaa; + } +}