From b3b7a113af5319f2b3c8bbd3af5cea1361c358e3 Mon Sep 17 00:00:00 2001 From: Olivier Dony Date: Wed, 2 Feb 2011 10:15:46 +0100 Subject: [PATCH] [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-20110202091546-rdsxn7wuby040m3r --- bin/osv/fields.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/bin/osv/fields.py b/bin/osv/fields.py index 72df0e925ad..b7874cda8e6 100644 --- a/bin/osv/fields.py +++ b/bin/osv/fields.py @@ -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):