Marking orders as paid now ignores waiting list

This commit is contained in:
Raphael Michel
2017-10-24 12:48:38 +02:00
parent c33fc7630e
commit cb6f6247fd
6 changed files with 48 additions and 7 deletions
+2 -2
View File
@@ -314,7 +314,7 @@ class Order(LoggedModel):
), tz) ), tz)
return term_last return term_last
def _can_be_paid(self) -> Union[bool, str]: def _can_be_paid(self, count_waitinglist=True) -> Union[bool, str]:
error_messages = { error_messages = {
'late_lastdate': _("The payment can not be accepted as the last date of payments configured in the " 'late_lastdate': _("The payment can not be accepted as the last date of payments configured in the "
"payment settings is over."), "payment settings is over."),
@@ -331,7 +331,7 @@ class Order(LoggedModel):
if not self.event.settings.get('payment_term_accept_late'): if not self.event.settings.get('payment_term_accept_late'):
return error_messages['late'] return error_messages['late']
return self._is_still_available() return self._is_still_available(count_waitinglist=count_waitinglist)
def _is_still_available(self, now_dt: datetime=None, count_waitinglist=True) -> Union[bool, str]: def _is_still_available(self, now_dt: datetime=None, count_waitinglist=True) -> Union[bool, str]:
error_messages = { error_messages = {
+4 -3
View File
@@ -75,7 +75,8 @@ logger = logging.getLogger(__name__)
def mark_order_paid(order: Order, provider: str=None, info: str=None, date: datetime=None, manual: bool=None, def mark_order_paid(order: Order, provider: str=None, info: str=None, date: datetime=None, manual: bool=None,
force: bool=False, send_mail: bool=True, user: User=None, mail_text='') -> Order: force: bool=False, send_mail: bool=True, user: User=None, mail_text='',
count_waitinglist=True) -> Order:
""" """
Marks an order as paid. This sets the payment provider, info and date and returns Marks an order as paid. This sets the payment provider, info and date and returns
the order object. the order object.
@@ -101,7 +102,7 @@ def mark_order_paid(order: Order, provider: str=None, info: str=None, date: date
return order return order
with order.event.lock() as now_dt: with order.event.lock() as now_dt:
can_be_paid = order._can_be_paid() can_be_paid = order._can_be_paid(count_waitinglist=count_waitinglist)
if not force and can_be_paid is not True: if not force and can_be_paid is not True:
raise Quota.QuotaExceededException(can_be_paid) raise Quota.QuotaExceededException(can_be_paid)
order.payment_provider = provider or order.payment_provider order.payment_provider = provider or order.payment_provider
@@ -756,7 +757,7 @@ class OrderChangeManager:
def _check_paid_to_free(self): def _check_paid_to_free(self):
if self.order.total == 0: if self.order.total == 0:
try: try:
mark_order_paid(self.order, 'free', send_mail=False) mark_order_paid(self.order, 'free', send_mail=False, count_waitinglist=False)
except Quota.QuotaExceededException: except Quota.QuotaExceededException:
raise OrderError(self.error_messages['paid_to_free_exceeded']) raise OrderError(self.error_messages['paid_to_free_exceeded'])
+2 -1
View File
@@ -210,7 +210,8 @@ class OrderTransition(OrderView):
to = self.request.POST.get('status', '') to = self.request.POST.get('status', '')
if self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and to == 'p': if self.order.status in (Order.STATUS_PENDING, Order.STATUS_EXPIRED) and to == 'p':
try: try:
mark_order_paid(self.order, manual=True, user=self.request.user) mark_order_paid(self.order, manual=True, user=self.request.user,
count_waitinglist=False)
except Quota.QuotaExceededException as e: except Quota.QuotaExceededException as e:
messages.error(self.request, str(e)) messages.error(self.request, str(e))
except SendMailException: except SendMailException:
+1 -1
View File
@@ -71,7 +71,7 @@ class ActionView(View):
'date': trans.date, 'date': trans.date,
'payer': trans.payer, 'payer': trans.payer,
'trans_id': trans.pk 'trans_id': trans.pk
})) }), count_waitinglist=False)
trans.state = BankTransaction.STATE_VALID trans.state = BankTransaction.STATE_VALID
trans.save() trans.save()
except Quota.QuotaExceededException as e: except Quota.QuotaExceededException as e:
+20
View File
@@ -682,6 +682,26 @@ class OrderTestCase(BaseQuotaTestCase):
self.order = Order.objects.get(id=self.order.id) self.order = Order.objects.get(id=self.order.id)
self.assertEqual(self.order.status, Order.STATUS_PAID) self.assertEqual(self.order.status, Order.STATUS_PAID)
def test_paid_expired_unavailable_waiting_list(self):
self.event.waitinglistentries.create(item=self.item1, email='foo@bar.com')
self.order.expires = now() - timedelta(days=2)
self.order.save()
self.quota.size = 1
self.quota.save()
mark_order_paid(self.order, force=True)
self.order = Order.objects.get(id=self.order.id)
self.assertEqual(self.order.status, Order.STATUS_EXPIRED)
def test_paid_expired_unavailable_waiting_list_ignore(self):
self.event.waitinglistentries.create(item=self.item1, email='foo@bar.com')
self.order.expires = now() - timedelta(days=2)
self.order.save()
self.quota.size = 1
self.quota.save()
mark_order_paid(self.order, force=True, count_waitinglist=False)
self.order = Order.objects.get(id=self.order.id)
self.assertEqual(self.order.status, Order.STATUS_PAID)
def test_can_modify_answers(self): def test_can_modify_answers(self):
self.event.settings.set('invoice_address_asked', False) self.event.settings.set('invoice_address_asked', False)
self.event.settings.set('attendee_names_asked', True) self.event.settings.set('attendee_names_asked', True)
+19
View File
@@ -466,6 +466,25 @@ def test_order_extend_expired_quota_partial(client, env):
assert o.status == Order.STATUS_EXPIRED assert o.status == Order.STATUS_EXPIRED
@pytest.mark.django_db
def test_order_mark_paid_overdue_quota_blocked_by_waiting_list(client, env):
o = Order.objects.get(id=env[2].id)
o.status = Order.STATUS_EXPIRED
o.expires = now() - timedelta(days=5)
o.save()
q = Quota.objects.create(event=env[0], size=1)
q.items.add(env[3])
env[0].waitinglistentries.create(item=env[3], email='foo@bar.com')
client.login(email='dummy@dummy.dummy', password='dummy')
response = client.post('/control/event/dummy/dummy/orders/FOO/transition', {
'status': 'p'
}, follow=True)
assert 'alert-success' in response.rendered_content
o = Order.objects.get(id=env[2].id)
assert o.status == Order.STATUS_PAID
@pytest.mark.django_db @pytest.mark.django_db
def test_order_go_lowercase(client, env): def test_order_go_lowercase(client, env):
client.login(email='dummy@dummy.dummy', password='dummy') client.login(email='dummy@dummy.dummy', password='dummy')