From 70eb2ab0e31f8cffc1f27c9c485f00b8b8ba3a4f Mon Sep 17 00:00:00 2001 From: Serghei Mihai Date: Mon, 24 Sep 2018 17:56:36 +0200 Subject: [PATCH 1/2] lingo: refactor payment view (#25725) --- combo/apps/lingo/views.py | 110 ++++++++++++++++++++------------------ 1 file changed, 58 insertions(+), 52 deletions(-) diff --git a/combo/apps/lingo/views.py b/combo/apps/lingo/views.py index f06976ff..57cbd31a 100644 --- a/combo/apps/lingo/views.py +++ b/combo/apps/lingo/views.py @@ -292,40 +292,22 @@ class CancelTransactionApiView(View): return response -class PayView(View): - @atomic - def post(self, request, *args, **kwargs): - regie_id = request.POST.get('regie') - next_url = request.POST.get('next_url') or '/' - - user = request.user if request.user.is_authenticated() else None - - remote_items = [] - items = [] - if regie_id and Regie.objects.get(pk=regie_id).is_remote(): - regie = Regie.objects.get(pk=regie_id) - # get all items data from regie webservice - for item_id in request.POST.getlist('item'): - remote_items.append(regie.get_invoice(user, item_id)) +class PayMixin(object): + def handle_payment(self, request, regie, items, remote_items, next_url='/', email=''): + if remote_items: + total_amount = sum([x.amount for x in remote_items]) else: - if user is None: - messages.error(request, _(u'Payment requires to be logged in.')) - return HttpResponseRedirect(next_url) - - if not regie_id: - # take all items but check they're from the same regie - items = BasketItem.get_items_to_be_paid(user=user) - regie_id = items[0].regie_id - for item in items: - if item.regie_id != regie_id: - messages.error(request, _(u'Invalid grouping for basket items.')) - return HttpResponseRedirect(next_url) - - regie = Regie.objects.get(id=regie_id) + total_amount = sum([x.amount for x in items]) - regie.compute_extra_fees(user=user) - items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie) + if total_amount < regie.payment_min_amount: + messages.warning(request, _(u'Minimal payment amount is %s €.') % regie.payment_min_amount) + return HttpResponseRedirect(next_url) + for item in items: + if item.regie != regie: + messages.error(request, _(u'Invalid grouping for basket items.')) + return HttpResponseRedirect(next_url) + user = request.user if request.user.is_authenticated() else None transaction = Transaction() if user: transaction.user = user @@ -334,10 +316,6 @@ class PayView(View): lastname = user.last_name else: transaction.user = None - if not request.POST.get('email'): - messages.warning(request, _(u'You must give an email address.')) - return HttpResponseRedirect(request.POST.get('item_url')) - email = request.POST.get('email') firstname = '' lastname = '' @@ -346,17 +324,7 @@ class PayView(View): transaction.items = items transaction.remote_items = ','.join([x.id for x in remote_items]) transaction.status = 0 - - if remote_items: - total_amount = sum([x.amount for x in remote_items]) - else: - total_amount = sum([x.amount for x in items]) transaction.amount = total_amount - transaction.save() - - if total_amount < regie.payment_min_amount: - messages.warning(request, _(u'Minimal payment amount is %s €.') % regie.payment_min_amount) - return HttpResponseRedirect(next_url) payment = get_eopayment_object(request, regie) @@ -368,14 +336,12 @@ class PayView(View): 'eopayment_order_id': smart_text(order_id), 'eopayment_data': repr(data)}) transaction.order_id = order_id transaction.save() - if next_url: - # store the next url in session in order to be able to redirect to - # it if payment is canceled - request.session.setdefault('lingo_next_url', - {})[transaction.order_id] = request.build_absolute_uri(next_url) - request.session.modified = True - # XXX: mark basket items as being processed (?) + # store the next url in session in order to be able to redirect to + # it if payment is canceled + request.session.setdefault('lingo_next_url', + {})[order_id] = request.build_absolute_uri(next_url) + request.session.modified = True if kind == eopayment.URL: return HttpResponseRedirect(data) @@ -385,6 +351,46 @@ class PayView(View): raise NotImplementedError() +class PayView(PayMixin, View): + @atomic + def post(self, request, *args, **kwargs): + regie_id = request.POST.get('regie') + next_url = request.POST.get('next_url') or '/' + user = request.user if request.user.is_authenticated() else None + remote_items = [] + items = [] + if regie_id and Regie.objects.get(pk=regie_id).is_remote(): + regie = Regie.objects.get(pk=regie_id) + # get all items data from regie webservice + for item_id in request.POST.getlist('item'): + remote_items.append(regie.get_invoice(user, item_id)) + else: + if user is None: + messages.error(request, _(u'Payment requires to be logged in.')) + return HttpResponseRedirect(next_url) + + if not regie_id: + # take all items but check they're from the same regie + items = BasketItem.get_items_to_be_paid(user=user) + regie_id = items[0].regie_id + for item in items: + if item.regie_id != regie_id: + messages.error(request, _(u'Invalid grouping for basket items.')) + return HttpResponseRedirect(next_url) + + regie = Regie.objects.get(id=regie_id) + regie.compute_extra_fees(user=user) + items = BasketItem.get_items_to_be_paid(user=user).filter(regie=regie) + + if not user and not request.POST.get('email'): + messages.warning(request, _(u'You must give an email address.')) + return HttpResponseRedirect(request.POST.get('item_url')) + email = request.POST.get('email') + + # XXX: mark basket items as being processed (?) + return self.handle_payment(request, regie, items, remote_items, next_url, email) + + class PaymentException(Exception): pass -- 2.19.0