diff --git a/src/pretix/plugins/sendmail/forms.py b/src/pretix/plugins/sendmail/forms.py
index efe5e699e6..9ab765f49c 100644
--- a/src/pretix/plugins/sendmail/forms.py
+++ b/src/pretix/plugins/sendmail/forms.py
@@ -19,7 +19,8 @@ class MailForm(forms.Form):
)
self.fields['message'] = I18nFormField(
widget=I18nTextarea, required=True,
- langcodes=event.settings.get('locales')
+ langcodes=event.settings.get('locales'),
+ help_text=_("Available placeholders: {due_date}, {event}, {order}, {order_date}, {order_url}")
)
choices = list(Order.STATUS_CHOICE)
if not event.settings.get('payment_term_expire_automatically', as_type=bool):
diff --git a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html
index 5a3d63fd05..1d0f9fae0c 100644
--- a/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html
+++ b/src/pretix/plugins/sendmail/templates/pretixplugins/sendmail/send_form.html
@@ -10,7 +10,28 @@
{% bootstrap_field form.sendto layout='horizontal' %}
{% bootstrap_field form.subject layout='horizontal' %}
{% bootstrap_field form.message layout='horizontal' %}
+ {% if request.method == "POST" %}
+
+ {% endif %}
+
@@ -18,4 +39,3 @@
{% endblock %}
{% endblock %}
-
diff --git a/src/pretix/plugins/sendmail/views.py b/src/pretix/plugins/sendmail/views.py
index 84590f46a2..e19f5a522f 100644
--- a/src/pretix/plugins/sendmail/views.py
+++ b/src/pretix/plugins/sendmail/views.py
@@ -1,15 +1,20 @@
import logging
+from datetime import timedelta
+import pytz
from django.contrib import messages
from django.db.models import Q
from django.shortcuts import redirect
+from django.utils.formats import date_format
from django.utils.timezone import now
from django.utils.translation import ugettext_lazy as _
from django.views.generic import FormView
+from pretix.base.i18n import language
from pretix.base.models import Order
from pretix.base.services.mail import SendMailException, mail
from pretix.control.permissions import EventPermissionRequiredMixin
+from pretix.multidomain.urlreverse import build_absolute_uri
from . import forms
@@ -36,13 +41,44 @@ class SenderView(EventPermissionRequiredMixin, FormView):
self.request.event.log_action('pretix.plugins.sendmail.sent', user=self.request.user, data=dict(
form.cleaned_data))
+ tz = pytz.timezone(self.request.event.settings.timezone)
+
failures = []
+ self.output = {}
for o in orders:
- try:
- mail(o.email, form.cleaned_data['subject'], form.cleaned_data['message'],
- None, self.request.event, locale=o.locale, order=o)
- except SendMailException:
- failures.append(o.email)
+ if self.request.POST.get("action") == "preview":
+ for l in self.request.event.settings.locales:
+ with language(l):
+ self.output[l] = []
+ self.output[l].append(_('Subject: {subject}').format(subject=form.cleaned_data['subject'].localize(l)))
+ message = form.cleaned_data['message'].localize(l)
+ preview_text = message.format(
+ order='ORDER1234',
+ event=self.request.event.name,
+ order_date=date_format(now(), 'SHORT_DATE_FORMAT'),
+ due_date=date_format(now() + timedelta(days=7), 'SHORT_DATE_FORMAT'),
+ order_url=build_absolute_uri(self.request.event, 'presale:event.order', kwargs={
+ 'order': 'ORDER1234',
+ 'secret': 'longrandomsecretabcdef123456'
+ }))
+ self.output[l].append(preview_text)
+ return self.get(self.request, *self.args, **self.kwargs)
+ else:
+ try:
+ with language(o.locale):
+ mail(o.email, form.cleaned_data['subject'], form.cleaned_data['message'],
+ {
+ 'event': o.event,
+ 'order': o.code,
+ 'order_date': date_format(o.datetime.astimezone(tz), 'SHORT_DATETIME_FORMAT'),
+ 'due_date': date_format(o.expires, 'SHORT_DATE_FORMAT'),
+ 'order_url': build_absolute_uri(o.event, 'presale:event.order', kwargs={
+ 'order': 'ORDER1234',
+ 'secret': 'longrandomsecretabcdef123456'
+ })},
+ self.request.event, locale=o.locale, order=o)
+ except SendMailException:
+ failures.append(o.email)
if failures:
messages.error(self.request, _('Failed to send mails to the following users: {}'.format(' '.join(failures))))
@@ -54,3 +90,8 @@ class SenderView(EventPermissionRequiredMixin, FormView):
event=self.request.event.slug,
organizer=self.request.event.organizer.slug
)
+
+ def get_context_data(self, *args, **kwargs):
+ ctx = super().get_context_data(*args, **kwargs)
+ ctx['output'] = getattr(self, 'output', None)
+ return ctx