From d35ad345d728956ca25ea9f13b2cfbab7012815c Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Wed, 20 Feb 2019 14:33:45 +0100 Subject: [PATCH] Allow to use event meta data in email templates --- src/pretix/base/models/orders.py | 3 +++ src/pretix/base/services/mail.py | 4 ++++ src/pretix/control/forms/event.py | 7 +++++++ src/pretix/control/views/event.py | 17 ++++++++++++++--- 4 files changed, 28 insertions(+), 3 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 283f84e45c..0d7f8494f2 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -661,6 +661,9 @@ class Order(LockModel, LoggedModel): if not self.email: return + for k, v in self.event.meta_data.items(): + context['meta_' + k] = v + with language(self.locale): recipient = self.email try: diff --git a/src/pretix/base/services/mail.py b/src/pretix/base/services/mail.py index 529b369ef3..65f32479d4 100644 --- a/src/pretix/base/services/mail.py +++ b/src/pretix/base/services/mail.py @@ -79,6 +79,10 @@ def mail(email: str, subject: str, template: Union[str, LazyI18nString], headers = headers or {} with language(locale): + if isinstance(context, dict) and event: + for k, v in event.meta_data.items(): + context['meta_' + k] = v + if isinstance(context, dict) and order: try: context.update({ diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index d001dfb485..5f7f300bde 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -973,6 +973,13 @@ class MailSettingsForm(SettingsForm): self.fields['mail_html_renderer'].choices = [ (r.identifier, r.verbose_name) for r in event.get_html_mail_renderers().values() ] + keys = list(event.meta_data.keys()) + for k, v in self.fields.items(): + if k.startswith('mail_text_'): + v.help_text = str(v.help_text) + ', ' + ', '.join({ + '{meta_' + p + '}' for p in keys + }) + v.validators[0].limit_value += ['{meta_' + p + '}' for p in keys] def clean(self): data = self.cleaned_data diff --git a/src/pretix/control/views/event.py b/src/pretix/control/views/event.py index 3c3337d23e..1c1a2ac01c 100644 --- a/src/pretix/control/views/event.py +++ b/src/pretix/control/views/event.py @@ -573,9 +573,13 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View): locales[str(idx)] = val[0] return locales + @cached_property + def meta_properties(self): + return [p.name for p in self.request.organizer.meta_properties.all()] + @cached_property def items(self): - return { + kv = { 'mail_text_order_placed': ['total', 'currency', 'date', 'invoice_company', 'total_with_currency', 'event', 'payment_info', 'url', 'invoice_name'], 'mail_text_order_paid': ['event', 'url', 'invoice_name', 'invoice_company', 'payment_info'], @@ -596,6 +600,10 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View): 'mail_text_order_denied': ['total', 'currency', 'date', 'invoice_company', 'total_with_currency', 'event', 'url', 'invoice_name'], } + for v in kv.values(): + for p in self.meta_properties: + v.append('meta_' + p) + return kv @cached_property def base_data(self): @@ -607,7 +615,7 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View): orders = [' - {} - {}'.format(self.generate_order_fullname(self.request.event.slug, order['code']), self.generate_order_url(order['code'], order['secret'])) for order in user_orders] - return { + d = { 'event': self.request.event.name, 'total': 42.23, 'total_with_currency': LazyCurrencyNumber(42.23, self.request.event.currency), @@ -620,8 +628,11 @@ class MailSettingsPreview(EventPermissionRequiredMixin, View): 'invoice_name': _('John Doe'), 'invoice_company': _('Sample Corporation'), 'common': _('An individial text with a reason can be inserted here.'), - 'payment_info': _('Please transfer money to this bank account: 9999-9999-9999-9999') + 'payment_info': _('Please transfer money to this bank account: 9999-9999-9999-9999'), } + for k, v in self.request.event.meta_data.items(): + d['meta_' + k] = v + return d def generate_order_url(self, code, secret): return build_absolute_uri('presale:event.order', kwargs={