lingo: remove non tracing check Regie.can_pay_only_one_basket_item (#46504)

This commit is contained in:
Benjamin Dauvergne 2020-10-02 18:07:24 +02:00
parent d38d1a4347
commit 6c53fdd37f
2 changed files with 37 additions and 16 deletions

View File

@ -49,6 +49,8 @@ from .models import (Regie, BasketItem, Transaction, TransactionOperation,
LingoBasketCell, SelfDeclaredInvoicePayment, PaymentBackend, EXPIRED)
from .utils import signing_dumps, signing_loads
logger = logging.getLogger(__name__)
class ErrorJsonResponse(JsonResponse):
def __init__(self, err_desc, *args, **kwargs):
@ -280,7 +282,6 @@ class ValidateTransactionApiView(View):
if not lingo_check_request_signature(request):
return HttpResponseForbidden()
logger = logging.getLogger(__name__)
try:
transaction = Transaction.objects.get(id=request.GET['transaction_id'])
except Transaction.DoesNotExist:
@ -320,7 +321,6 @@ class CancelTransactionApiView(View):
if not lingo_check_request_signature(request):
return HttpResponseForbidden()
logger = logging.getLogger(__name__)
try:
transaction = Transaction.objects.get(id=request.GET['transaction_id'])
except Transaction.DoesNotExist:
@ -351,14 +351,19 @@ class PayMixin(object):
def handle_payment(
self, request, regie, items, remote_items, next_url='/', email='', firstname='',
lastname=''):
# preconditions
assert bool(len(items)) != bool(len(remote_items)), (
'there should be at least one item or remote item to pay and not both'
)
if regie.can_pay_only_one_basket_item:
assert (len(items) == 1) or (len(remote_items) == 1), (
'regie can only pay one basket item, but handle_payment() received more'
)
# we cannot pay items and remote_items at the same time
if bool(len(items)) == bool(len(remote_items)):
logger.error('lingo: there should be at least one item or remote item to pay and not both items',
extra={'regie': str(regie), 'items': items, 'remote_items': remote_items})
messages.error(request, _('Grouping basket items is not allowed.'))
return HttpResponseRedirect(next_url)
# we cannot pay more than one item on regie with flag 'can_pay_only_one_basket_item'
if regie.can_pay_only_one_basket_item and len(items) != 1 and len(remote_items) != 1:
logger.error('lingo: regie can only pay one basket item, but handle_payment() received',
extra={'regie': str(regie), 'items': items, 'remote_items': remote_items})
messages.error(request, _('Grouping basket items is not allowed.'))
return HttpResponseRedirect(next_url)
total_amount = sum([x.amount for x in remote_items or items])
@ -413,7 +418,6 @@ class PayMixin(object):
kwargs['subject'] = remote_items[0].subject
if regie.transaction_options:
kwargs.update(regie.transaction_options)
logger = logging.getLogger(__name__)
try:
(order_id, kind, data) = payment.request(total_amount, **kwargs)
except eopayment.PaymentException as e:
@ -470,10 +474,6 @@ class PayView(PayMixin, View):
regie.compute_extra_fees(user=user)
items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie)
if regie.can_pay_only_one_basket_item and len(items) > 1:
messages.error(request, _('Grouping basket items is not allowed.'))
return HttpResponseRedirect(next_url)
if items:
capture_date = items[0].capture_date
for item in items:
@ -560,7 +560,6 @@ class PaymentView(View):
return HttpResponseBadRequest("A payment backend or regie primary key must be specified")
payment = get_eopayment_object(request, payment_backend)
logger = logging.getLogger(__name__)
logger.info(u'received payment response: %r', backend_response)
extra_info = kwargs.pop('payment_extra_info', {})
try:

View File

@ -1555,3 +1555,25 @@ def test_successfull_items_can_pay_only_one_basket_item(app, basket_page, regie,
resp = app.get('/test_basket_cell/')
assert 'foo item' not in resp.text
assert 'bar item' in resp.text
@mock.patch('combo.apps.lingo.models.BasketItem.get_items_to_be_paid')
def test_failure_can_only_pay_one_basket_item(get_items_to_be_paid, app, regie, user, user_name_id, caplog):
regie.can_pay_only_one_basket_item = True
regie.save()
item = mock.Mock(spec=['capture_date'], capture_date=None)
get_items_to_be_paid.return_value.filter.return_value = [item, item]
app.set_user(user)
response = app.get('/')
token = response.context['csrf_token']
assert '_messages' not in app.session
assert len(caplog.records) == 0
response = app.post('/lingo/pay', params={
'regie': regie.id,
'csrfmiddlewaretoken': token,
})
assert 'Grouping basket items is not allowed.' in app.session['_messages']
assert len(caplog.records) == 1
assert 'regie can only pay one basket item' in caplog.records[0].message