[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:
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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):
|
||||
|
||||
@@ -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">×</button> ' + resp.warning);
|
||||
}
|
||||
sessionStorage.setItem('website_sale_cart_quantity', resp.cart_quantity);
|
||||
$('.my_cart_quantity').html(resp.cart_quantity || '<i class="fa fa-warning" /> ');
|
||||
});
|
||||
},
|
||||
|
||||
Reference in New Issue
Block a user