[FIX] many2one: return (id,name) instead of only id also for osv_memory

By doing this small change we save clients the trouble of explicitly having to call
name_get() for each m2o field in osv_memory objects, which they cannot trivially batch
and represents a large dealy for wizards with possibly large numbers of child o2m records.
An example is the linked bug, where partial picking of several hundred move lines would
lead to as many separate name_get RPC calls, causing a noticeable delay.

lp bug: https://launchpad.net/bugs/709567 fixed

bzr revid: odo@openerp.com-20110201112322-2yw0wxc63wvt7ves
This commit is contained in:
Olivier Dony 2011-02-01 12:23:22 +01:00
parent 50adbbfdfa
commit 3293581e24
1 changed files with 14 additions and 0 deletions

View File

@ -339,6 +339,20 @@ class many2one(_column):
result = {}
for id in ids:
result[id] = obj.datas[id].get(name, False)
# build a dictionary of the form {'id_of_distant_resource': name_of_distant_resource}
# we use uid=1 because the visibility of a many2one field value (just id and name)
# must be the access right of the parent form and not the linked object itself.
obj = obj.pool.get(self._obj)
records = dict(obj.name_get(cr, 1,
list(set([x for x in result.values() if x and isinstance(x, (int,long))])),
context=context))
for id in ids:
if result[id] in records:
result[id] = (result[id], records[result[id]])
else:
result[id] = False
return result
def get(self, cr, obj, ids, name, user=None, context=None, values=None):