From fb53beee2d4b8fb813be5d25a956f7fcc9a7d737 Mon Sep 17 00:00:00 2001 From: Martin Gross Date: Mon, 8 Jul 2019 10:21:27 +0200 Subject: [PATCH] Option to notify users when questions have been changed in backend --- src/pretix/base/services/orders.py | 61 ++++++++++--------- .../pretixcontrol/order/change_questions.html | 18 ++++++ src/pretix/control/views/orders.py | 18 +++++- 3 files changed, 66 insertions(+), 31 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 822b8931e..6870ba676 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -979,6 +979,35 @@ def send_download_reminders(sender, **kwargs): logger.exception('Reminder email could not be sent to attendee') +def notify_user_changed_order(order, user=None, auth=None): + with language(order.locale): + try: + invoice_name = order.invoice_address.name + invoice_company = order.invoice_address.company + except InvoiceAddress.DoesNotExist: + invoice_name = "" + invoice_company = "" + email_template = order.event.settings.mail_text_order_changed + email_context = { + 'event': order.event.name, + 'url': build_absolute_uri(order.event, 'presale:event.order.open', kwargs={ + 'order': order.code, + 'secret': order.secret, + 'hash': order.email_confirm_hash() + }), + 'invoice_name': invoice_name, + 'invoice_company': invoice_company, + } + email_subject = _('Your order has been changed: %(code)s') % {'code': order.code} + try: + order.send_mail( + email_subject, email_template, email_context, + 'pretix.event.order.email.order_changed', user, auth=auth + ) + except SendMailException: + logger.exception('Order changed email could not be sent') + + class OrderChangeManager: error_messages = { 'product_without_variation': _('You need to select a variation of the product.'), @@ -1509,34 +1538,6 @@ class OrderChangeManager: except InvoiceAddress.DoesNotExist: return None - def _notify_user(self, order): - with language(order.locale): - try: - invoice_name = order.invoice_address.name - invoice_company = order.invoice_address.company - except InvoiceAddress.DoesNotExist: - invoice_name = "" - invoice_company = "" - email_template = order.event.settings.mail_text_order_changed - email_context = { - 'event': order.event.name, - 'url': build_absolute_uri(self.order.event, 'presale:event.order.open', kwargs={ - 'order': order.code, - 'secret': order.secret, - 'hash': order.email_confirm_hash() - }), - 'invoice_name': invoice_name, - 'invoice_company': invoice_company, - } - email_subject = _('Your order has been changed: %(code)s') % {'code': order.code} - try: - order.send_mail( - email_subject, email_template, email_context, - 'pretix.event.order.email.order_changed', self.user, auth=self.auth - ) - except SendMailException: - logger.exception('Order changed email could not be sent') - def commit(self, check_quotas=True): if self._committed: # an order change can only be committed once @@ -1567,9 +1568,9 @@ class OrderChangeManager: self._check_paid_to_free() if self.notify: - self._notify_user(self.order) + notify_user_changed_order(self.order, self.user, self.auth) if self.split_order: - self._notify_user(self.split_order) + notify_user_changed_order(self.split_order, self.user, self.auth) order_changed.send(self.order.event, order=self.order) diff --git a/src/pretix/control/templates/pretixcontrol/order/change_questions.html b/src/pretix/control/templates/pretixcontrol/order/change_questions.html index 4322b416d..02c76e7ba 100644 --- a/src/pretix/control/templates/pretixcontrol/order/change_questions.html +++ b/src/pretix/control/templates/pretixcontrol/order/change_questions.html @@ -59,6 +59,24 @@ {% endfor %} +
+
+

+ {% trans "Other operations" %} +

+
+
+
+ {% bootstrap_form_errors other_form %} + {% if other_form.custom_error %} +
+ {{ other_form.custom_error }} +
+ {% endif %} + {% bootstrap_field other_form.notify layout="control" %} +
+
+
diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index af3e1a06a..16e25fa9e 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -55,6 +55,7 @@ from pretix.base.services.mail import SendMailException, render_mail from pretix.base.services.orders import ( OrderChangeManager, OrderError, approve_order, cancel_order, deny_order, extend_order, mark_order_expired, mark_order_refunded, + notify_user_changed_order, ) from pretix.base.services.stats import order_overview from pretix.base.services.tickets import generate @@ -1319,12 +1320,27 @@ class OrderModifyInformation(OrderQuestionsViewMixin, OrderView): only_user_visible = False all_optional = True + def get_context_data(self, **kwargs): + ctx = super().get_context_data(**kwargs) + ctx['other_form'] = self.other_form + return ctx + + @cached_property + def other_form(self): + return OtherOperationsForm(prefix='other', order=self.order, + data=self.request.POST if self.request.method == "POST" else None) + def post(self, request, *args, **kwargs): - failed = not self.save() or not self.invoice_form.is_valid() + failed = not self.save() or not self.invoice_form.is_valid() or not self.other_form.is_valid() + notify = self.other_form.cleaned_data['notify'] if self.other_form.is_valid() else True if failed: messages.error(self.request, _("We had difficulties processing your input. Please review the errors below.")) return self.get(request, *args, **kwargs) + + if notify: + notify_user_changed_order(self.order) + if hasattr(self.invoice_form, 'save'): self.invoice_form.save() self.order.log_action('pretix.event.order.modified', {