← Back to team overview

c2c-oerpscenario team mailing list archive

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

 

Public bug reported:

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.

** Affects: openobject-addons
     Importance: Undecided
         Status: New

-- 
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:
  New

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.





Follow ups

References