diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index 97d3f29186..97a7e70972 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -97,6 +97,19 @@ DEFAULTS = { 'default': settings.MAIL_FROM, 'type': str }, + 'mail_text_resend_link': { + 'type': LazyI18nString, + 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, + +you receive this message because you asked us to send you the link +to your order for {event}. + +You can change your order details and view the status of your order at +{url} + +Best regards, +Your {event} team""")) + }, 'mail_text_order_placed': { 'type': LazyI18nString, 'default': LazyI18nString.from_gettext(ugettext_noop("""Hello, diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index b22501e0dc..44f0b7e116 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -212,6 +212,12 @@ class MailSettingsForm(SettingsForm): widget=I18nTextarea, help_text=_("Available placeholders: {event}, {url}") ) + mail_text_order_resend = I18nFormField( + label=_("Resend link"), + required=False, + widget=I18nTextarea, + help_text=_("Available placeholders: {event}, {url}") + ) smtp_use_custom = forms.BooleanField( label=_("Use custom SMTP server"), help_text=_("All mail related to your event will be sent over the smtp server specified by you."), diff --git a/src/pretix/control/templates/pretixcontrol/order/index.html b/src/pretix/control/templates/pretixcontrol/order/index.html index 9c985d6e71..3fd1033b21 100644 --- a/src/pretix/control/templates/pretixcontrol/order/index.html +++ b/src/pretix/control/templates/pretixcontrol/order/index.html @@ -37,7 +37,7 @@ {% if can_download %} {% for b in download_buttons %} + class="btn btn-default"> {{ b.text }} {% endfor %} @@ -67,7 +67,16 @@
{{ order.expires }}
{% endif %}
{% trans "User" %}
-
{{ order.email }}
+
+ {{ order.email }}   +
+ {% csrf_token %} + +
+
@@ -86,7 +95,7 @@ – {{ line.variation }} {% endif %} {% if line.voucher %} -
{% trans "Voucher code used:" %} +
{% trans "Voucher code used:" %} {{ line.voucher.code }} @@ -95,11 +104,13 @@
{% if line.item.admission and event.settings.attendee_names_asked %}
{% trans "Attendee name" %}
-
{% if line.attendee_name %}{{ line.attendee_name }}{% else %}{% trans "not answered" %}{% endif %}
+
{% if line.attendee_name %}{{ line.attendee_name }}{% else %} + {% trans "not answered" %}{% endif %}
{% endif %} {% for q in line.questions %}
{{ q.question }}
-
{% if q.answer %}{{ q.answer }}{% else %}{% trans "not answered" %}{% endif %}
+
{% if q.answer %}{{ q.answer }}{% else %} + {% trans "not answered" %}{% endif %}
{% endfor %}
{% endif %} @@ -113,9 +124,10 @@
{{ event.currency }} {{ line.total|floatformat:2 }} {% if line.item.tax_rate %} -
{% blocktrans trimmed with rate=line.item.tax_rate %} - incl. {{ rate }}% taxes - {% endblocktrans %} +
+ {% blocktrans trimmed with rate=line.item.tax_rate %} + incl. {{ rate }}% taxes + {% endblocktrans %} {% endif %}
diff --git a/src/pretix/control/urls.py b/src/pretix/control/urls.py index 34b562734e..dfb2e49191 100644 --- a/src/pretix/control/urls.py +++ b/src/pretix/control/urls.py @@ -61,6 +61,8 @@ urlpatterns = [ url(r'^vouchers/add$', vouchers.VoucherCreate.as_view(), name='event.vouchers.add'), url(r'^orders/(?P[0-9A-Z]+)/transition$', orders.OrderTransition.as_view(), name='event.order.transition'), + url(r'^orders/(?P[0-9A-Z]+)/resend$', orders.OrderResendLink.as_view(), + name='event.order.resendlink'), url(r'^orders/(?P[0-9A-Z]+)/extend$', orders.OrderExtend.as_view(), name='event.order.extend'), url(r'^orders/(?P[0-9A-Z]+)/$', orders.OrderDetail.as_view(), name='event.order'), diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index c533636596..40c3d40e81 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -17,6 +17,7 @@ from pretix.base.models import ( ) from pretix.base.services import tickets from pretix.base.services.export import export +from pretix.base.services.mail import mail from pretix.base.services.orders import cancel_order, mark_order_paid from pretix.base.services.stats import order_overview from pretix.base.signals import ( @@ -25,6 +26,7 @@ from pretix.base.signals import ( ) from pretix.control.forms.orders import ExtendForm from pretix.control.permissions import EventPermissionRequiredMixin +from pretix.multidomain.urlreverse import build_absolute_uri class OrderList(EventPermissionRequiredMixin, ListView): @@ -198,6 +200,27 @@ class OrderTransition(OrderView): return HttpResponseNotAllowed(['POST']) +class OrderResendLink(OrderView): + permission = 'can_change_orders' + + def post(self, *args, **kwargs): + mail( + self.order.email, _('Your order: %(code)s') % {'code': self.order.code}, + self.order.event.settings.mail_text_resend_link, + { + 'event': self.order.event.name, + 'url': build_absolute_uri(self.order.event, 'presale:event.order', kwargs={ + 'order': self.order.code, + 'secret': self.order.secret + }), + }, + self.order.event, locale=self.order.locale + ) + messages.success(self.request, _('The order has been marked as paid.')) + self.order.log_action('pretix.base.order.resend', user=self.request.user) + return redirect(self.get_order_url()) + + class OrderDownload(OrderView): @cached_property