diff --git a/addons/payment_stripe/static/src/js/stripe.js b/addons/payment_stripe/static/src/js/stripe.js index 7338313e245..6952366f133 100644 --- a/addons/payment_stripe/static/src/js/stripe.js +++ b/addons/payment_stripe/static/src/js/stripe.js @@ -42,7 +42,7 @@ odoo.define('payment_stripe.stripe', function(require) { return false; } - var so_token = $("input[name='token']").val(); + var access_token = $("input[name='token']").val(); var so_id = $("input[name='return_url']").val().match(/quote\/([0-9]+)/) || undefined; if (so_id) { so_id = parseInt(so_id[1]); @@ -65,7 +65,7 @@ odoo.define('payment_stripe.stripe', function(require) { } else { ajax.jsonRpc('/shop/payment/transaction/' + acquirer_id, 'call', { so_id: so_id, - so_token: so_token + access_token: access_token }, {'async': false}).then(function (data) { $form.html(data); handler.open({ diff --git a/addons/sale/models/sale.py b/addons/sale/models/sale.py index b3e8af8dc6e..a7c5954eef7 100644 --- a/addons/sale/models/sale.py +++ b/addons/sale/models/sale.py @@ -1,6 +1,8 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. +import uuid + from itertools import groupby from datetime import datetime, timedelta @@ -88,6 +90,9 @@ class SaleOrder(models.Model): return '

%s

' % (help) return super(SaleOrder, self).get_empty_list_help(help) + def _get_default_access_token(self): + return str(uuid.uuid4()) + @api.model def _default_note(self): return self.env.user.company_id.sale_note @@ -110,6 +115,9 @@ class SaleOrder(models.Model): name = fields.Char(string='Order Reference', required=True, copy=False, readonly=True, states={'draft': [('readonly', False)]}, index=True, default=lambda self: _('New')) origin = fields.Char(string='Source Document', help="Reference of the document that generated this sales order request.") client_order_ref = fields.Char(string='Customer Reference', copy=False) + access_token = fields.Char( + 'Security Token', copy=False, + default=_get_default_access_token) state = fields.Selection([ ('draft', 'Quotation'), @@ -279,6 +287,20 @@ class SaleOrder(models.Model): default['order_line'] = [(0, 0, line.copy_data()[0]) for line in self.order_line.filtered(lambda l: not l.is_downpayment)] return super(SaleOrder, self).copy_data(default) + @api.model_cr_context + def _init_column(self, column_name): + """ Initialize the value of the given column for existing rows. + Overridden here because we skip generating unique access tokens + for potentially tons of existing sale orders, should they be needed, + they will be generated on the fly. + """ + if column_name != 'access_token': + super(SaleOrder, self)._init_column(column_name) + + def _generate_access_token(self): + for order in self: + order.access_token = self._get_default_access_token() + @api.multi def _prepare_invoice(self): """ diff --git a/addons/website_quote/models/sale_order.py b/addons/website_quote/models/sale_order.py index f441087de33..5a0b1a9492e 100644 --- a/addons/website_quote/models/sale_order.py +++ b/addons/website_quote/models/sale_order.py @@ -1,7 +1,6 @@ # -*- coding: utf-8 -*- # Part of Odoo. See LICENSE file for full copyright and licensing details. -import uuid from datetime import datetime, timedelta from odoo import api, fields, models, _ @@ -52,9 +51,6 @@ class SaleOrder(models.Model): if so.state not in ['sale', 'done']: so.website_url = '/quote/%s' % (so.id) - access_token = fields.Char( - 'Security Token', copy=False, default=lambda self: str(uuid.uuid4()), - required=True) template_id = fields.Many2one( 'sale.quote.template', 'Quotation Template', readonly=True, diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index f677d8cbfbf..8a79c8dee7e 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -805,9 +805,9 @@ class WebsiteSale(http.Controller): # In case the route is called directly from the JS (as done in Stripe payment method) so_id = kwargs.get('so_id') - so_token = kwargs.get('so_token') - if so_id and so_token: - order = request.env['sale.order'].sudo().search([('id', '=', so_id), ('access_token', '=', so_token)]) + access_token = kwargs.get('access_token') + if so_id and access_token: + order = request.env['sale.order'].sudo().search([('id', '=', so_id), ('access_token', '=', access_token)]) elif so_id: order = request.env['sale.order'].search([('id', '=', so_id)]) else: