diff --git a/src/pretix/base/services/mail.py b/src/pretix/base/services/mail.py index d5c2765f12..e3c71f8cb5 100644 --- a/src/pretix/base/services/mail.py +++ b/src/pretix/base/services/mail.py @@ -11,7 +11,7 @@ from django.utils.translation import ugettext as _ from inlinestyler.utils import inline_css from pretix.base.i18n import LazyI18nString, language -from pretix.base.models import Event, Order +from pretix.base.models import Event, InvoiceAddress, Order from pretix.celery_app import app from pretix.multidomain.urlreverse import build_absolute_uri @@ -43,7 +43,7 @@ def mail(email: str, subject: str, template: str, :param template: The filename of a template to be used. It will be rendered with the locale given in the locale argument and the context given in the next argument. Alternatively, you can pass a LazyI18nString and - ``context`` will be used as the argument to a Python ``.format()`` call on the template. + ``context`` will be used as the argument to a Python ``.format_map()`` call on the template. :param context: The context for rendering the template (see ``template`` parameter) @@ -64,6 +64,17 @@ def mail(email: str, subject: str, template: str, return with language(locale): + if isinstance(context, dict) and order: + try: + context.update({ + 'invoice_name': order.invoice_address.name, + 'invoice_company': order.invoice_address.company + }) + except InvoiceAddress.DoesNotExist: + context.update({ + 'invoice_name': '', + 'invoice_company': '' + }) if isinstance(template, LazyI18nString): body = str(template) if context: diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 3c52383cf0..87e659cd63 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -106,6 +106,12 @@ def mark_order_paid(order: Order, provider: str=None, info: str=None, date: date if send_mail: with language(order.locale): + try: + invoice_name = order.invoice_address.name + invoice_company = order.invoice_address.company + except InvoiceAddress.DoesNotExist: + invoice_name = "" + invoice_company = "" mail( order.email, _('Payment received for your order: %(code)s') % {'code': order.code}, order.event.settings.mail_text_order_paid, @@ -115,7 +121,9 @@ def mark_order_paid(order: Order, provider: str=None, info: str=None, date: date 'order': order.code, 'secret': order.secret }), - 'downloads': order.event.settings.get('ticket_download', as_type=bool) + 'downloads': order.event.settings.get('ticket_download', as_type=bool), + 'invoice_name': invoice_name, + 'invoice_company': invoice_company, }, order.event, locale=order.locale ) @@ -363,6 +371,14 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str], mailtext = event.settings.mail_text_order_free else: mailtext = event.settings.mail_text_order_placed + + try: + invoice_name = order.invoice_address.name + invoice_company = order.invoice_address.company + except InvoiceAddress.DoesNotExist: + invoice_name = "" + invoice_company = "" + mail( order.email, _('Your order: %(code)s') % {'code': order.code}, mailtext, @@ -375,7 +391,9 @@ def _perform_order(event: str, payment_provider: str, position_ids: List[str], 'order': order.code, 'secret': order.secret }), - 'paymentinfo': str(pprov.order_pending_mail_render(order)) + 'paymentinfo': str(pprov.order_pending_mail_render(order)), + 'invoice_name': invoice_name, + 'invoice_company': invoice_company, }, event, locale=order.locale ) @@ -413,6 +431,12 @@ def send_expiry_warnings(sender, **kwargs): if days and (o.expires - today).days <= days: o.expiry_reminder_sent = True o.save() + try: + invoice_name = o.invoice_address.name + invoice_company = o.invoice_address.company + except InvoiceAddress.DoesNotExist: + invoice_name = "" + invoice_company = "" try: mail( o.email, _('Your order is about to expire: %(code)s') % {'code': o.code}, @@ -423,7 +447,9 @@ def send_expiry_warnings(sender, **kwargs): 'order': o.code, 'secret': o.secret }), - 'expire_date': date_format(o.expires, 'SHORT_DATE_FORMAT') + 'expire_date': date_format(o.expires, 'SHORT_DATE_FORMAT'), + 'invoice_name': invoice_name, + 'invoice_company': invoice_company, }, o.event, locale=o.locale ) @@ -557,6 +583,12 @@ class OrderChangeManager: def _notify_user(self): with language(self.order.locale): + try: + invoice_name = self.order.invoice_address.name + invoice_company = self.order.invoice_address.company + except InvoiceAddress.DoesNotExist: + invoice_name = "" + invoice_company = "" mail( self.order.email, _('Your order has been changed: %(code)s') % {'code': self.order.code}, self.order.event.settings.mail_text_order_changed, @@ -566,6 +598,8 @@ class OrderChangeManager: 'order': self.order.code, 'secret': self.order.secret }), + 'invoice_name': invoice_name, + 'invoice_company': invoice_company, }, self.order.event, locale=self.order.locale ) diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 4e7c92086b..e30876361c 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -378,31 +378,32 @@ class MailSettingsForm(SettingsForm): label=_("Text"), required=False, widget=I18nTextarea, - help_text=_("Available placeholders: {event}, {total}, {currency}, {date}, {paymentinfo}, {url}") + help_text=_("Available placeholders: {event}, {total}, {currency}, {date}, {paymentinfo}, {url}, " + "{invoice_name}, {invoice_company}") ) mail_text_order_paid = I18nFormField( label=_("Text"), required=False, widget=I18nTextarea, - help_text=_("Available placeholders: {event}, {url}") + help_text=_("Available placeholders: {event}, {url}, {invoice_name}, {invoice_company}") ) mail_text_order_free = I18nFormField( label=_("Text"), required=False, widget=I18nTextarea, - help_text=_("Available placeholders: {event}, {url}") + help_text=_("Available placeholders: {event}, {url}, {invoice_name}, {invoice_company}") ) mail_text_order_changed = I18nFormField( label=_("Text"), required=False, widget=I18nTextarea, - help_text=_("Available placeholders: {event}, {url}") + help_text=_("Available placeholders: {event}, {url}, {invoice_name}, {invoice_company}") ) mail_text_resend_link = I18nFormField( label=_("Text (sent by admin)"), required=False, widget=I18nTextarea, - help_text=_("Available placeholders: {event}, {url}") + help_text=_("Available placeholders: {event}, {url}, {invoice_name}, {invoice_company}") ) mail_text_resend_all_links = I18nFormField( label=_("Text (requested by user)"), @@ -421,7 +422,7 @@ class MailSettingsForm(SettingsForm): label=_("Text"), required=False, widget=I18nTextarea, - help_text=_("Available placeholders: {event}, {url}, {expire_date}") + help_text=_("Available placeholders: {event}, {url}, {expire_date}, {invoice_name}, {invoice_company}") ) smtp_use_custom = forms.BooleanField( label=_("Use custom SMTP server"), diff --git a/src/pretix/control/views/orders.py b/src/pretix/control/views/orders.py index 61cd4c233a..e058b9e8ea 100644 --- a/src/pretix/control/views/orders.py +++ b/src/pretix/control/views/orders.py @@ -12,8 +12,8 @@ from django.views.generic import DetailView, ListView, TemplateView, View from pretix.base.i18n import language from pretix.base.models import ( - CachedFile, CachedTicket, Invoice, Item, ItemVariation, Order, Quota, - generate_position_secret, generate_secret, + CachedFile, CachedTicket, Invoice, InvoiceAddress, Item, ItemVariation, + Order, Quota, generate_position_secret, generate_secret, ) from pretix.base.services.export import export from pretix.base.services.invoices import ( @@ -323,6 +323,12 @@ class OrderResendLink(OrderView): def post(self, *args, **kwargs): with language(self.order.locale): try: + try: + invoice_name = self.order.invoice_address.name + invoice_company = self.order.invoice_address.company + except InvoiceAddress.DoesNotExist: + invoice_name = "" + invoice_company = "" mail( self.order.email, _('Your order: %(code)s') % {'code': self.order.code}, self.order.event.settings.mail_text_resend_link, @@ -332,6 +338,8 @@ class OrderResendLink(OrderView): 'order': self.order.code, 'secret': self.order.secret }), + 'invoice_name': invoice_name, + 'invoice_company': invoice_company, }, self.order.event, locale=self.order.locale ) diff --git a/src/pretix/plugins/sendmail/forms.py b/src/pretix/plugins/sendmail/forms.py index 9ab765f49c..b6bdb63c17 100644 --- a/src/pretix/plugins/sendmail/forms.py +++ b/src/pretix/plugins/sendmail/forms.py @@ -20,7 +20,8 @@ class MailForm(forms.Form): self.fields['message'] = I18nFormField( widget=I18nTextarea, required=True, langcodes=event.settings.get('locales'), - help_text=_("Available placeholders: {due_date}, {event}, {order}, {order_date}, {order_url}") + help_text=_("Available placeholders: {due_date}, {event}, {order}, {order_date}, {order_url}, " + "{invoice_name}, {invoice_company}") ) choices = list(Order.STATUS_CHOICE) if not event.settings.get('payment_term_expire_automatically', as_type=bool):