From 688db44c42c19076268e9e51070244603c7ec7f8 Mon Sep 17 00:00:00 2001 From: Christophe Matthieu Date: Tue, 23 Aug 2016 11:18:45 +0200 Subject: [PATCH] [IMP] website_sale: improve performance, use less db request to have pricelist data Use pricelist in the context instead of pricelist id. --- addons/website_event_sale/controllers/main.py | 6 +++--- addons/website_event_sale/models/sale_order.py | 10 +++++++--- addons/website_sale/controllers/main.py | 2 +- addons/website_sale/models/sale_order.py | 8 ++++++-- addons/website_sale_options/controllers/main.py | 2 +- 5 files changed, 18 insertions(+), 10 deletions(-) diff --git a/addons/website_event_sale/controllers/main.py b/addons/website_event_sale/controllers/main.py index 0caea67df60..3b35337b250 100644 --- a/addons/website_event_sale/controllers/main.py +++ b/addons/website_event_sale/controllers/main.py @@ -10,10 +10,10 @@ class WebsiteEventSaleController(WebsiteEventController): @http.route(['/event//register'], type='http', auth="public", website=True) def event_register(self, event, **post): - pricelist_id = int(request.website.get_current_pricelist()) + event = event.with_context(pricelist=request.website.get_current_pricelist().id) values = { - 'event': event.with_context(pricelist=pricelist_id), - 'main_object': event.with_context(pricelist=pricelist_id), + 'event': event, + 'main_object': event, 'range': range, } return request.render("website_event.event_description_full", values) diff --git a/addons/website_event_sale/models/sale_order.py b/addons/website_event_sale/models/sale_order.py index a24257bcea4..e8096872a3d 100644 --- a/addons/website_event_sale/models/sale_order.py +++ b/addons/website_event_sale/models/sale_order.py @@ -20,6 +20,10 @@ class SaleOrder(models.Model): @api.multi def _website_product_id_change(self, order_id, product_id, qty=0): + order = self.env['sale.order'].sudo().browse(order_id) + if self._context.get('pricelist') != order.pricelist_id.id: + self = self.with_context(pricelist=order.pricelist_id.id) + values = super(SaleOrder, self)._website_product_id_change(order_id, product_id, qty=qty) event_ticket_id = None if self.env.context.get("event_ticket_id"): @@ -30,8 +34,7 @@ class SaleOrder(models.Model): event_ticket_id = product.event_ticket_ids[0].id if event_ticket_id: - order = self.env['sale.order'].sudo().browse(order_id) - ticket = self.env['event.event.ticket'].with_context(pricelist=order.pricelist_id.id).browse(event_ticket_id) + ticket = self.env['event.event.ticket'].browse(event_ticket_id) if product_id != ticket.product_id.id: raise UserError(_("The ticket doesn't match with this product.")) @@ -54,7 +57,8 @@ class SaleOrder(models.Model): line = OrderLine.browse(line_id) ticket = line.event_ticket_id old_qty = int(line.product_uom_qty) - self = self.with_context(event_ticket_id=ticket.id) + if ticket.id: + self = self.with_context(event_ticket_id=ticket.id) else: line = None ticket = self.env['event.event.ticket'].search([('product_id', '=', product_id)], limit=1) diff --git a/addons/website_sale/controllers/main.py b/addons/website_sale/controllers/main.py index 180b714e9e1..b933849777c 100644 --- a/addons/website_sale/controllers/main.py +++ b/addons/website_sale/controllers/main.py @@ -390,7 +390,7 @@ class WebsiteSale(http.Controller): value['website_sale.cart_lines'] = request.env['ir.ui.view'].render_template("website_sale.cart_lines", { 'website_sale_order': order, 'compute_currency': lambda price: from_currency.compute(price, to_currency), - 'suggested_products': order.with_context(pricelist=order.pricelist_id.id)._cart_accessories() + 'suggested_products': order._cart_accessories() }) return value diff --git a/addons/website_sale/models/sale_order.py b/addons/website_sale/models/sale_order.py index 60b64d595dd..031989c5585 100644 --- a/addons/website_sale/models/sale_order.py +++ b/addons/website_sale/models/sale_order.py @@ -301,8 +301,6 @@ class Website(models.Model): # Do not reload the cart of this user last visit if the cart is no longer draft or uses a pricelist no longer available. sale_order_id = last_order.state == 'draft' and last_order.pricelist_id in available_pricelists and last_order.id - # Test validity of the sale_order_id - sale_order = self.env['sale.order'].sudo().browse(sale_order_id).exists() if sale_order_id else None pricelist_id = request.session.get('website_sale_current_pl') or self.get_current_pricelist().id if self.env['product.pricelist'].browse(force_pricelist).exists(): @@ -310,6 +308,12 @@ class Website(models.Model): request.session['website_sale_current_pl'] = pricelist_id update_pricelist = True + if not self._context.get('pricelist'): + self = self.with_context(pricelist=pricelist_id) + + # Test validity of the sale_order_id + sale_order = self.env['sale.order'].sudo().browse(sale_order_id).exists() if sale_order_id else None + # create so if needed if not sale_order and (force_create or code): # TODO cache partner_id session diff --git a/addons/website_sale_options/controllers/main.py b/addons/website_sale_options/controllers/main.py index 512d2c64f53..f55374eda98 100644 --- a/addons/website_sale_options/controllers/main.py +++ b/addons/website_sale_options/controllers/main.py @@ -55,7 +55,7 @@ class WebsiteSaleOptions(WebsiteSale): pricelist = request.website.get_current_pricelist() product_context = dict(request.context) if not product_context.get('pricelist'): - product_context['pricelist'] = int(pricelist) + product_context['pricelist'] = pricelist.id # fetch quantity from custom context product_context.update(kw.get('kwargs', {}).get('context', {}))