lingo: refactor payment view to make sure extra fees are computed (#16885)
This commit is contained in:
parent
44670d0433
commit
a5b4dd37f1
|
@ -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
|
||||
|
|
|
@ -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)
|
||||
|
|
Loading…
Reference in New Issue