[IMP] website_sale: quantity in the session to avoid sql queries

The session value is updated each time the user modifies the cart.

opw-2737985

Part-of: odoo/odoo#92962
This commit is contained in:
Gorash
2022-06-17 11:13:43 +02:00
parent d40a118250
commit 9d5cfe4f34
7 changed files with 27 additions and 11 deletions
@@ -55,6 +55,8 @@ class WebsiteEventSaleController(WebsiteEventController):
data['sale_order_id'] = order_sudo.id
data['sale_order_line_id'] = cart_data[event_ticket_id]
request.session['website_sale_cart_quantity'] = order_sudo.cart_quantity
return super()._create_attendees_from_registration_post(event, registration_data)
@route()
+10 -2
View File
@@ -499,6 +499,9 @@ class WebsiteSale(http.Controller):
if order and order.state != 'draft':
request.session['sale_order_id'] = None
order = request.website.sale_get_order()
request.session['website_sale_cart_quantity'] = order.cart_quantity
values = {}
if access_token:
abandoned_order = request.env['sale.order'].sudo().search([('access_token', '=', access_token)], limit=1)
@@ -557,6 +560,8 @@ class WebsiteSale(http.Controller):
**kwargs
)
request.session['website_sale_cart_quantity'] = sale_order.cart_quantity
if express:
return request.redirect("/shop/checkout?express=1")
@@ -597,6 +602,8 @@ class WebsiteSale(http.Controller):
**kw
)
request.session['website_sale_cart_quantity'] = order.cart_quantity
if not order.cart_quantity:
request.website.sale_reset()
return values
@@ -627,8 +634,9 @@ class WebsiteSale(http.Controller):
@http.route(['/shop/cart/quantity'], type='json', auth="public", methods=['POST'], website=True, csrf=False)
def cart_quantity(self):
cart = request.website.sale_get_order()
return cart and cart.cart_quantity or 0
if 'website_sale_cart_quantity' not in request.session:
return request.website.sale_get_order().cart_quantity
return request.session['website_sale_cart_quantity']
# ------------------------------------------------------
# Checkout
+2 -1
View File
@@ -124,7 +124,8 @@ class SaleOrder(models.Model):
self = self.with_company(self.company_id)
if self.state != 'draft':
request.session['sale_order_id'] = None
request.session.pop('sale_order_id', None)
request.session.pop('website_sale_cart_quantity', None)
raise UserError(_('It is forbidden to modify a sales order which is not in draft status.'))
product = self.env['product.product'].browse(product_id).exists()
+7 -5
View File
@@ -302,7 +302,8 @@ class Website(models.Model):
if not (sale_order_sudo or force_create):
# Do not create a SO record unless needed
if request.session.get('sale_order_id'):
request.session['sale_order_id'] = None
request.session.pop('sale_order_id')
request.session.pop('website_sale_cart_quantity', None)
return self.env['sale.order']
# Only set when neeeded
@@ -316,6 +317,7 @@ class Website(models.Model):
sale_order_sudo = SaleOrder.with_user(SUPERUSER_ID).create(so_data)
request.session['sale_order_id'] = sale_order_sudo.id
request.session['website_sale_cart_quantity'] = sale_order_sudo.cart_quantity
# The order was created with SUPERUSER_ID, revert back to request user.
sale_order_sudo = sale_order_sudo.with_user(self.env.user).sudo()
return sale_order_sudo
@@ -327,6 +329,7 @@ class Website(models.Model):
# case when user emptied the cart
if not request.session.get('sale_order_id'):
request.session['sale_order_id'] = sale_order_sudo.id
request.session['website_sale_cart_quantity'] = sale_order_sudo.cart_quantity
# check for change of partner_id ie after signup
if sale_order_sudo.partner_id.id != partner_sudo.id and request.website.partner_id.id != partner_sudo.id:
@@ -435,10 +438,9 @@ class Website(models.Model):
return fpos.id
def sale_reset(self):
request.session.update({
'sale_order_id': False,
'website_sale_current_pl': False,
})
request.session.pop('sale_order_id', None)
request.session.pop('website_sale_current_pl', None)
request.session.pop('website_sale_cart_quantity', None)
@api.model
def action_dashboard_redirect(self):
+3 -3
View File
@@ -5,14 +5,14 @@
t-nocache-_icon="_icon"
t-nocache-_item_class="_item_class"
t-nocache-_link_class="_link_class">
<t t-set="website_sale_order" t-value="website.sale_get_order()" />
<t t-set="website_sale_cart_quantity" t-value="request.session['website_sale_cart_quantity'] if 'website_sale_cart_quantity' in request.session else website.sale_get_order().cart_quantity or 0"/>
<t t-set="show_cart" t-value="true"/>
<li t-attf-class="#{_item_class} divider d-none"/> <!-- Make sure the cart and related menus are not folded (see autohideMenu) -->
<li t-attf-class="o_wsale_my_cart align-self-md-start #{not show_cart and 'd-none'} #{_item_class}">
<a href="/shop/cart" t-attf-class="#{_link_class}">
<i t-if="_icon" class="fa fa-shopping-cart"/>
<span t-if="_text">My Cart</span>
<sup class="my_cart_quantity badge badge-primary" t-esc="website_sale_order and website_sale_order.cart_quantity or '0'" t-att-data-order-id="website_sale_order and website_sale_order.id or ''"/>
<sup class="my_cart_quantity badge badge-primary" t-esc="website_sale_cart_quantity" t-att-data-order-id="request.session.get('sale_order_id', '')"/>
</a>
</li>
</t>
@@ -20,7 +20,7 @@
<template id="header_hide_empty_cart_link" inherit_id="website_sale.header_cart_link" name="Header Hide Empty Cart link" active="False">
<xpath expr="//t[@t-set='show_cart']" position="after">
<t t-set="show_cart" t-value="show_cart and website_sale_order and website_sale_order.cart_quantity" />
<t t-set="show_cart" t-value="website_sale_cart_quantity" />
</xpath>
</template>
@@ -96,4 +96,6 @@ class WebsiteSale(main.WebsiteSale):
)
option_parent[option['unique_id']] = option_value['line_id']
request.session['website_sale_cart_quantity'] = order.cart_quantity
return str(order.cart_quantity)
@@ -191,6 +191,7 @@ publicWidget.registry.ProductWishlist = publicWidget.Widget.extend(VariantMixin,
var cart_alert = $('.wishlist-section').parent().find('#data_warning');
cart_alert.html('<button type="button" class="close" data-dismiss="alert" aria-hidden="true">&times;</button> ' + resp.warning);
}
sessionStorage.setItem('website_sale_cart_quantity', resp.cart_quantity);
$('.my_cart_quantity').html(resp.cart_quantity || '<i class="fa fa-warning" /> ');
});
},