Projet

Général

Profil

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

Serghei Mihai (congés, retour 15/05), 25 septembre 2018 21:15

Télécharger (6,83 ko)

Voir les différences:

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

 combo/apps/lingo/views.py | 108 ++++++++++++++++++++------------------
 1 file changed, 57 insertions(+), 51 deletions(-)
combo/apps/lingo/views.py
292 292
        return response
293 293

  
294 294

  
295
class PayView(View):
295
class PayMixin(object):
296 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 '/'
300

  
301
        user = request.user if request.user.is_authenticated() else None
302

  
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))
297
    def handle_payment(self, request, regie, items, remote_items, next_url='/', email=''):
298
        if remote_items:
299
            total_amount = sum([x.amount for x in remote_items])
310 300
        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)
323

  
324
            regie = Regie.objects.get(id=regie_id)
301
            total_amount = sum([x.amount for x in items])
325 302

  
326
            regie.compute_extra_fees(user=user)
327
            items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie)
303
        if total_amount < regie.payment_min_amount:
304
            messages.warning(request, _(u'Minimal payment amount is %s €.') % regie.payment_min_amount)
305
            return HttpResponseRedirect(next_url)
328 306

  
307
        for item in items:
308
            if item.regie != regie:
309
                messages.error(request, _(u'Invalid grouping for basket items.'))
310
                return HttpResponseRedirect(next_url)
311
        user = request.user if request.user.is_authenticated() else None
329 312
        transaction = Transaction()
330 313
        if user:
331 314
            transaction.user = user
......
334 317
            lastname = user.last_name
335 318
        else:
336 319
            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 320
            firstname = ''
342 321
            lastname = ''
343 322

  
......
346 325
        transaction.items = items
347 326
        transaction.remote_items = ','.join([x.id for x in remote_items])
348 327
        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 328
        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 329

  
361 330
        payment = get_eopayment_object(request, regie)
362 331

  
......
368 337
            'eopayment_order_id': smart_text(order_id), 'eopayment_data': repr(data)})
369 338
        transaction.order_id = order_id
370 339
        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 340

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

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

  
387 354

  
355
class PayView(PayMixin, View):
356
    def post(self, request, *args, **kwargs):
357
        regie_id = request.POST.get('regie')
358
        next_url = request.POST.get('next_url') or '/'
359
        user = request.user if request.user.is_authenticated() else None
360
        remote_items = []
361
        items = []
362
        if regie_id and Regie.objects.get(pk=regie_id).is_remote():
363
            regie = Regie.objects.get(pk=regie_id)
364
            # get all items data from regie webservice
365
            for item_id in request.POST.getlist('item'):
366
                remote_items.append(regie.get_invoice(user, item_id))
367
        else:
368
            if user is None:
369
                messages.error(request, _(u'Payment requires to be logged in.'))
370
                return HttpResponseRedirect(next_url)
371

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

  
381
            regie = Regie.objects.get(id=regie_id)
382
            regie.compute_extra_fees(user=user)
383
            items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie)
384

  
385
        if not user and not request.POST.get('email'):
386
            messages.warning(request, _(u'You must give an email address.'))
387
            return HttpResponseRedirect(request.POST.get('item_url'))
388
        email = request.POST.get('email')
389

  
390
        # XXX: mark basket items as being processed (?)
391
        return self.handle_payment(request, regie, items, remote_items, next_url, email)
392

  
393

  
388 394
class PaymentException(Exception):
389 395
    pass
390 396

  
391
-