diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index f914732b0..1e775b37d 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -899,8 +899,9 @@ Creating orders * ``force`` (optional). If set to ``true``, quotas will be ignored. * ``send_email`` (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``. Used to be ``send_mail`` before pretix 3.14. + whether these emails are enabled for certain sales channels. If set to ``null``, behaviour will be controlled by pretix' + settings based on the sales channels (added in pretix 4.7). Defaults to ``false``. + Used to be ``send_mail`` before pretix 3.14. If you want to use add-on products, you need to set the ``positionid`` fields of all positions manually to incrementing integers starting with ``1``. Then, you can reference one of these diff --git a/src/pretix/__init__.py b/src/pretix/__init__.py index 3b736a749..282979171 100644 --- a/src/pretix/__init__.py +++ b/src/pretix/__init__.py @@ -19,4 +19,4 @@ # You should have received a copy of the GNU Affero General Public License along with this program. If not, see # . # -__version__ = "4.7.0.dev0" +__version__ = "4.7.0.dev1" diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 277575b6a..ab30b0752 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -934,7 +934,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): consume_carts = serializers.ListField(child=serializers.CharField(), required=False) force = serializers.BooleanField(default=False, required=False) payment_date = serializers.DateTimeField(required=False, allow_null=True) - send_email = serializers.BooleanField(default=False, required=False) + send_email = serializers.BooleanField(default=False, required=False, allow_null=True) require_approval = serializers.BooleanField(default=False, required=False) simulate = serializers.BooleanField(default=False, required=False) customer = serializers.SlugRelatedField(slug_field='identifier', queryset=Customer.objects.none(), required=False) @@ -1042,6 +1042,8 @@ class OrderCreateSerializer(I18nAwareModelSerializer): force = validated_data.pop('force', False) simulate = validated_data.pop('simulate', False) self._send_mail = validated_data.pop('send_email', False) + if self._send_mail is None: + self._send_mail = validated_data.get('sales_channel') in self.context['event'].settings.mail_sales_channel_placed_paid if 'invoice_address' in validated_data: iadata = validated_data.pop('invoice_address') diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index c1cd219cb..be2f6f270 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -3554,6 +3554,36 @@ def test_order_create_send_emails_free(token_client, organizer, event, item, quo assert djmail.outbox[0].subject == "Your order: {}".format(resp.data['code']) +@pytest.mark.django_db +def test_order_create_send_emails_based_on_sales_channel(token_client, organizer, event, item, quota, question): + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res['positions'][0]['item'] = item.pk + res['positions'][0]['price'] = '0.00' + res['payment_provider'] = 'free' + del res['fees'] + res['positions'][0]['answers'][0]['question'] = question.pk + res['send_email'] = None + djmail.outbox = [] + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + assert len(djmail.outbox) == 1 + assert djmail.outbox[0].subject == "Your order: {}".format(resp.data['code']) + + event.settingsmail_sales_channel_placed_paid = [] + djmail.outbox = [] + resp = token_client.post( + '/api/v1/organizers/{}/events/{}/orders/'.format( + organizer.slug, event.slug + ), format='json', data=res + ) + assert resp.status_code == 201 + assert len(djmail.outbox) == 1 + + @pytest.mark.django_db def test_order_create_send_emails_paid(token_client, organizer, event, item, quota, question): res = copy.deepcopy(ORDER_CREATE_PAYLOAD)