← Back to team overview

c2c-oerpscenario team mailing list archive

[Bug 693056] Re: price_multi_get() is comparing pricelist_ids to pricelist_version_ids

 

** Changed in: openobject-addons
    Milestone: None => 6.0

-- 
You received this bug notification because you are a member of C2C
OERPScenario, which is subscribed to the OpenERP Project Group.
https://bugs.launchpad.net/bugs/693056

Title:
  price_multi_get() is comparing pricelist_ids to pricelist_version_ids

Status in OpenObject Addons Modules:
  Fix Released

Bug description:
  Version 6 trunk
  server revno: 3137
  addons revno: 4033

  I have posted a question a few days ago:
  https://answers.launchpad.net/openobject-addons/+question/138016 (no response yet)

  I think this is a real bug and deserves to be posted here.

  product/pricelist.py appears to have regressed at version 3719 with
  the introduction of "price_multi_get()"

  Prior to this version, the pricelist_ids argument to price_get() was
  translated to pricelist_version_ids.

  In revno:3566 where "ids" are priclist_ids passed on "price_get()":

  153	        for id in ids:
  154	            cr.execute('SELECT * ' \
  155	                    'FROM product_pricelist_version ' \
  156	                    'WHERE pricelist_id = %s AND active=True ' \
  157	                        'AND (date_start IS NULL OR date_start <= %s) ' \
  158	                        'AND (date_end IS NULL OR date_end >= %s) ' \
  159	                    'ORDER BY id LIMIT 1', (id, date, date))
  160	            plversion = cr.dictfetchone()
  ......
  190		           cr.execute(
  191		                'SELECT i.*, pl.currency_id '
  192		                'FROM product_pricelist_item AS i, '
  193		                    'product_pricelist_version AS v, product_pricelist AS pl '
  194	                'WHERE (product_tmpl_id IS NULL OR product_tmpl_id = %s) '
  195		                    'AND (product_id IS NULL OR product_id = %s) '
  196	                    'AND (' + categ_where + ' OR (categ_id IS NULL)) '
  197	                    'AND price_version_id = %s '
  198	                    'AND (min_quantity IS NULL OR min_quantity <= %s) '
  199	                    'AND i.price_version_id = v.id AND v.pricelist_id = pl.id '
  200	                'ORDER BY sequence',
  201	                (tmpl_id, prod_id, plversion['id'], qty))
  202	            res1 = cr.dictfetchall()

  Above code looks okay:
  1. ids are translated to pricelist versions in "plversion"
  2. line 197 matches price_version_id to plversion['id']

  
  Current version revno:4033 (since revno:3719):

  167		        if pricelist_ids:
  168		            pricelist_version_ids = pricelist_ids
  169		        else:
  170		            # all pricelists:
  171		            pricelist_version_ids = product_pricelist_version_obj.search(cr, uid, [])

  **************************
  Above code stores "pricelist_ids" and "product_pricelist_version_ids" in the same variable "pricelist_version_ids"   ????
  **************************

  172		
  173		        pricelist_version_ids = list(set(pricelist_version_ids))
  174		
  175		        plversions_search_args = [
  176		            ('pricelist_id', 'in', pricelist_version_ids),
  177		            '|',
  178		            ('date_start', '=', False),
  179		            ('date_start', '<=', date),
  180		            '|',
  181		            ('date_end', '=', False),
  182		            ('date_end', '>=', date),
  183		        ]
  184		
  185		        plversion_ids = product_pricelist_version_obj.search(cr, uid, plversions_search_args)

  ****************************
  line 176 is matching "pricelist_id" to pricelist_version_ids (that may be pricelist_ids ?????)
  ****************************

  202		        for product_id, qty, partner in products_by_qty_by_partner:
  203		            for pricelist_id in pricelist_version_ids:
  204		                price = False
  205		
  206		                tmpl_id = products_dict[product_id].product_tmpl_id and products_dict[product_id].product_tmpl_id.id or False
  207		
  208		                categ_id = products_dict[product_id].categ_id and products_dict[product_id].categ_id.id or False
  209		                categ_ids = _create_parent_category_list(categ_id, [categ_id])
  210		                if categ_ids:
  211		                    categ_where = '(categ_id IN (' + ','.join(map(str, categ_ids)) + '))'
  212		                else:
  213		                    categ_where = '(categ_id IS NULL)'
  214		
  215		                cr.execute(
  216		                    'SELECT i.*, pl.currency_id '
  217		                    'FROM product_pricelist_item AS i, '
  218		                        'product_pricelist_version AS v, product_pricelist AS pl '
  219		                    'WHERE (product_tmpl_id IS NULL OR product_tmpl_id = %s) '
  220		                        'AND (product_id IS NULL OR product_id = %s) '
  221		                        'AND (' + categ_where + ' OR (categ_id IS NULL)) '
  222		                        'AND price_version_id = %s '
  223		                        'AND (min_quantity IS NULL OR min_quantity <= %s) '
  224		                        'AND i.price_version_id = v.id AND v.pricelist_id = pl.id '
  225		                    'ORDER BY sequence',
  226		                    (tmpl_id, product_id, pricelist_id, qty))
  227		                res1 = cr.dictfetchall()

  ******************************
  line 222 is matching "price_version_id" against "pricelist_id" from line 203

  "pricelist_id" is derived from "pricelist_version_ids" which may contain pricelist_ids or pricelist_version_ids
  ******************************

  My question at https://answers.launchpad.net/openobject-addons/+question/138016
  was based on data that resulted in the above sql trying to match object ids of two different object (priclist_ids and pricelist_version_ids)

  To me it looks like the code is broken...but my head hurts looking at
  it.





References