From 5f502776b12afce0e21d41ad1e36a6ee72627b0b Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Wed, 22 Jul 2020 18:20:05 +0200 Subject: [PATCH 01/13] send canonical mails depending on sales channel --- src/pretix/base/models/orders.py | 2 +- src/pretix/base/services/orders.py | 14 ++++++++----- src/pretix/base/settings.py | 8 ++++++++ src/pretix/control/forms/event.py | 20 +++++++++++++++++++ .../templates/pretixcontrol/event/mail.html | 2 ++ 5 files changed, 40 insertions(+), 6 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 4b62a0c9dc..937c16170e 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -1491,7 +1491,7 @@ class OrderPayment(models.Model): trigger_pdf=not send_mail or not self.order.event.settings.invoice_email_attachment ) - if send_mail: + if send_mail and self.order.sales_channel in self.order.event.settings.mail_sales_channel_paid_placed: self._send_paid_mail(invoice, user, mail_text) if self.order.event.settings.mail_send_order_paid_attendee: for p in self.order.positions.all(): diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index a895dd0a88..9909edfff7 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -960,11 +960,12 @@ def _perform_order(event: Event, payment_provider: str, position_ids: List[str], email_attendees = event.settings.mail_send_order_placed_attendee email_attendees_template = event.settings.mail_text_order_placed_attendee - _order_placed_email(event, order, pprov, email_template, log_entry, invoice, payment) - if email_attendees: - for p in order.positions.all(): - if p.addon_to_id is None and p.attendee_email and p.attendee_email != order.email: - _order_placed_email_attendee(event, order, p, email_attendees_template, log_entry) + if sales_channel in event.settings.mail_sales_channel_placed_paid: + _order_placed_email(event, order, pprov, email_template, log_entry, invoice, payment) + if email_attendees: + for p in order.positions.all(): + if p.addon_to_id is None and p.attendee_email and p.attendee_email != order.email: + _order_placed_email_attendee(event, order, p, email_attendees_template, log_entry) return order.id @@ -1056,6 +1057,9 @@ def send_download_reminders(sender, **kwargs): if days is None: continue + if o.sales_channel not in event.settings.mail_sales_channel_placed_paid: + continue + reminder_date = (o.first_date - timedelta(days=days)).replace(hour=0, minute=0, second=0, microsecond=0) if now() < reminder_date or o.datetime > reminder_date: continue diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index a73b8823c3..af8b925dcd 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -1190,6 +1190,14 @@ DEFAULTS = { "Defaults to your event name."), ) }, + 'mail_sales_channel_placed_paid': { + 'default': ['web'], + 'type': list, + }, + 'mail_sales_channel_ticket_reminder': { + 'default': ['web'], + 'type': list, + }, 'mail_text_signature': { 'type': LazyI18nString, 'default': "" diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 350063623c..057e1f0af2 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -758,6 +758,26 @@ class MailSettingsForm(SettingsForm): 'mail_attach_ical', ] + mail_sales_channel_placed_paid = forms.MultipleChoiceField( + choices=[(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], + label=_('Sales Channels for Checkout Emails'), + help_text=_('Restrict Order placed and paid emails to orders from certain sales channels.'), + widget=forms.CheckboxSelectMultiple( + attrs={'class': 'scrolling-multiple-choice'} + ), + required=False, + ) + + mail_sales_channel_ticket_reminder = forms.MultipleChoiceField( + choices=[(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], + label=_('Sales Channels for Ticket Emails'), + help_text=_('Restrict ticket reminder emails to orders from certain sales channels.'), + widget=forms.CheckboxSelectMultiple( + attrs={'class': 'scrolling-multiple-choice'} + ), + required=False, + ) + mail_bcc = forms.CharField( label=_("Bcc address"), help_text=_("All emails will be sent to this address as a Bcc copy"), diff --git a/src/pretix/control/templates/pretixcontrol/event/mail.html b/src/pretix/control/templates/pretixcontrol/event/mail.html index 0988ebaccc..18579ccc83 100644 --- a/src/pretix/control/templates/pretixcontrol/event/mail.html +++ b/src/pretix/control/templates/pretixcontrol/event/mail.html @@ -17,6 +17,8 @@ {% bootstrap_field form.mail_text_signature layout="control" %} {% bootstrap_field form.mail_bcc layout="control" %} {% bootstrap_field form.mail_attach_ical layout="control" %} + {% bootstrap_field form.mail_sales_channel_placed_paid layout="control" %} + {% bootstrap_field form.mail_sales_channel_ticket_reminder layout="control" %}
{% trans "E-mail design" %} From 1b48b519e3eadff41b93d101b051d9aa880967bd Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 12:23:10 +0200 Subject: [PATCH 02/13] add migration --- doc/api/resources/orders.rst | 3 +- .../migrations/0158_mails_by_sales_channel.py | 39 +++++++++++++++++++ src/pretix/control/forms/event.py | 18 +++++---- .../templates/pretixcontrol/event/mail.html | 3 +- 4 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 src/pretix/base/migrations/0158_mails_by_sales_channel.py diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 56c2ad3540..383cab5393 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -928,7 +928,8 @@ Creating orders during order generation and is not respected automatically when the order changes later.) * ``force`` (optional). If set to ``true``, quotas will be ignored. - * ``send_mail`` (optional). If set to ``true``, the same emails will be sent as for a regular order. Defaults to + * ``send_mail`` (optional). If set to ``true``, the same emails will be sent as for a regular order, regardless of + whether these emails are enabled for certain sales channels. Defaults to ``false``. If you want to use add-on products, you need to set the ``positionid`` fields of all positions manually diff --git a/src/pretix/base/migrations/0158_mails_by_sales_channel.py b/src/pretix/base/migrations/0158_mails_by_sales_channel.py new file mode 100644 index 0000000000..a2e914d5b2 --- /dev/null +++ b/src/pretix/base/migrations/0158_mails_by_sales_channel.py @@ -0,0 +1,39 @@ +# Generated by Django 3.0.8 on 2020-07-24 09:05 + +from django.db import migrations + +from pretix.base.channels import get_all_sales_channels + +def set_sales_channels(apps, schema_editor): + # We now allow restricting some mails to certain sales channels + # The default is changing from all channels to "web" only + # Therefore, for existing events, we enable all sales channels + Event_SettingsStore = apps.get_model('pretixbase', 'Event_SettingsStore') + Event = apps.get_model('pretixbase', 'Event') + all_sales_channels = "[" + ", ".join('"' + sc + '"' for sc in get_all_sales_channels()) + "]" + batch_size = 1000 + Event_SettingsStore.objects.bulk_create([ + Event_SettingsStore( + object=event, + key="mail_sales_channel_placed_paid", + value=all_sales_channels) + for event in Event.objects.all() + ], batch_size=batch_size) + Event_SettingsStore.objects.bulk_create([ + Event_SettingsStore( + object=event, + key="mail_sales_channel_ticket_reminder", + value=all_sales_channels) + for event in Event.objects.all() + ], batch_size=batch_size) + + +class Migration(migrations.Migration): + + dependencies = [ + ('pretixbase', '0157_auto_20200712_0932'), + ] + + operations = [ + migrations.RunPython(set_sales_channels, migrations.RunPython.noop), + ] diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 057e1f0af2..b91aac6a82 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -750,6 +750,10 @@ def multimail_validate(val): return s +def contains_web_channel_validate(val): + if "web" not in val: + raise ValidationError(_("The web channel must be selected to receive these emails.")) + class MailSettingsForm(SettingsForm): auto_fields = [ 'mail_prefix', @@ -759,23 +763,23 @@ class MailSettingsForm(SettingsForm): ] mail_sales_channel_placed_paid = forms.MultipleChoiceField( - choices=[(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], + choices=lambda: [(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], label=_('Sales Channels for Checkout Emails'), - help_text=_('Restrict Order placed and paid emails to orders from certain sales channels.'), + help_text=_('The order placed and paid emails will only be send to orders from these sales channels. The online shop must be enabled.'), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'} ), - required=False, + validators=[contains_web_channel_validate], ) mail_sales_channel_ticket_reminder = forms.MultipleChoiceField( - choices=[(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], - label=_('Sales Channels for Ticket Emails'), - help_text=_('Restrict ticket reminder emails to orders from certain sales channels.'), + choices=lambda: [(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], + label=_('Sales Channels'), + help_text=_('This email will only be send to orders from these sales channels. The online shop must be enabled.'), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'} ), - required=False, + validators=[contains_web_channel_validate], ) mail_bcc = forms.CharField( diff --git a/src/pretix/control/templates/pretixcontrol/event/mail.html b/src/pretix/control/templates/pretixcontrol/event/mail.html index 18579ccc83..9676c68237 100644 --- a/src/pretix/control/templates/pretixcontrol/event/mail.html +++ b/src/pretix/control/templates/pretixcontrol/event/mail.html @@ -18,7 +18,6 @@ {% bootstrap_field form.mail_bcc layout="control" %} {% bootstrap_field form.mail_attach_ical layout="control" %} {% bootstrap_field form.mail_sales_channel_placed_paid layout="control" %} - {% bootstrap_field form.mail_sales_channel_ticket_reminder layout="control" %}
{% trans "E-mail design" %} @@ -72,7 +71,7 @@ {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="custom_mail" title=title_order_custom_mail items="mail_text_order_custom_mail" %} {% blocktrans asvar title_download_tickets_reminder %}Reminder to download tickets{% endblocktrans %} - {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="ticket_reminder" title=title_download_tickets_reminder items="mail_days_download_reminder,mail_text_download_reminder,mail_send_download_reminder_attendee,mail_text_download_reminder_attendee" exclude="mail_days_download_reminder,mail_send_download_reminder_attendee" %} + {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="ticket_reminder" title=title_download_tickets_reminder items="mail_days_download_reminder,mail_text_download_reminder,mail_send_download_reminder_attendee,mail_text_download_reminder_attendee,mail_sales_channel_ticket_reminder" exclude="mail_days_download_reminder,mail_send_download_reminder_attendee,mail_sales_channel_ticket_reminder" %} {% blocktrans asvar title_require_approval %}Order approval process{% endblocktrans %} {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="ticket_reminder" title=title_require_approval items="mail_text_order_placed_require_approval,mail_text_order_approved,mail_text_order_denied" %} From 7aa793f4f724a1d569ee1e9ef5f58dfb0b402491 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 15:24:30 +0200 Subject: [PATCH 03/13] fix name --- src/pretix/base/models/orders.py | 2 +- src/pretix/control/forms/event.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/models/orders.py b/src/pretix/base/models/orders.py index 937c16170e..8d64eac1dd 100644 --- a/src/pretix/base/models/orders.py +++ b/src/pretix/base/models/orders.py @@ -1491,7 +1491,7 @@ class OrderPayment(models.Model): trigger_pdf=not send_mail or not self.order.event.settings.invoice_email_attachment ) - if send_mail and self.order.sales_channel in self.order.event.settings.mail_sales_channel_paid_placed: + if send_mail and self.order.sales_channel in self.order.event.settings.mail_sales_channel_placed_paid: self._send_paid_mail(invoice, user, mail_text) if self.order.event.settings.mail_send_order_paid_attendee: for p in self.order.positions.all(): diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index b91aac6a82..d28c06285a 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -765,7 +765,8 @@ class MailSettingsForm(SettingsForm): mail_sales_channel_placed_paid = forms.MultipleChoiceField( choices=lambda: [(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], label=_('Sales Channels for Checkout Emails'), - help_text=_('The order placed and paid emails will only be send to orders from these sales channels. The online shop must be enabled.'), + help_text=_('The order placed and paid emails will only be send to orders from these sales channels. ' + 'The online shop must be enabled.'), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'} ), From d0ccc42aff093d14f55a183ab5588e46848dd9f2 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 16:21:12 +0200 Subject: [PATCH 04/13] add test for ticket reminder (oops) --- src/pretix/base/services/orders.py | 2 +- src/tests/base/test_orderimport.py | 2 +- src/tests/base/test_orders.py | 7 +++++++ 3 files changed, 9 insertions(+), 2 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index 9909edfff7..d492c5d1b1 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -1057,7 +1057,7 @@ def send_download_reminders(sender, **kwargs): if days is None: continue - if o.sales_channel not in event.settings.mail_sales_channel_placed_paid: + if o.sales_channel not in event.settings.mail_sales_channel_ticket_reminder: continue reminder_date = (o.first_date - timedelta(days=days)).replace(hour=0, minute=0, second=0, microsecond=0) diff --git a/src/tests/base/test_orderimport.py b/src/tests/base/test_orderimport.py index 3a8facd75d..3b9f21fb11 100644 --- a/src/tests/base/test_orderimport.py +++ b/src/tests/base/test_orderimport.py @@ -1,5 +1,5 @@ import csv -from _decimal import Decimal +from decimal import Decimal from io import StringIO import pytest diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index da0a39d333..65cbbae256 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -543,6 +543,13 @@ class DownloadReminderTests(TestCase): send_download_reminders(sender=self.event) assert len(djmail.outbox) == 0 + @classscope(attr='o') + def test_not_sent_for_disabled_sales_channel(self): + self.event.settings.mail_days_download_reminder = 2 + self.event.settings.mail_sales_channel_ticket_reminder = [] + send_download_reminders(sender=self.event) + assert len(djmail.outbox) == 0 + class OrderCancelTests(TestCase): def setUp(self): From b168516d78160738b944808431189157e6d43839 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 16:29:40 +0200 Subject: [PATCH 05/13] user guide --- doc/user/events/email.rst | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/doc/user/events/email.rst b/doc/user/events/email.rst index 69deafeb93..b20bbc328d 100644 --- a/doc/user/events/email.rst +++ b/doc/user/events/email.rst @@ -26,6 +26,9 @@ Sender address we strongly recommend to use the SMTP settings below as well, otherwise your e-mails might be detected as spam due to the `Sender Policy Framework`_ and similar mechanisms. +Sender name + This is the name associated with the sender address. By default, this is your event name. + Signature This text will be appended to all e-mails in form of a signature. This might be useful e.g. to add your contact details or any legal information that needs to be included with the e-mails. @@ -33,6 +36,15 @@ Signature Bcc address This email address will receive a copy of every event-related email. +Attach calender files + With this option, every order confirmation mail will include an ics file with name, date and location of + your event. It can be imported into many digital calendars. + +Sales Channels for Checkout Emails + When you are using multiple sales channel, you may want to decide that mails for order and payment confirmation + are only to be sent for some sales channels. For orders created through the default online shop, these emails + must always be send. A similar option is available for ticket download reminders. + E-mail design ------------- From 413cbec4b92003608d2c602c4334a695c979dd36 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 16:40:16 +0200 Subject: [PATCH 06/13] code format --- doc/spelling_wordlist.txt | 1 + doc/user/events/email.rst | 2 +- src/pretix/control/forms/event.py | 4 ++-- 3 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/spelling_wordlist.txt b/doc/spelling_wordlist.txt index ba0b0918d7..67f0f50b03 100644 --- a/doc/spelling_wordlist.txt +++ b/doc/spelling_wordlist.txt @@ -47,6 +47,7 @@ gunicorn guid hardcoded hostname +ics idempotency iframe incrementing diff --git a/doc/user/events/email.rst b/doc/user/events/email.rst index b20bbc328d..01225a1121 100644 --- a/doc/user/events/email.rst +++ b/doc/user/events/email.rst @@ -36,7 +36,7 @@ Signature Bcc address This email address will receive a copy of every event-related email. -Attach calender files +Attach calendar files With this option, every order confirmation mail will include an ics file with name, date and location of your event. It can be imported into many digital calendars. diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index d28c06285a..fecbb526eb 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -1,5 +1,3 @@ -from urllib.parse import urlencode, urlparse - from django import forms from django.conf import settings from django.core.exceptions import ValidationError @@ -17,6 +15,7 @@ from i18nfield.forms import ( I18nForm, I18nFormField, I18nFormSetMixin, I18nTextarea, I18nTextInput, ) from pytz import common_timezones, timezone +from urllib.parse import urlencode, urlparse from pretix.base.channels import get_all_sales_channels from pretix.base.email import get_available_placeholders @@ -754,6 +753,7 @@ def contains_web_channel_validate(val): if "web" not in val: raise ValidationError(_("The web channel must be selected to receive these emails.")) + class MailSettingsForm(SettingsForm): auto_fields = [ 'mail_prefix', From 143ac10991deed0b9370b3fda6ecba93961b8751 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 16:59:24 +0200 Subject: [PATCH 07/13] rebase migration --- ...mails_by_sales_channel.py => 0159_mails_by_sales_channel.py} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename src/pretix/base/migrations/{0158_mails_by_sales_channel.py => 0159_mails_by_sales_channel.py} (96%) diff --git a/src/pretix/base/migrations/0158_mails_by_sales_channel.py b/src/pretix/base/migrations/0159_mails_by_sales_channel.py similarity index 96% rename from src/pretix/base/migrations/0158_mails_by_sales_channel.py rename to src/pretix/base/migrations/0159_mails_by_sales_channel.py index a2e914d5b2..d6012d865f 100644 --- a/src/pretix/base/migrations/0158_mails_by_sales_channel.py +++ b/src/pretix/base/migrations/0159_mails_by_sales_channel.py @@ -31,7 +31,7 @@ def set_sales_channels(apps, schema_editor): class Migration(migrations.Migration): dependencies = [ - ('pretixbase', '0157_auto_20200712_0932'), + ('pretixbase', '0158_auto_20200724_0754'), ] operations = [ From 4a0a3aff592b743cac8188659c981c353813a351 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 17:57:25 +0200 Subject: [PATCH 08/13] rename to download_reminder --- src/pretix/base/migrations/0159_mails_by_sales_channel.py | 2 +- src/pretix/base/services/orders.py | 2 +- src/pretix/base/settings.py | 2 +- src/pretix/control/forms/event.py | 4 ++-- src/pretix/control/templates/pretixcontrol/event/mail.html | 2 +- src/tests/base/test_orders.py | 2 +- 6 files changed, 7 insertions(+), 7 deletions(-) diff --git a/src/pretix/base/migrations/0159_mails_by_sales_channel.py b/src/pretix/base/migrations/0159_mails_by_sales_channel.py index d6012d865f..efab29c1b0 100644 --- a/src/pretix/base/migrations/0159_mails_by_sales_channel.py +++ b/src/pretix/base/migrations/0159_mails_by_sales_channel.py @@ -22,7 +22,7 @@ def set_sales_channels(apps, schema_editor): Event_SettingsStore.objects.bulk_create([ Event_SettingsStore( object=event, - key="mail_sales_channel_ticket_reminder", + key="mail_sales_channel_download_reminder", value=all_sales_channels) for event in Event.objects.all() ], batch_size=batch_size) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index d492c5d1b1..bfc618ef5f 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -1057,7 +1057,7 @@ def send_download_reminders(sender, **kwargs): if days is None: continue - if o.sales_channel not in event.settings.mail_sales_channel_ticket_reminder: + if o.sales_channel not in event.settings.mail_sales_channel_download_reminder: continue reminder_date = (o.first_date - timedelta(days=days)).replace(hour=0, minute=0, second=0, microsecond=0) diff --git a/src/pretix/base/settings.py b/src/pretix/base/settings.py index af8b925dcd..cadd41c9f8 100644 --- a/src/pretix/base/settings.py +++ b/src/pretix/base/settings.py @@ -1194,7 +1194,7 @@ DEFAULTS = { 'default': ['web'], 'type': list, }, - 'mail_sales_channel_ticket_reminder': { + 'mail_sales_channel_download_reminder': { 'default': ['web'], 'type': list, }, diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index fecbb526eb..75c33c525c 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -751,7 +751,7 @@ def multimail_validate(val): def contains_web_channel_validate(val): if "web" not in val: - raise ValidationError(_("The web channel must be selected to receive these emails.")) + raise ValidationError(_("The online shop must be selected to receive these emails.")) class MailSettingsForm(SettingsForm): @@ -773,7 +773,7 @@ class MailSettingsForm(SettingsForm): validators=[contains_web_channel_validate], ) - mail_sales_channel_ticket_reminder = forms.MultipleChoiceField( + mail_sales_channel_download_reminder = forms.MultipleChoiceField( choices=lambda: [(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], label=_('Sales Channels'), help_text=_('This email will only be send to orders from these sales channels. The online shop must be enabled.'), diff --git a/src/pretix/control/templates/pretixcontrol/event/mail.html b/src/pretix/control/templates/pretixcontrol/event/mail.html index 9676c68237..0ea2e13ddf 100644 --- a/src/pretix/control/templates/pretixcontrol/event/mail.html +++ b/src/pretix/control/templates/pretixcontrol/event/mail.html @@ -71,7 +71,7 @@ {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="custom_mail" title=title_order_custom_mail items="mail_text_order_custom_mail" %} {% blocktrans asvar title_download_tickets_reminder %}Reminder to download tickets{% endblocktrans %} - {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="ticket_reminder" title=title_download_tickets_reminder items="mail_days_download_reminder,mail_text_download_reminder,mail_send_download_reminder_attendee,mail_text_download_reminder_attendee,mail_sales_channel_ticket_reminder" exclude="mail_days_download_reminder,mail_send_download_reminder_attendee,mail_sales_channel_ticket_reminder" %} + {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="ticket_reminder" title=title_download_tickets_reminder items="mail_days_download_reminder,mail_text_download_reminder,mail_send_download_reminder_attendee,mail_text_download_reminder_attendee,mail_sales_channel_download_reminder" exclude="mail_days_download_reminder,mail_send_download_reminder_attendee,mail_sales_channel_download_reminder" %} {% blocktrans asvar title_require_approval %}Order approval process{% endblocktrans %} {% include "pretixcontrol/event/mail_settings_fragment.html" with pid="ticket_reminder" title=title_require_approval items="mail_text_order_placed_require_approval,mail_text_order_approved,mail_text_order_denied" %} diff --git a/src/tests/base/test_orders.py b/src/tests/base/test_orders.py index 65cbbae256..f99314def2 100644 --- a/src/tests/base/test_orders.py +++ b/src/tests/base/test_orders.py @@ -546,7 +546,7 @@ class DownloadReminderTests(TestCase): @classscope(attr='o') def test_not_sent_for_disabled_sales_channel(self): self.event.settings.mail_days_download_reminder = 2 - self.event.settings.mail_sales_channel_ticket_reminder = [] + self.event.settings.mail_sales_channel_download_reminder = [] send_download_reminders(sender=self.event) assert len(djmail.outbox) == 0 From 0e95a7863fcc9fef2aee5d475a4942c0240e5ca4 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 18:44:24 +0200 Subject: [PATCH 09/13] tests for placed and paid mails --- src/tests/presale/test_checkout.py | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index bd3bdb4724..001897a7a6 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -28,6 +28,7 @@ from pretix.base.services.orders import OrderError, _perform_order from pretix.testutils.scope import classscope from pretix.testutils.sessions import get_cart_session_key +from django.core import mail as djmail class BaseCheckoutTestCase: @scopes_disabled() @@ -2510,6 +2511,35 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): assert not Order.objects.last().testmode assert "0" not in Order.objects.last().code + def test_receive_order_confirmation_and_paid_mail(self): + with scopes_disabled(): + cp1 = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=23, expires=now() + timedelta(minutes=10) + ) + djmail.outbox = [] + oid = _perform_order(self.event, 'manual', [cp1.pk], 'admin@example.org', 'en', None, {}, 'web') + assert len(djmail.outbox) == 1 + o = Order.objects.get(pk=oid) + o.payments.first().confirm() + assert len(djmail.outbox) == 2 + + def test_order_confirmation_and_paid_mail_not_send_on_disabled_sales_channel(self): + with scopes_disabled(): + cp1 = CartPosition.objects.create( + event=self.event, cart_id=self.session_key, item=self.ticket, + price=23, expires=now() + timedelta(minutes=10) + ) + djmail.outbox = [] + self.event.settings.mail_sales_channel_placed_paid = [] + oid = _perform_order(self.event, 'manual', [cp1.pk], 'admin@example.org', 'en', None, {}, 'web') + assert len(djmail.outbox) == 0 + o = Order.objects.get(pk=oid) + o.payments.first().confirm() + assert len(djmail.outbox) == 0 + + + class QuestionsTestCase(BaseCheckoutTestCase, TestCase): From 98dfdd8b013c7fd87d7c8ae1baedcae2b9593fe1 Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 18:44:35 +0200 Subject: [PATCH 10/13] no ugettext --- src/pretix/presale/forms/order.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/presale/forms/order.py b/src/pretix/presale/forms/order.py index b68a8c0eb1..adaee75c18 100644 --- a/src/pretix/presale/forms/order.py +++ b/src/pretix/presale/forms/order.py @@ -1,7 +1,7 @@ from decimal import Decimal from django import forms -from django.utils.translation import ugettext_lazy as _ +from django.utils.translation import gettext_lazy as _ from pretix.base.models import Quota from pretix.base.models.tax import TaxedPrice From cbb848b3fa5cd097d20f85eb730c01229fb2683d Mon Sep 17 00:00:00 2001 From: Felix Rindt Date: Fri, 24 Jul 2020 18:47:41 +0200 Subject: [PATCH 11/13] style --- src/tests/presale/test_checkout.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/src/tests/presale/test_checkout.py b/src/tests/presale/test_checkout.py index 001897a7a6..86371f8928 100644 --- a/src/tests/presale/test_checkout.py +++ b/src/tests/presale/test_checkout.py @@ -8,6 +8,7 @@ from unittest import mock from bs4 import BeautifulSoup from django.conf import settings +from django.core import mail as djmail from django.core.files.uploadedfile import SimpleUploadedFile from django.test import TestCase from django.utils.crypto import get_random_string @@ -28,7 +29,6 @@ from pretix.base.services.orders import OrderError, _perform_order from pretix.testutils.scope import classscope from pretix.testutils.sessions import get_cart_session_key -from django.core import mail as djmail class BaseCheckoutTestCase: @scopes_disabled() @@ -2539,8 +2539,6 @@ class CheckoutTestCase(BaseCheckoutTestCase, TestCase): assert len(djmail.outbox) == 0 - - class QuestionsTestCase(BaseCheckoutTestCase, TestCase): def test_timezone(self): From 2cdaf07c46a5e0aa09197ec5dd03eb3421234679 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 28 Jul 2020 09:24:53 +0200 Subject: [PATCH 12/13] Update src/pretix/control/forms/event.py --- src/pretix/control/forms/event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 75c33c525c..2ba922cb7f 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -775,7 +775,7 @@ class MailSettingsForm(SettingsForm): mail_sales_channel_download_reminder = forms.MultipleChoiceField( choices=lambda: [(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], - label=_('Sales Channels'), + label=_('Sales channels'), help_text=_('This email will only be send to orders from these sales channels. The online shop must be enabled.'), widget=forms.CheckboxSelectMultiple( attrs={'class': 'scrolling-multiple-choice'} From baf8a4ae1828213f8948f6f3bc32505d86e07c27 Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Tue, 28 Jul 2020 09:25:10 +0200 Subject: [PATCH 13/13] Update src/pretix/control/forms/event.py --- src/pretix/control/forms/event.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/pretix/control/forms/event.py b/src/pretix/control/forms/event.py index 2ba922cb7f..1861ef1c0b 100644 --- a/src/pretix/control/forms/event.py +++ b/src/pretix/control/forms/event.py @@ -764,7 +764,7 @@ class MailSettingsForm(SettingsForm): mail_sales_channel_placed_paid = forms.MultipleChoiceField( choices=lambda: [(ident, sc.verbose_name) for ident, sc in get_all_sales_channels().items()], - label=_('Sales Channels for Checkout Emails'), + label=_('Sales channels for checkout emails'), help_text=_('The order placed and paid emails will only be send to orders from these sales channels. ' 'The online shop must be enabled.'), widget=forms.CheckboxSelectMultiple(