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" %} +
+ {% trans "E-mail preview" %} + +
+ {% for locale, segments in output.items %} +

+ {% blocktrans %}For locale: {{ locale }}{% endblocktrans %} +

+ {% for value in segments %} +

+ {{ value|linebreaksbr }} +

+ {% endfor %} + {% endfor %} +
+
+ {% 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