lingo: refactor payment view (#25725)
This commit is contained in:
parent
0aa43a78ac
commit
13bbfa8bf1
|
@ -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):
|
||||
|
|
Loading…
Reference in New Issue