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
This commit is contained in:
Raphael Michel
2018-08-16 12:01:23 +02:00
committed by GitHub
parent be3b890e2f
commit 4db4790270
27 changed files with 833 additions and 185 deletions

View File

@@ -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'):

View File

@@ -1,6 +1,7 @@
{% extends "pretixcontrol/event/settings_base.html" %}
{% load i18n %}
{% load bootstrap3 %}
{% load static %}
{% block inside %}
<form action="" method="post" class="form-horizontal" enctype="multipart/form-data"
mail-preview-url="{% url "control:event.settings.mail.preview" event=request.event.slug organizer=request.event.organizer.slug %}">
@@ -13,6 +14,27 @@
{% bootstrap_field form.mail_text_signature layout="control" %}
{% bootstrap_field form.mail_bcc layout="control" %}
</fieldset>
<fieldset>
<legend>{% trans "E-mail design" %}</legend>
<div class="row">
{% for r in renderers.values %}
<div class="col-md-3">
<div class="well maildesignpreview text-center">
<label class="radio">
<input type="radio" name="mail_html_renderer" value="{{ r.identifier }}"
{% if request.event.settings.mail_html_renderer == r.identifier %}checked{% endif %}>
{{ r.verbose_name }}
</label>
<img src="{% static r.thumbnail_filename %}">
<a class="btn btn-default btn-sm" target="_blank"
href="{% url "control:event.settings.mail.preview.layout" event=request.event.slug organizer=request.event.organizer.slug %}?renderer={{ r.identifier }}">
{% trans "Preview" %}
</a>
</div>
</div>
{% endfor %}
</div>
</fieldset>
<fieldset>
<legend>{% trans "E-mail content" %}</legend>
<div class="panel-group" id="questions_group">

View File

@@ -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'),

View File

@@ -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:

View File

@@ -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(