c2c-oerpscenario team mailing list archive
-
c2c-oerpscenario team
-
Mailing list archive
-
Message #10342
[Bug 693056] Re: price_multi_get() is comparing pricelist_ids to pricelist_version_ids
Hello snook,
Thanks for Reporting.
The problem of wrong reference is fixed in lp:~openerp-dev/openobject-addons/ron-dev-addons2
Revision ID: ron@xxxxxxxxxxx-20101231114354-61298bobh43f71uw
Revision num: 5105.
--
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 Committed
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