Skip to content
Permalink
Browse files

[FIX] website_sale: cached available pricelists

The result of the method `_get_pl` is cached:
```
@tools.ormcache('uid', 'country_code', 'show_visible', 'website_pl', 'current_pl', 'all_pl')
```

But, the result depends as well on the partner pricelist set
in the partner form (or even the pricelist used correctly in his cart),
and, unfortunately, this value is not among this method parameters.

To force the recompute of the method when the partner pricelist
change, one of the method arguments (mentioned above) must change.

To serve this purpose, another method is created, adding
the partner pricelist and the order pricelist among its
parameter, to force the recomputation of the available pricelists
when there is a change in the partner or order pricelist.

The old method is kept for retro-compatibility purposes,
and basically call the new one without the two last arguments

For information, the pricelist in the cookie is set only when
the user choose a pricelist different than the default one
among the available pricelists.

opw-670898
  • Loading branch information...
beledouxdenis committed Mar 9, 2016
1 parent a395a54 commit afe1d20dac1a70a22b4788a246e34dd141cf376f
Showing with 20 additions and 8 deletions.
  1. +20 −8 addons/website_sale/models/sale_order.py
@@ -156,8 +156,8 @@ def _get_pricelist_id(self, cr, uid, ids, name, args, context=None):
string='Price list available for this Ecommerce/Website'),
}

@tools.ormcache('uid', 'country_code', 'show_visible', 'website_pl', 'current_pl', 'all_pl')
def _get_pl(self, cr, uid, country_code, show_visible, website_pl, current_pl, all_pl):
@tools.ormcache('uid', 'country_code', 'show_visible', 'website_pl', 'current_pl', 'all_pl', 'partner_pl', 'order_pl')
def _get_pl_partner_order(self, cr, uid, country_code, show_visible, website_pl, current_pl, all_pl, partner_pl=False, order_pl=False):
""" Return the list of pricelists that can be used on website for the current user.
:param str country_code: code iso or False, If set, we search only price list available for this country
@@ -166,6 +166,8 @@ def _get_pl(self, cr, uid, country_code, show_visible, website_pl, current_pl, a
:param int current_pl: The current pricelist used on the website
(If not selectable but the current pricelist we had this pricelist anyway)
:param list all_pl: List of all pricelist available for this website
:param int partner_pl: the partner pricelist
:param int order_pl: the current cart pricelist
:returns: list of pricelist ids
"""
@@ -175,12 +177,12 @@ def _get_pl(self, cr, uid, country_code, show_visible, website_pl, current_pl, a
groups = self.pool['res.country.group'].search(cr, uid, [('country_ids.code', '=', country_code)])
for cgroup in self.pool['res.country.group'].browse(cr, uid, groups):
for pll in cgroup.website_pricelist_ids:
if not show_visible or pll.selectable or pll.pricelist_id.id == current_pl:
if not show_visible or pll.selectable or pll.pricelist_id.id in (current_pl, order_pl):
pcs.append(pll.pricelist_id)

if not pcs: # no pricelist for this country, or no GeoIP
pcs = [pll.pricelist_id for pll in all_pl
if not show_visible or pll.selectable or pll.pricelist_id.id == current_pl]
if not show_visible or pll.selectable or pll.pricelist_id.id in (current_pl, order_pl)]

partner = self.pool['res.users'].browse(cr, SUPERUSER_ID, uid).partner_id
if not pcs or partner.property_product_pricelist.id != website_pl:
@@ -189,6 +191,10 @@ def _get_pl(self, cr, uid, country_code, show_visible, website_pl, current_pl, a
pcs = sorted(set(pcs), key=lambda pl: pl.name)
return [pl.id for pl in pcs]

@tools.ormcache('uid', 'country_code', 'show_visible', 'website_pl', 'current_pl', 'all_pl')
def _get_pl(self, cr, uid, country_code, show_visible, website_pl, current_pl, all_pl):
return self._get_pl_partner_order(cr, uid, country_code, show_visible, website_pl, current_pl, all_pl)

def get_pricelist_available(self, cr, uid, show_visible=False, context=None):
""" Return the list of pricelists that can be used on website for the current user.
Country restrictions will be detected with GeoIP (if installed).
@@ -206,10 +212,15 @@ def get_pricelist_available(self, cr, uid, show_visible=False, context=None):
website_id = self.search(cr, uid, [], context=context)
website = self.browse(cr, uid, website_id, context=context)
isocountry = request.session.geoip and request.session.geoip.get('country_code') or False
pl_ids = self._get_pl(cr, uid, isocountry, show_visible,
website.user_id.sudo().partner_id.property_product_pricelist.id,
request.session.get('website_sale_current_pl'),
website.website_pricelist_ids)
partner = self.pool['res.users'].browse(cr, SUPERUSER_ID, uid, context=context).partner_id
order_pl = partner.last_website_so_id and partner.last_website_so_id.state == 'draft' and partner.last_website_so_id.pricelist_id
partner_pl = partner.property_product_pricelist
pl_ids = self._get_pl_partner_order(cr, uid, isocountry, show_visible,
website.user_id.sudo().partner_id.property_product_pricelist.id,
request.session.get('website_sale_current_pl'),
website.website_pricelist_ids,
partner_pl=partner_pl and partner_pl.id or None,
order_pl=order_pl and order_pl.id or None)
return self.pool['product.pricelist'].browse(cr, uid, pl_ids, context=context)

def is_pricelist_available(self, cr, uid, pl_id, context=None):
@@ -427,6 +438,7 @@ def clear_cache(self):
# we change the config of website price list to force to recompute.
website = self.pool['website']
website._get_pl.clear_cache(website)
website._get_pl_partner_order.clear_cache(website)

def create(self, cr, uid, data, context=None):
res = super(website_pricelist, self).create(cr, uid, data, context=context)

0 comments on commit afe1d20

Please sign in to comment.
You can’t perform that action at this time.