I assume this was necessary before the migration of payment because an api.one wrapper was added by the auto-guess api feature. Since payment has been migrated, this decorator is no longer present and the result of _registration_render is no longer encapsulated in a list. Therefore, taking the zeroth element was akin to taking only the first character of the rendered html. Usually \n, which is not useful but which also prevented the crash to be easily visible.
84 lines
4.3 KiB
Python
84 lines
4.3 KiB
Python
# -*- coding: utf-8 -*-
|
|
from openerp import http
|
|
from openerp.http import request
|
|
from openerp.tools.translate import _
|
|
|
|
|
|
class website_payment(http.Controller):
|
|
@http.route(['/my/payment_method'], type='http', auth="user", website=True)
|
|
def payment_method(self):
|
|
acquirers = list(request.env['payment.acquirer'].search([('website_published', '=', True), ('registration_view_template_id', '!=', False)]))
|
|
partner = request.env.user.partner_id
|
|
payment_tokens = partner.payment_token_ids
|
|
payment_tokens |= partner.commercial_partner_id.sudo().payment_token_ids
|
|
values = {
|
|
'pms': payment_tokens,
|
|
'acquirers': acquirers
|
|
}
|
|
for acquirer in acquirers:
|
|
acquirer.form = acquirer.sudo()._registration_render(request.env.user.partner_id.id, {'error': {}, 'error_message': [], 'return_url': '/my/payment_method', 'json': False, 'bootstrap_formatting': True})
|
|
return request.website.render("website_payment.pay_methods", values)
|
|
|
|
@http.route(['/website_payment/delete/'], methods=['POST'], type='http', auth="user", website=True)
|
|
def delete(self, delete_pm_id=None):
|
|
if delete_pm_id:
|
|
pay_meth = request.env['payment.token'].browse(int(delete_pm_id))
|
|
pay_meth.unlink()
|
|
return request.redirect('/my/payment_method')
|
|
|
|
@http.route(['/website_payment/pay'], type='http', auth='public', website=True)
|
|
def pay(self, reference='', amount=False, currency_id=None, acquirer_id=None, **kw):
|
|
env = request.env
|
|
user = env.user.sudo()
|
|
|
|
currency_id = currency_id and int(currency_id) or user.company_id.currency_id.id
|
|
currency = env['res.currency'].browse(currency_id)
|
|
|
|
# Try default one then fallback on first
|
|
acquirer_id = acquirer_id and int(acquirer_id) or \
|
|
env['ir.values'].get_default('payment.transaction', 'acquirer_id', company_id=user.company_id.id) or \
|
|
env['payment.acquirer'].search([('website_published', '=', True), ('company_id', '=', user.company_id.id)])[0].id
|
|
|
|
acquirer = env['payment.acquirer'].with_context(submit_class='btn btn-primary pull-right',
|
|
submit_txt=_('Pay Now')).browse(acquirer_id)
|
|
# auto-increment reference with a number suffix if the reference already exists
|
|
reference = request.env['payment.transaction'].get_next_reference(reference)
|
|
|
|
partner_id = user.partner_id.id if user.partner_id.id != request.website.partner_id.id else False
|
|
|
|
payment_form = acquirer.render(reference, float(amount), currency.id, values={'return_url': '/website_payment/confirm', 'partner_id': partner_id})
|
|
values = {
|
|
'reference': reference,
|
|
'acquirer': acquirer,
|
|
'currency': currency,
|
|
'amount': float(amount),
|
|
'payment_form': payment_form,
|
|
}
|
|
return request.website.render('website_payment.pay', values)
|
|
|
|
@http.route(['/website_payment/transaction'], type='json', auth="public", website=True)
|
|
def transaction(self, reference, amount, currency_id, acquirer_id):
|
|
partner_id = request.env.user.partner_id.id if request.env.user.partner_id != request.website.partner_id else False
|
|
values = {
|
|
'acquirer_id': int(acquirer_id),
|
|
'reference': reference,
|
|
'amount': float(amount),
|
|
'currency_id': int(currency_id),
|
|
'partner_id': partner_id,
|
|
}
|
|
|
|
tx = request.env['payment.transaction'].sudo().create(values)
|
|
request.session['website_payment_tx_id'] = tx.id
|
|
return tx.id
|
|
|
|
@http.route(['/website_payment/confirm'], type='http', auth='public', website=True)
|
|
def confirm(self, **kw):
|
|
tx_id = request.session.pop('website_payment_tx_id', False)
|
|
if tx_id:
|
|
tx = request.env['payment.transaction'].browse(tx_id)
|
|
status = (tx.state == 'done' and 'success') or 'danger'
|
|
message = (tx.state == 'done' and 'Your payment was successful! It may take some time to be validated on our end.') or 'OOps! There was a problem with your payment.'
|
|
return request.website.render('website_payment.confirm', {'tx': tx, 'status': status, 'message': message})
|
|
else:
|
|
return request.redirect('/my/home')
|