Projet

Général

Profil

0001-lingo-refactor-payment-view-25725.patch

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

Télécharger (7,05 ko)

Voir les différences:

Subject: [PATCH 1/2] lingo: refactor payment view (#25725)

 combo/apps/lingo/views.py | 111 +++++++++++++++++++++-----------------
 1 file changed, 61 insertions(+), 50 deletions(-)
combo/apps/lingo/views.py
292 292
        return response
293 293

  
294 294

  
295
class PayView(View):
296
    @atomic
297
    def post(self, request, *args, **kwargs):
298
        regie_id = request.POST.get('regie')
299
        next_url = request.POST.get('next_url') or '/'
295
class PayMixin(object):
300 296

  
301
        user = request.user if request.user.is_authenticated() else None
297
    def handle_payment(self, request, regie, items, remote_items=[], next_url='/', email=''):
302 298

  
303
        remote_items = []
304
        items = []
305
        if regie_id and Regie.objects.get(pk=regie_id).is_remote():
306
            regie = Regie.objects.get(pk=regie_id)
307
            # get all items data from regie webservice
308
            for item_id in request.POST.getlist('item'):
309
                remote_items.append(regie.get_invoice(user, item_id))
299
        if remote_items:
300
            total_amount = sum([x.amount for x in remote_items])
310 301
        else:
311
            if user is None:
312
                messages.error(request, _(u'Payment requires to be logged in.'))
313
                return HttpResponseRedirect(next_url)
314

  
315
            if not regie_id:
316
                # take all items but check they're from the same regie
317
                items = BasketItem.get_items_to_be_paid(user=user)
318
                regie_id = items[0].regie_id
319
                for item in items:
320
                    if item.regie_id != regie_id:
321
                        messages.error(request, _(u'Invalid grouping for basket items.'))
322
                        return HttpResponseRedirect(next_url)
302
            total_amount = sum([x.amount for x in items])
323 303

  
324
            regie = Regie.objects.get(id=regie_id)
304
        if total_amount < regie.payment_min_amount:
305
            messages.warning(request, _(u'Minimal payment amount is %s €.') % regie.payment_min_amount)
306
            return HttpResponseRedirect(next_url)
325 307

  
326
            regie.compute_extra_fees(user=user)
327
            items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie)
308
        for item in items:
309
            if item.regie != regie:
310
                messages.error(request, _(u'Invalid grouping for basket items.'))
311
                return HttpResponseRedirect(next_url)
328 312

  
313
        user = request.user if request.user.is_authenticated() else None
329 314
        transaction = Transaction()
330 315
        if user:
331 316
            transaction.user = user
......
334 319
            lastname = user.last_name
335 320
        else:
336 321
            transaction.user = None
337
            if not request.POST.get('email'):
338
                messages.warning(request, _(u'You must give an email address.'))
339
                return HttpResponseRedirect(request.POST.get('item_url'))
340
            email = request.POST.get('email')
341 322
            firstname = ''
342 323
            lastname = ''
343 324

  
......
346 327
        transaction.items = items
347 328
        transaction.remote_items = ','.join([x.id for x in remote_items])
348 329
        transaction.status = 0
349

  
350
        if remote_items:
351
            total_amount = sum([x.amount for x in remote_items])
352
        else:
353
            total_amount = sum([x.amount for x in items])
354 330
        transaction.amount = total_amount
355
        transaction.save()
356

  
357
        if total_amount < regie.payment_min_amount:
358
            messages.warning(request, _(u'Minimal payment amount is %s €.') % regie.payment_min_amount)
359
            return HttpResponseRedirect(next_url)
360 331

  
361 332
        payment = get_eopayment_object(request, regie)
362

  
363 333
        (order_id, kind, data) = payment.request(total_amount, email=email,
364 334
                                            first_name=firstname,
365 335
                                            last_name=lastname)
......
368 338
            'eopayment_order_id': smart_text(order_id), 'eopayment_data': repr(data)})
369 339
        transaction.order_id = order_id
370 340
        transaction.save()
371
        if next_url:
372
            # store the next url in session in order to be able to redirect to
373
            # it if payment is canceled
374
            request.session.setdefault('lingo_next_url',
375
                                {})[transaction.order_id] = request.build_absolute_uri(next_url)
376
            request.session.modified = True
377 341

  
378
        # XXX: mark basket items as being processed (?)
342
        # store the next url in session in order to be able to redirect to
343
        # it if payment is canceled
344
        request.session.setdefault('lingo_next_url',
345
                                   {})[order_id] = request.build_absolute_uri(next_url)
346
        request.session.modified = True
379 347

  
380 348
        if kind == eopayment.URL:
381 349
            return HttpResponseRedirect(data)
......
385 353
        raise NotImplementedError()
386 354

  
387 355

  
356
class PayView(PayMixin, View):
357
    @atomic
358
    def post(self, request, *args, **kwargs):
359
        regie_id = request.POST.get('regie')
360
        next_url = request.POST.get('next_url') or '/'
361

  
362
        user = request.user if request.user.is_authenticated() else None
363

  
364
        remote_items = []
365
        items = []
366
        if regie_id and Regie.objects.get(pk=regie_id).is_remote():
367
            regie = Regie.objects.get(pk=regie_id)
368
            # get all items data from regie webservice
369
            for item_id in request.POST.getlist('item'):
370
                remote_items.append(regie.get_invoice(user, item_id))
371
        else:
372
            if user is None:
373
                messages.error(request, _(u'Payment requires to be logged in.'))
374
                return HttpResponseRedirect(next_url)
375

  
376
            if not regie_id:
377
                # take all items but check they're from the same regie
378
                items = BasketItem.get_items_to_be_paid(user=user)
379
                regie_id = items[0].regie_id
380
                for item in items:
381
                    if item.regie_id != regie_id:
382
                        messages.error(request, _(u'Invalid grouping for basket items.'))
383
                        return HttpResponseRedirect(next_url)
384

  
385
            regie = Regie.objects.get(id=regie_id)
386

  
387
            regie.compute_extra_fees(user=user)
388
            items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie)
389

  
390
        if not user and not request.POST.get('email'):
391
            messages.warning(request, _(u'You must give an email address.'))
392
            return HttpResponseRedirect(request.POST.get('item_url'))
393
        email = request.POST.get('email')
394

  
395
        # XXX: mark basket items as being processed (?)
396
        return self.handle_payment(request, regie, items, remote_items, next_url, email)
397

  
398

  
388 399
class PaymentException(Exception):
389 400
    pass
390 401

  
391
-