Projet

Général

Profil

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

Serghei Mihai (congés, retour 15/05), 24 septembre 2018 18:26

Télécharger (5,46 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   | 21 ++++++++++++++++++++-
 tests/test_lingo_payment.py | 32 +++++++++++++++++++++++++++++++-
 3 files changed, 54 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/item/(?P<item_id>\d+)/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={'item_id': item.id})
169
        response.write(json.dumps({'result': 'success', 'id': str(item.id),
170
                                   'payment_url': request.build_absolute_uri(payment_url)}))
169 171
        return response
170 172

  
171 173

  
......
391 393
        return self.handle_payment(request, regie, items, remote_items, next_url, email)
392 394

  
393 395

  
396
class BasketItemPayView(PayMixin, View):
397
    @atomic
398
    def get(self, request, *args, **kwargs):
399
        next_url = request.GET.get('next_url') or '/'
400
        if request.user and request.user.is_authenticated():
401
            item = BasketItem.objects.get(pk=kwargs['item_id'])
402
            regie = item.regie
403
            if item.user != request.user or regie.extra_fees_ws_url:
404
                messages.error(request, _(u'Item payment forbidden.'))
405
                return HttpResponseRedirect(next_url)
406

  
407
            return self.handle_payment(request, regie, [item], [], next_url)
408

  
409
        messages.error(request, _(u'Payment requires to be logged in.'))
410
        return HttpResponseRedirect(next_url)
411

  
412

  
394 413
class PaymentException(Exception):
395 414
    pass
396 415

  
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/item/%s/pay' % 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, john_doe):
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).follow()
250
    assert 'Payment requires to be logged in.' in resp.text
251

  
252
    login(app, username='john.doe', password='john.doe')
253
    resp = app.get(payment_url).follow()
254
    assert 'Item payment forbidden.' in resp.text
255

  
256
    app.reset()
257
    login(app)
258
    resp = app.get(payment_url)
259
    assert resp.location.startswith('http://dummy-payment.demo.entrouvert.com/')
260
    qs = urlparse.parse_qs(urlparse.urlparse(resp.location).query)
261
    assert qs['amount'] == ['12.00']
262

  
233 263
def test_pay_multiple_regies(app, key, regie, user):
234 264
    test_add_amount_to_basket(app, key, regie, user)
235 265

  
236
-