From b14921d847c444ee1e43380efb007ba6342819ca Mon Sep 17 00:00:00 2001 From: Romain Derie Date: Fri, 7 Jun 2019 16:15:09 +0000 Subject: [PATCH] [FIX] website_sale: fix concurrent update MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Since forward-port, `/sale/get_combination_info_website` and `_cart_update` would lead to a concurrency error. Indeed, the session would not have an order_id at first. Then both rpc would be sent at the same time: - `cart_update` would create an order and add it in the session - `/sale/get_combination_info_website` would end up calling `_compute_cart_qty` which would call `sale_get_order` and would set the `sale_order_id` to none, just aftet the `_compute_cart_qty` would actually add an order in the session, simultaneously. closes odoo/odoo#33993 Signed-off-by: Christophe Simonis Co-authored-by: Romain Derie Co-authored-by: Christophe Simonis Co-authored-by: Sébastien Theys --- addons/website_sale/controllers/main.py | 4 ++-- addons/website_sale/models/website.py | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 137f15b5782..b5083e3f7c6 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -390,13 +390,13 @@ class WebsiteSale(http.Controller): return request.render('website.404') if abandoned_order.state != 'draft': # abandoned cart already finished values.update({'abandoned_proceed': True}) - elif revive == 'squash' or (revive == 'merge' and not request.session['sale_order_id']): # restore old cart or merge with unexistant + elif revive == 'squash' or (revive == 'merge' and not request.session.get('sale_order_id')): # restore old cart or merge with unexistant request.session['sale_order_id'] = abandoned_order.id return request.redirect('/shop/cart') elif revive == 'merge': abandoned_order.order_line.write({'order_id': request.session['sale_order_id']}) abandoned_order.action_cancel() - elif abandoned_order.id != request.session['sale_order_id']: # abandoned cart found, user have to choose what to do + elif abandoned_order.id != request.session.get('sale_order_id'): # abandoned cart found, user have to choose what to do values.update({'access_token': abandoned_order.access_token}) if order: diff --git a/addons/website_sale/models/website.py b/addons/website_sale/models/website.py index bc9c702760f..742e60c3d61 100644 --- a/addons/website_sale/models/website.py +++ b/addons/website_sale/models/website.py @@ -260,7 +260,8 @@ class Website(models.Model): sale_order = self.env['sale.order'].sudo().browse(sale_order_id).exists() if sale_order_id else None if not (sale_order or force_create or code): - request.session['sale_order_id'] = None + if request.session.get('sale_order_id'): + request.session['sale_order_id'] = None return self.env['sale.order'] if self.env['product.pricelist'].browse(force_pricelist).exists():