lingo: refactor payment view (#25725)

This commit is contained in:
Serghei Mihai 2018-09-24 17:56:36 +02:00
parent 0aa43a78ac
commit 13bbfa8bf1
1 changed files with 65 additions and 59 deletions

View File

@ -292,14 +292,71 @@ class CancelTransactionApiView(View):
return response
class PayView(View):
class PayMixin(object):
@atomic
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:
total_amount = sum([x.amount for x in items])
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
email = user.email
firstname = user.first_name
lastname = user.last_name
else:
transaction.user = None
firstname = ''
lastname = ''
transaction.save()
transaction.regie = regie
transaction.items = items
transaction.remote_items = ','.join([x.id for x in remote_items])
transaction.status = 0
transaction.amount = total_amount
payment = get_eopayment_object(request, regie)
(order_id, kind, data) = payment.request(total_amount, email=email,
first_name=firstname,
last_name=lastname)
logger = logging.getLogger(__name__)
logger.info(u'emitted payment request with id %s', smart_text(order_id), extra={
'eopayment_order_id': smart_text(order_id), 'eopayment_data': repr(data)})
transaction.order_id = order_id
transaction.save()
# 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)
elif kind == eopayment.FORM:
return TemplateResponse(request, 'lingo/payment_form.html', {'form': data})
raise NotImplementedError()
class PayView(PayMixin, View):
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():
@ -322,67 +379,16 @@ class PayView(View):
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)
transaction = Transaction()
if user:
transaction.user = user
email = user.email
firstname = user.first_name
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 = ''
transaction.save()
transaction.regie = regie
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)
(order_id, kind, data) = payment.request(total_amount, email=email,
first_name=firstname,
last_name=lastname)
logger = logging.getLogger(__name__)
logger.info(u'emitted payment request with id %s', smart_text(order_id), extra={
'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
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 (?)
if kind == eopayment.URL:
return HttpResponseRedirect(data)
elif kind == eopayment.FORM:
return TemplateResponse(request, 'lingo/payment_form.html', {'form': data})
raise NotImplementedError()
return self.handle_payment(request, regie, items, remote_items, next_url, email)
class PaymentException(Exception):