0001-lingo-add-support-for-payment-services-returning-WAI.patch
combo/apps/lingo/migrations/0031_basketitem_waiting_date.py | ||
---|---|---|
1 |
# -*- coding: utf-8 -*- |
|
2 |
# Generated by Django 1.11.8 on 2018-01-31 14:24 |
|
3 |
from __future__ import unicode_literals |
|
4 | ||
5 |
from django.db import migrations, models |
|
6 | ||
7 | ||
8 |
class Migration(migrations.Migration): |
|
9 | ||
10 |
dependencies = [ |
|
11 |
('lingo', '0030_transaction_to_be_paid_remote_items'), |
|
12 |
] |
|
13 | ||
14 |
operations = [ |
|
15 |
migrations.AddField( |
|
16 |
model_name='basketitem', |
|
17 |
name='waiting_date', |
|
18 |
field=models.DateTimeField(null=True), |
|
19 |
), |
|
20 |
] |
combo/apps/lingo/models.py | ||
---|---|---|
217 | 217 |
user_cancellable = models.BooleanField(default=True) |
218 | 218 |
creation_date = models.DateTimeField(auto_now_add=True) |
219 | 219 |
cancellation_date = models.DateTimeField(null=True) |
220 |
waiting_date = models.DateTimeField(null=True) |
|
220 | 221 |
payment_date = models.DateTimeField(null=True) |
221 | 222 |
notification_date = models.DateTimeField(null=True) |
222 | 223 | |
... | ... | |
228 | 229 |
return cls.objects.filter( |
229 | 230 |
user=user, |
230 | 231 |
payment_date__isnull=True, |
232 |
waiting_date__isnull=True, |
|
231 | 233 |
cancellation_date__isnull=True) |
232 | 234 | |
233 | 235 |
def notify(self, status): |
combo/apps/lingo/views.py | ||
---|---|---|
436 | 436 |
if not transaction.regie == regie: |
437 | 437 |
return HttpResponseBadRequest('Invalid payment regie') |
438 | 438 | |
439 |
if payment_response.result == eopayment.WAITING: |
|
440 |
# mark basket items as waiting for payment confirmation |
|
441 |
transaction.items.all().update(waiting_date=timezone.now()) |
|
442 |
return HttpResponse() |
|
443 | ||
444 |
if payment_response.result == eopayment.CANCELLED: |
|
445 |
# mark basket items as no longer waiting so the user can restart a |
|
446 |
# payment. |
|
447 |
transaction.items.all().update(waiting_date=None) |
|
448 |
return HttpResponse() |
|
449 | ||
439 | 450 |
if payment_response.result not in (eopayment.PAID, eopayment.ACCEPTED): |
440 | 451 |
return HttpResponse() |
441 | 452 |
tests/test_lingo_payment.py | ||
---|---|---|
445 | 445 |
get_resp = client.get(callback_url, data) |
446 | 446 |
assert get_resp.status_code == 404 |
447 | 447 | |
448 |
def test_payment_callback_waiting(regie, user): |
|
449 |
item = BasketItem.objects.create(user=user, regie=regie, |
|
450 |
subject='test_item', amount='10.5', |
|
451 |
source_url='http://example.org/testitem/') |
|
452 |
login() |
|
453 |
resp = client.post(reverse('lingo-pay'), {'regie': regie.pk}) |
|
454 |
assert resp.status_code == 302 |
|
455 |
location = resp.get('location') |
|
456 |
parsed = urlparse.urlparse(location) |
|
457 |
qs = urlparse.parse_qs(parsed.query) |
|
458 |
transaction_id = qs['transaction_id'][0] |
|
459 |
data = {'transaction_id': transaction_id, 'signed': True, |
|
460 |
'amount': qs['amount'][0], 'waiting': True} |
|
461 |
assert data['amount'] == '10.50' |
|
462 | ||
463 |
# callback with WAITING state |
|
464 |
callback_url = reverse('lingo-callback', kwargs={'regie_pk': regie.id}) |
|
465 |
resp = client.get(callback_url, data) |
|
466 |
assert resp.status_code == 200 |
|
467 |
assert Transaction.objects.get(order_id=transaction_id).status == eopayment.WAITING |
|
468 |
assert BasketItem.objects.get(id=item.id).waiting_date |
|
469 |
assert not BasketItem.objects.get(id=item.id).payment_date |
|
470 |
assert BasketItem.get_items_to_be_paid(user).count() == 0 |
|
471 | ||
472 |
# callback with PAID state |
|
473 |
data = {'transaction_id': transaction_id, 'signed': True, |
|
474 |
'amount': qs['amount'][0], 'ok': True} |
|
475 |
with mock.patch('combo.utils.requests_wrapper.RequestsSession.request') as request: |
|
476 |
resp = client.get(callback_url, data) |
|
477 |
assert resp.status_code == 200 |
|
478 |
url = request.call_args[0][1] |
|
479 |
assert url.startswith('http://example.org/testitem/jump/trigger/paid') |
|
480 | ||
481 |
assert Transaction.objects.get(order_id=transaction_id).status == eopayment.PAID |
|
482 |
assert BasketItem.objects.get(id=item.id).payment_date |
|
483 |
assert BasketItem.get_items_to_be_paid(user).count() == 0 |
|
484 | ||
448 | 485 |
def test_transaction_expiration(): |
449 | 486 |
t1 = Transaction(status=0) |
450 | 487 |
t1.save() |
451 |
- |