Add option to send emails to attendees (#1833)

This commit is contained in:
julia-luna
2020-10-26 10:31:45 +01:00
committed by GitHub
parent 58af025fd8
commit e61288ba67
5 changed files with 79 additions and 4 deletions

View File

@@ -517,6 +517,20 @@ class OrderMailForm(forms.Form):
self._set_field_placeholders('message', ['event', 'order']) self._set_field_placeholders('message', ['event', 'order'])
class OrderPositionMailForm(OrderMailForm):
def __init__(self, *args, **kwargs):
position = self.position = kwargs.pop('position')
super().__init__(*args, **kwargs)
self.fields['sendto'].initial = position.attendee_email
self.fields['message'] = forms.CharField(
label=_("Message"),
required=True,
widget=forms.Textarea,
initial=self.order.event.settings.mail_text_order_custom_mail.localize(self.order.locale),
)
self._set_field_placeholders('message', ['event', 'order', 'position'])
class OrderRefundForm(forms.Form): class OrderRefundForm(forms.Form):
action = forms.ChoiceField( action = forms.ChoiceField(
required=False, required=False,

View File

@@ -182,7 +182,7 @@
{{ order.email|default_if_none:"" }} {{ order.email|default_if_none:"" }}
{% if order.email and order.email_known_to_work %} {% if order.email and order.email_known_to_work %}
<span class="fa fa-check-circle text-success" data-toggle="tooltip" title="{% trans "We know that this email address works because the user clicked a link we sent them." %}"></span> <span class="fa fa-check-circle text-success" data-toggle="tooltip" title="{% trans "We know that this email address works because the user clicked a link we sent them." %}"></span>
{% endif %}&nbsp;&nbsp; {% endif %}
<a href="{% url "control:event.order.contact" event=request.event.slug organizer=request.event.organizer.slug code=order.code %}" class="btn btn-default btn-xs"> <a href="{% url "control:event.order.contact" event=request.event.slug organizer=request.event.organizer.slug code=order.code %}" class="btn btn-default btn-xs">
<span class="fa fa-edit"></span> <span class="fa fa-edit"></span>
</a> </a>
@@ -388,8 +388,12 @@
{{ line.attendee_email }} {{ line.attendee_email }}
{% if not line.addon_to %} {% if not line.addon_to %}
<form class="form-inline helper-display-inline" method="post" <form class="form-inline helper-display-inline" method="post"
action="{% url "control:event.order.resendlink" event=request.event.slug organizer=request.event.organizer.slug code=order.code position=line.pk %}"> action="{% url "control:event.order.resendlink" event=request.event.slug organizer=request.event.organizer.slug code=order.code position=line.pk %}">
{% csrf_token %} {% csrf_token %}
<a href="{% url "control:event.order.position.sendmail" event=request.event.slug organizer=request.event.organizer.slug code=order.code position=line.pk %}"
class="btn btn-default btn-xs">
<span class="fa fa-envelope-o"></span>
</a>
<button class="btn btn-default btn-xs"> <button class="btn btn-default btn-xs">
{% trans "Resend link" %} {% trans "Resend link" %}
</button> </button>

View File

@@ -253,6 +253,8 @@ urlpatterns = [
name='event.order.info'), name='event.order.info'),
url(r'^orders/(?P<code>[0-9A-Z]+)/sendmail$', orders.OrderSendMail.as_view(), url(r'^orders/(?P<code>[0-9A-Z]+)/sendmail$', orders.OrderSendMail.as_view(),
name='event.order.sendmail'), name='event.order.sendmail'),
url(r'^orders/(?P<code>[0-9A-Z]+)/(?P<position>[0-9A-Z]+)/sendmail$', orders.OrderPositionSendMail.as_view(),
name='event.order.position.sendmail'),
url(r'^orders/(?P<code>[0-9A-Z]+)/mail_history$', orders.OrderEmailHistory.as_view(), url(r'^orders/(?P<code>[0-9A-Z]+)/mail_history$', orders.OrderEmailHistory.as_view(),
name='event.order.mail_history'), name='event.order.mail_history'),
url(r'^orders/(?P<code>[0-9A-Z]+)/payments/(?P<payment>\d+)/cancel$', orders.OrderPaymentCancel.as_view(), url(r'^orders/(?P<code>[0-9A-Z]+)/payments/(?P<payment>\d+)/cancel$', orders.OrderPaymentCancel.as_view(),

View File

@@ -80,8 +80,8 @@ from pretix.control.forms.orders import (
CancelForm, CommentForm, ConfirmPaymentForm, EventCancelForm, ExporterForm, CancelForm, CommentForm, ConfirmPaymentForm, EventCancelForm, ExporterForm,
ExtendForm, MarkPaidForm, OrderContactForm, OrderFeeChangeForm, ExtendForm, MarkPaidForm, OrderContactForm, OrderFeeChangeForm,
OrderLocaleForm, OrderMailForm, OrderPositionAddForm, OrderLocaleForm, OrderMailForm, OrderPositionAddForm,
OrderPositionAddFormset, OrderPositionChangeForm, OrderRefundForm, OrderPositionAddFormset, OrderPositionChangeForm, OrderPositionMailForm,
OtherOperationsForm, OrderRefundForm, OtherOperationsForm,
) )
from pretix.control.permissions import EventPermissionRequiredMixin from pretix.control.permissions import EventPermissionRequiredMixin
from pretix.control.views import PaginationMixin from pretix.control.views import PaginationMixin
@@ -1783,6 +1783,57 @@ class OrderSendMail(EventPermissionRequiredMixin, OrderViewMixin, FormView):
return ctx return ctx
class OrderPositionSendMail(OrderSendMail):
form_class = OrderPositionMailForm
def get_form_kwargs(self):
kwargs = super().get_form_kwargs()
kwargs['position'] = get_object_or_404(
OrderPosition,
order__event=self.request.event,
order__code=self.kwargs['code'].upper(),
pk=self.kwargs['position'],
attendee_email__isnull=False
)
return kwargs
def form_valid(self, form):
position = get_object_or_404(
OrderPosition,
order__event=self.request.event,
order__code=self.kwargs['code'].upper(),
pk=self.kwargs['position'],
attendee_email__isnull=False
)
self.preview_output = {}
with language(position.order.locale):
email_context = get_email_context(event=position.order.event, order=position.order, position=position)
email_template = LazyI18nString(form.cleaned_data['message'])
email_subject = str(form.cleaned_data['subject']).format_map(TolerantDict(email_context))
email_content = render_mail(email_template, email_context)
if self.request.POST.get('action') == 'preview':
self.preview_output = {
'subject': _('Subject: {subject}').format(subject=email_subject),
'html': markdown_compile_email(email_content)
}
return self.get(self.request, *self.args, **self.kwargs)
else:
try:
position.send_mail(
form.cleaned_data['subject'],
email_template,
email_context,
'pretix.event.order.position.email.custom_sent',
self.request.user
)
messages.success(self.request,
_('Your message has been queued and will be sent to {}.'.format(position.attendee_email)))
except SendMailException:
messages.error(self.request,
_('Failed to send mail to the following user: {}'.format(position.attendee_email)))
return super(OrderSendMail, self).form_valid(form)
class OrderEmailHistory(EventPermissionRequiredMixin, OrderViewMixin, ListView): class OrderEmailHistory(EventPermissionRequiredMixin, OrderViewMixin, ListView):
template_name = 'pretixcontrol/order/mail_history.html' template_name = 'pretixcontrol/order/mail_history.html'
permission = 'can_view_orders' permission = 'can_view_orders'

View File

@@ -117,6 +117,8 @@ event_urls = [
"orders/ABC/refunds/1/process", "orders/ABC/refunds/1/process",
"orders/ABC/refunds/1/done", "orders/ABC/refunds/1/done",
"orders/ABC/delete", "orders/ABC/delete",
"orders/ABC/sendmail",
"orders/ABC/1/sendmail",
"orders/ABC/", "orders/ABC/",
"orders/", "orders/",
"orders/import/", "orders/import/",
@@ -290,6 +292,8 @@ event_permission_urls = [
("can_change_orders", "orders/FOO/delete", 302), ("can_change_orders", "orders/FOO/delete", 302),
("can_change_orders", "orders/FOO/comment", 405), ("can_change_orders", "orders/FOO/comment", 405),
("can_change_orders", "orders/FOO/locale", 200), ("can_change_orders", "orders/FOO/locale", 200),
("can_change_orders", "orders/FOO/sendmail", 200),
("can_change_orders", "orders/FOO/1/sendmail", 404),
("can_change_orders", "orders/import/", 200), ("can_change_orders", "orders/import/", 200),
("can_change_orders", "orders/import/0ab7b081-92d3-4480-82de-2f8b056fd32f/", 404), ("can_change_orders", "orders/import/0ab7b081-92d3-4480-82de-2f8b056fd32f/", 404),
("can_view_orders", "orders/FOO/answer/5/", 404), ("can_view_orders", "orders/FOO/answer/5/", 404),