diff --git a/doc/api/resources/orders.rst b/doc/api/resources/orders.rst index 3cfdb92b8a..f914732b07 100644 --- a/doc/api/resources/orders.rst +++ b/doc/api/resources/orders.rst @@ -839,6 +839,7 @@ Creating orders * ``comment`` (optional) * ``custom_followup_at`` (optional) * ``checkin_attention`` (optional) + * ``require_approval`` (optional) * ``invoice_address`` (optional) * ``company`` diff --git a/src/pretix/api/serializers/order.py b/src/pretix/api/serializers/order.py index 78991180c0..277575b6a3 100644 --- a/src/pretix/api/serializers/order.py +++ b/src/pretix/api/serializers/order.py @@ -935,6 +935,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): force = serializers.BooleanField(default=False, required=False) payment_date = serializers.DateTimeField(required=False, allow_null=True) send_email = serializers.BooleanField(default=False, required=False) + 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) @@ -947,7 +948,7 @@ class OrderCreateSerializer(I18nAwareModelSerializer): model = Order fields = ('code', 'status', 'testmode', 'email', 'phone', 'locale', 'payment_provider', 'fees', 'comment', 'sales_channel', 'invoice_address', 'positions', 'checkin_attention', 'payment_info', 'payment_date', 'consume_carts', - 'force', 'send_email', 'simulate', 'customer', 'custom_followup_at') + 'force', 'send_email', 'simulate', 'customer', 'custom_followup_at', 'require_approval') def validate_payment_provider(self, pp): if pp is None: @@ -1219,6 +1220,8 @@ class OrderCreateSerializer(I18nAwareModelSerializer): order.set_expires(subevents=[p.get('subevent') for p in positions_data]) order.meta_info = "{}" order.total = Decimal('0.00') + if validated_data.get('require_approval') is not None: + order.require_approval = validated_data['require_approval'] if simulate: order = WrappedModel(order) order.last_modified = now() diff --git a/src/pretix/api/views/order.py b/src/pretix/api/views/order.py index c9d5f042a3..b6700141de 100644 --- a/src/pretix/api/views/order.py +++ b/src/pretix/api/views/order.py @@ -646,7 +646,11 @@ class OrderViewSet(viewsets.ModelViewSet): payment and order.total == Decimal('0.00') and order.status == Order.STATUS_PAID and not order.require_approval and payment.provider == "free" ) - if free_flow: + if order.require_approval: + email_template = request.event.settings.mail_text_order_placed_require_approval + log_entry = 'pretix.event.order.email.order_placed_require_approval' + email_attendees = False + elif free_flow: email_template = request.event.settings.mail_text_order_free log_entry = 'pretix.event.order.email.order_free' email_attendees = request.event.settings.mail_send_order_free_attendee diff --git a/src/tests/api/test_orders.py b/src/tests/api/test_orders.py index 129ff71428..c1cd219cb2 100644 --- a/src/tests/api/test_orders.py +++ b/src/tests/api/test_orders.py @@ -1925,6 +1925,28 @@ def test_order_create_autocheckin(token_client, organizer, event, item, quota, q assert o.positions.first().checkins.count() == 0 +@pytest.mark.django_db +def test_order_create_require_approval(token_client, organizer, event, item, quota, question): + res = copy.deepcopy(ORDER_CREATE_PAYLOAD) + res['require_approval'] = True + res['send_email'] = True + res['positions'][0]['item'] = item.pk + res['positions'][0]['answers'][0]['question'] = question.pk + 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 + with scopes_disabled(): + o = Order.objects.get(code=resp.data['code']) + assert o.require_approval + assert len(djmail.outbox) == 1 + assert djmail.outbox[0].subject == "Your order: {}".format(resp.data['code']) + assert "approval" in djmail.outbox[0].body + + @pytest.mark.django_db def test_order_create_invoice_address_optional(token_client, organizer, event, item, quota, question): res = copy.deepcopy(ORDER_CREATE_PAYLOAD)