Projet

Général

Profil

0001-lingo-add-support-for-payment-services-returning-WAI.patch

Frédéric Péters, 31 janvier 2018 15:26

Télécharger (5,33 ko)

Voir les différences:

Subject: [PATCH] lingo: add support for payment services returning 'WAITING'
 as status (#19362)

 .../migrations/0031_basketitem_waiting_date.py     | 20 ++++++++++++
 combo/apps/lingo/models.py                         |  2 ++
 combo/apps/lingo/views.py                          | 11 +++++++
 tests/test_lingo_payment.py                        | 37 ++++++++++++++++++++++
 4 files changed, 70 insertions(+)
 create mode 100644 combo/apps/lingo/migrations/0031_basketitem_waiting_date.py
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
-