[FIX] (account, sale)_payment: fix URL generation in payment
Redirections are not correctly computed when the error or success urls already contain some query parameters, like the access token. We now use a function added in portal module that correctly computed the redirection using standard werkzeug methods.
This commit is contained in:
@@ -1,9 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from werkzeug import url_encode
|
||||
|
||||
from odoo import http, _
|
||||
from odoo.addons.portal.controllers.portal import _build_url_w_params
|
||||
from odoo.http import request, route
|
||||
|
||||
|
||||
@@ -68,7 +67,7 @@ class PaymentPortal(http.Controller):
|
||||
invoice_sudo = request.env['account.invoice'].sudo().browse(invoice_id)
|
||||
if not invoice_sudo:
|
||||
params['error'] = 'pay_invoice_invalid_doc'
|
||||
return request.redirect('%s?%s' % (error_url, url_encode(params)))
|
||||
return request.redirect(_build_url_w_params(error_url, params))
|
||||
|
||||
try:
|
||||
token = request.env['payment.token'].sudo().browse(int(pm_id))
|
||||
@@ -76,7 +75,7 @@ class PaymentPortal(http.Controller):
|
||||
token = False
|
||||
if not token:
|
||||
params['error'] = 'pay_invoice_invalid_token'
|
||||
return request.redirect('%s?%s' % (error_url, url_encode(params)))
|
||||
return request.redirect(_build_url_w_params(error_url, params))
|
||||
|
||||
# find an existing tx or create a new one
|
||||
tx = request.env['payment.transaction'].sudo()._check_or_create_invoice_tx(
|
||||
@@ -97,7 +96,7 @@ class PaymentPortal(http.Controller):
|
||||
res = tx.confirm_invoice_token()
|
||||
if res is not True:
|
||||
params['error'] = res
|
||||
return request.redirect('%s?%s' % (error_url, url_encode(params)))
|
||||
return request.redirect(_build_url_w_params(error_url, params))
|
||||
|
||||
params['success'] = 'pay_invoice'
|
||||
return request.redirect('%s?%s' % (success_url, url_encode(params)))
|
||||
return request.redirect(_build_url_w_params(success_url, params))
|
||||
|
||||
@@ -83,6 +83,24 @@ def get_records_pager(ids, current):
|
||||
return {}
|
||||
|
||||
|
||||
def _build_url_w_params(url_string, query_params, remove_duplicates=True):
|
||||
""" Rebuild a string url based on url_string and correctly compute query parameters
|
||||
using those present in the url and those given by query_params. Having duplicates in
|
||||
the final url is optional. For example:
|
||||
|
||||
* url_string = '/my?foo=bar&error=pay'
|
||||
* query_params = {'foo': 'bar2', 'alice': 'bob'}
|
||||
* if remove duplicates: result = '/my?foo=bar2&error=pay&alice=bob'
|
||||
* else: result = '/my?foo=bar&foo=bar2&error=pay&alice=bob'
|
||||
"""
|
||||
url = urls.url_parse(url_string)
|
||||
url_params = url.decode_query()
|
||||
if remove_duplicates: # convert to standard dict instead of werkzeug multidict to remove duplicates automatically
|
||||
url_params = url_params.to_dict()
|
||||
url_params.update(query_params)
|
||||
return url.replace(query=urls.url_encode(url_params)).to_url()
|
||||
|
||||
|
||||
class CustomerPortal(Controller):
|
||||
|
||||
MANDATORY_BILLING_FIELDS = ["name", "phone", "email", "street", "city", "country_id"]
|
||||
|
||||
@@ -1,9 +1,8 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Part of Odoo. See LICENSE file for full copyright and licensing details.
|
||||
|
||||
from werkzeug import url_encode
|
||||
|
||||
from odoo import http, _
|
||||
from odoo.addons.portal.controllers.portal import _build_url_w_params
|
||||
from odoo.http import request, route
|
||||
|
||||
|
||||
@@ -68,7 +67,7 @@ class PaymentPortal(http.Controller):
|
||||
order_sudo = request.env['sale.order'].sudo().browse(order_id)
|
||||
if not order_sudo:
|
||||
params['error'] = 'pay_sale_invalid_doc'
|
||||
return request.redirect('%s?%s' % (error_url, url_encode(params)))
|
||||
return request.redirect(_build_url_w_params(error_url, params))
|
||||
|
||||
try:
|
||||
token = request.env['payment.token'].sudo().browse(int(pm_id))
|
||||
@@ -76,7 +75,7 @@ class PaymentPortal(http.Controller):
|
||||
token = False
|
||||
if not token:
|
||||
params['error'] = 'pay_sale_invalid_token'
|
||||
return request.redirect('%s?%s' % (error_url, url_encode(params)))
|
||||
return request.redirect(_build_url_w_params(error_url, params))
|
||||
|
||||
# find an existing tx or create a new one
|
||||
tx = request.env['payment.transaction'].sudo()._check_or_create_sale_tx(
|
||||
@@ -97,7 +96,7 @@ class PaymentPortal(http.Controller):
|
||||
res = tx.confirm_sale_token()
|
||||
if res is not True:
|
||||
params['error'] = res
|
||||
return request.redirect('%s?%s' % (error_url, url_encode(params)))
|
||||
return request.redirect(_build_url_w_params(error_url, params))
|
||||
|
||||
params['success'] = 'pay_sale'
|
||||
return request.redirect('%s?%s' % (success_url, url_encode(params)))
|
||||
return request.redirect(_build_url_w_params(success_url, params))
|
||||
|
||||
Reference in New Issue
Block a user