lingo: refactor payment view to make sure extra fees are computed (#16885)

This commit is contained in:
Frédéric Péters 2017-06-14 15:46:10 +02:00
parent 44670d0433
commit a5b4dd37f1
2 changed files with 41 additions and 25 deletions

View File

@ -293,33 +293,33 @@ class PayView(View):
def post(self, request, *args, **kwargs):
regie_id = request.POST.get('regie')
next_url = request.POST.get('next_url')
if regie_id:
remote_items = []
items = []
if regie_id and Regie.objects.get(pk=regie_id).is_remote():
regie = Regie.objects.get(pk=regie_id)
if regie.is_remote():
items = []
remote_items_data = []
# get all items data from regie webservice
for item_id in request.POST.getlist('item'):
remote_items_data.append(regie.get_invoice(request.user, item_id))
remote_items = ','.join([x.id for x in remote_items_data])
else:
regie.compute_extra_fees(user=self.request.user)
items = BasketItem.objects.filter(user=self.request.user,
regie=regie, payment_date__isnull=True,
cancellation_date__isnull=True)
remote_items = ''
# get all items data from regie webservice
for item_id in request.POST.getlist('item'):
remote_items.append(regie.get_invoice(request.user, item_id))
else:
if not regie_id:
# take all items but check they're from the same regie
items = BasketItem.objects.filter(user=self.request.user,
payment_date__isnull=True,
cancellation_date__isnull=True)
regie_id = items[0].regie_id
for item in items:
if item.regie_id != regie_id:
messages.error(request, _(u'Invalid grouping for basket items.'))
return HttpResponseRedirect(next_url)
regie = Regie.objects.get(id=regie_id)
regie.compute_extra_fees(user=self.request.user)
items = BasketItem.objects.filter(user=self.request.user,
payment_date__isnull=True,
cancellation_date__isnull=True)
regie_id = items[0].regie_id
for item in items:
if item.regie_id != regie_id:
messages.error(request, _(u'Invalid grouping for basket items.'))
return HttpResponseRedirect(next_url)
regie = items[0].regie
remote_items = ''
cancellation_date__isnull=True,
regie=regie)
transaction = Transaction()
if request.user.is_authenticated():
@ -339,11 +339,11 @@ class PayView(View):
transaction.save()
transaction.regie = regie
transaction.items = items
transaction.remote_items = remote_items
transaction.remote_items = ','.join([x.id for x in remote_items])
transaction.status = 0
if remote_items:
total_amount = sum([x.amount for x in remote_items_data])
total_amount = sum([x.amount for x in remote_items])
else:
total_amount = sum([x.amount for x in items])
transaction.amount = total_amount

View File

@ -552,6 +552,22 @@ def test_extra_fees(key, regie, user):
'amount': qs['amount'][0], 'ok': True}
assert data['amount'] == '44.00'
# test again, without specifying a regie
with mock.patch('combo.utils.RequestsSession.request') as request:
mock_json = mock.Mock()
mock_json.status_code = 200
mock_json.json.return_value = {'err': 0, 'data': [{'subject': 'Extra Fees', 'amount': '3'}]}
request.return_value = mock_json
resp = client.post(reverse('lingo-pay'))
assert resp.status_code == 302
location = resp.get('location')
parsed = urlparse.urlparse(location)
qs = urlparse.parse_qs(parsed.query)
transaction_id = qs['transaction_id'][0]
data = {'transaction_id': transaction_id, 'signed': True,
'amount': qs['amount'][0], 'ok': True}
assert data['amount'] == '45.00'
# call callback with GET
callback_url = reverse('lingo-callback', kwargs={'regie_pk': regie.id})
resp = client.get(callback_url, data)