lingo: return url redirects to the page that initiated the payment (#9854)

This commit is contained in:
Serghei Mihai 2016-02-03 10:49:47 +01:00 committed by Frédéric Péters
parent 72c4b68247
commit 967a9c0681
3 changed files with 16 additions and 11 deletions

View File

@ -3,6 +3,7 @@
<h2>{% trans "Basket" %}</h2>
<form action="{% url 'lingo-pay' %}" method="POST">
{% csrf_token %}
<input type="hidden" name="next_url" value="{{ cell.page.get_online_url }}" />
<ul>
{% for item in items %}
<li><label><input type="checkbox" name="item" value="{{ item.id }}" checked/> {{ item.subject }}: {{ item.amount }} €</label> (<a href="{{ item.source_url}}">voir</a>)</li>

View File

@ -117,6 +117,7 @@ class AddBasketItemApiView(View):
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:
regie = Regie.objects.get(pk=regie_id)
if regie.is_remote():
@ -164,6 +165,11 @@ class PayView(View):
next_url=return_url)
transaction.order_id = order_id
transaction.save()
if next_url:
# store the next url in session in order to be able to redirect to
# it if payment is canceled
request.session.setdefault('lingo_next_url',
{})[transaction.order_id] = request.build_absolute_uri(next_url)
# XXX: mark basket items as being processed (?)
@ -236,17 +242,11 @@ class ReturnView(View):
transaction = Transaction.objects.get(order_id=payment_response.order_id)
if transaction.items:
# redirect to first transaction local item view
return HttpResponseRedirect(reverse('view-item',
kwargs={'regie_id': regie.pk,
'item_id': transaction.items[0].id}))
if transaction.remote_items:
# redirect to first transaction remote item view
item = transaction.remote_items.split(',')[0]
return HttpResponseRedirect(reverse('view-item',
kwargs={'regie_id': regie.pk,
'item_id': item.id}))
if request.session.get('lingo_next_url'):
redirect_url = request.session['lingo_next_url'].get(transaction.order_id, '/')
return HttpResponseRedirect(redirect_url)
return HttpResponseRedirect('/')
class ItemDownloadView(View):

View File

@ -149,3 +149,7 @@ def test_payment_callback(regie, user):
content_type='text/html')
assert post_resp.status_code == 200
assert Transaction.objects.get(order_id=transaction_id).status == 3
# call return view
get_resp = client.get(reverse('lingo-return', kwargs={'regie_pk': regie.pk}), data)
assert get_resp.status_code == 302