From 6c53fdd37f9e82fa44884864a7ff41ade7ed9d74 Mon Sep 17 00:00:00 2001 From: Benjamin Dauvergne Date: Fri, 2 Oct 2020 18:07:24 +0200 Subject: [PATCH] lingo: remove non tracing check Regie.can_pay_only_one_basket_item (#46504) --- combo/apps/lingo/views.py | 31 +++++++++++++++---------------- tests/test_lingo_payment.py | 22 ++++++++++++++++++++++ 2 files changed, 37 insertions(+), 16 deletions(-) diff --git a/combo/apps/lingo/views.py b/combo/apps/lingo/views.py index 60e6affb..f38e9c89 100644 --- a/combo/apps/lingo/views.py +++ b/combo/apps/lingo/views.py @@ -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: diff --git a/tests/test_lingo_payment.py b/tests/test_lingo_payment.py index 56fca5ed..ce653653 100644 --- a/tests/test_lingo_payment.py +++ b/tests/test_lingo_payment.py @@ -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