Projet

Général

Profil

0002-lingo-handle-single-basket-item-payment-25725.patch

Serghei Mihai (congés, retour 15/05), 20 septembre 2018 16:03

Télécharger (5,27 ko)

Voir les différences:

Subject: [PATCH 2/2] lingo: handle single basket item payment (#25725)

 combo/apps/lingo/urls.py    |  4 +++-
 combo/apps/lingo/views.py   | 19 ++++++++++++++++++-
 tests/test_lingo_payment.py | 27 ++++++++++++++++++++++++++-
 3 files changed, 47 insertions(+), 3 deletions(-)
combo/apps/lingo/urls.py
21 21
from .views import (RegiesApiView, AddBasketItemApiView, PayView, CallbackView,
22 22
                    ReturnView, ItemDownloadView, ItemView, CancelItemView,
23 23
                    RemoveBasketItemApiView, ValidateTransactionApiView,
24
                    CancelTransactionApiView, SelfInvoiceView)
24
                    CancelTransactionApiView, SelfInvoiceView, BasketItemPayView)
25 25
from .manager_views import (RegieListView, RegieCreateView, RegieUpdateView,
26 26
        RegieDeleteView, TransactionListView, download_transactions_csv)
27 27

  
......
56 56
        ItemDownloadView.as_view(), name='download-item-pdf'),
57 57
    url(r'^lingo/item/(?P<regie_id>[\w,-]+)/(?P<item_crypto_id>[\w,-]+)/$',
58 58
        ItemView.as_view(), name='view-item'),
59
    url(r'^lingo/regie/(?P<regie_id>[\w,-]+)/item/(?P<item_id>[\w,-]+)/pay$',
60
        BasketItemPayView.as_view(), name='basket-item-pay-view'),
59 61
    url(r'^lingo/self-invoice/(?P<cell_id>\w+)/$', SelfInvoiceView.as_view(),
60 62
        name='lingo-self-invoice'),
61 63
]
combo/apps/lingo/views.py
165 165
        item.regie.compute_extra_fees(user=item.user)
166 166

  
167 167
        response = HttpResponse(content_type='application/json')
168
        response.write(json.dumps({'result': 'success', 'id': str(item.id)}))
168
        payment_url = reverse('basket-item-pay-view', kwargs={
169
                    'regie_id': item.regie.id, 'item_id': item.id})
170
        response.write(json.dumps({'result': 'success', 'id': str(item.id),
171
                                   'payment_url': request.build_absolute_uri(payment_url)}))
169 172
        return response
170 173

  
171 174

  
......
396 399
        return self.handle_payment(request, regie, items, remote_items, next_url, email)
397 400

  
398 401

  
402
class BasketItemPayView(PayMixin, View):
403
    @atomic
404
    def get(self, request, *args, **kwargs):
405
        next_url = request.GET.get('next_url') or '/'
406
        user = request.user if request.user.is_authenticated() else None
407
        if user is None:
408
            messages.error(request, _(u'Payment requires to be logged in.'))
409
            return HttpResponseRedirect(next_url)
410

  
411
        regie = Regie.objects.get(pk=kwargs['regie_id'])
412
        item = BasketItem.objects.get(pk=kwargs['item_id'])
413
        return self.handle_payment(request, regie, [item], next_url=next_url)
414

  
415

  
399 416
class PaymentException(Exception):
400 417
    pass
401 418

  
tests/test_lingo_payment.py
199 199
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user_email)
200 200
    url = sign_url(url, settings.LINGO_API_SIGN_KEY)
201 201
    resp = app.post_json(url, params=data)
202
    item = BasketItem.objects.get(amount=Decimal('22.23'))
202 203
    assert resp.status_code == 200
203
    assert json.loads(resp.content)['result'] == 'success'
204
    response = json.loads(resp.content)
205
    assert response['result'] == 'success'
206
    assert response['payment_url'].endswith('/lingo/regie/%s/item/%s/pay' % (other_regie.id, item.id))
204 207
    assert BasketItem.objects.filter(amount=Decimal('22.23')).exists()
205 208
    assert BasketItem.objects.filter(amount=Decimal('22.23'))[0].regie_id == other_regie.id
206 209

  
......
230 233
    resp = app.post_json(url, params=data, status=400)
231 234
    assert resp.text == 'Unknown regie'
232 235

  
236
def test_pay_single_basket_item(app, key, regie, user):
237
    page = Page(title='xxx', slug='index', template_name='standard')
238
    page.save()
239
    cell = LingoBasketCell(page=page, placeholder='content', order=0)
240
    cell.save()
241

  
242
    amount = 12
243
    data = {'amount': amount, 'display_name': 'test amount',
244
            'url': 'http://example.com'}
245
    url = '%s?email=%s&orig=wcs' % (reverse('api-add-basket-item'), user.email)
246
    url = sign_url(url, key)
247
    resp = app.post_json(url, params=data)
248
    payment_url = json.loads(resp.content)['payment_url']
249
    resp = app.get(payment_url)
250
    resp = resp.follow()
251
    assert 'Payment requires to be logged in.' in resp.text
252
    login(app)
253
    resp = app.get(payment_url)
254
    assert resp.location.startswith('http://dummy-payment.demo.entrouvert.com/')
255
    qs = urlparse.parse_qs(urlparse.urlparse(resp.location).query)
256
    assert qs['amount'] == ['12.00']
257

  
233 258
def test_pay_multiple_regies(app, key, regie, user):
234 259
    test_add_amount_to_basket(app, key, regie, user)
235 260

  
236
-