From 31cec76809dc5f7b774f8d686b5ffb8cc60226db Mon Sep 17 00:00:00 2001 From: Raphael Michel Date: Mon, 12 Nov 2018 12:58:50 +0100 Subject: [PATCH] Generate invoice after expired order is extended --- src/pretix/base/services/orders.py | 28 +++++++++++++--------------- src/tests/control/test_orders.py | 3 +++ 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/pretix/base/services/orders.py b/src/pretix/base/services/orders.py index fadb544ff4..f476b0297b 100644 --- a/src/pretix/base/services/orders.py +++ b/src/pretix/base/services/orders.py @@ -91,34 +91,32 @@ def extend_order(order: Order, new_date: datetime, force: bool=False, user: User """ if new_date < now(): raise OrderError(_('The new expiry date needs to be in the future.')) - if order.status == Order.STATUS_PENDING: + + def change(was_expired=True): order.expires = new_date - order.save(update_fields=['expires']) + if was_expired: + order.status = Order.STATUS_PENDING + order.save(update_fields=['expires'] + (['status'] if was_expired else [])) order.log_action( 'pretix.event.order.expirychanged', user=user, auth=auth, data={ 'expires': order.expires, - 'state_change': False + 'state_change': was_expired } ) + if was_expired: + if order.invoices.filter(is_cancellation=True).count() >= order.invoices.filter(is_cancellation=False).count(): + generate_invoice(order) + + if order.status == Order.STATUS_PENDING: + change(was_expired=False) else: with order.event.lock() as now_dt: is_available = order._is_still_available(now_dt, count_waitinglist=False) if is_available is True or force is True: - order.expires = new_date - order.status = Order.STATUS_PENDING - order.save(update_fields=['expires', 'status']) - order.log_action( - 'pretix.event.order.expirychanged', - user=user, - auth=auth, - data={ - 'expires': order.expires, - 'state_change': True - } - ) + change(was_expired=True) else: raise OrderError(is_available) diff --git a/src/tests/control/test_orders.py b/src/tests/control/test_orders.py index 9ea88654f1..e052a88da0 100644 --- a/src/tests/control/test_orders.py +++ b/src/tests/control/test_orders.py @@ -468,10 +468,12 @@ def test_order_extend_expired_quota_left(client, env): o.expires = now() - timedelta(days=5) o.status = Order.STATUS_EXPIRED o.save() + generate_cancellation(generate_invoice(o)) q = Quota.objects.create(event=env[0], size=3) q.items.add(env[3]) newdate = (now() + timedelta(days=20)).strftime("%Y-%m-%d %H:%M:%S") client.login(email='dummy@dummy.dummy', password='dummy') + assert o.invoices.count() == 2 response = client.post('/control/event/dummy/dummy/orders/FOO/extend', { 'expires': newdate }, follow=True) @@ -479,6 +481,7 @@ def test_order_extend_expired_quota_left(client, env): o = Order.objects.get(id=env[2].id) assert o.expires.strftime("%Y-%m-%d %H:%M:%S") == newdate[:10] + " 23:59:59" assert o.status == Order.STATUS_PENDING + assert o.invoices.count() == 3 @pytest.mark.django_db