[FIX] res.users: safer read() when computing default company value
authorOlivier Dony <odo@openerp.com>
Fri, 25 Jul 2014 14:33:48 +0000 (16:33 +0200)
committerOlivier Dony <odo@openerp.com>
Fri, 25 Jul 2014 14:33:48 +0000 (16:33 +0200)
The goal is to avoid any kind of prefetching
of other fields when copmuting the default
company, as this will sometimes happen in the
middle of a database update, when the default
company is used for setting the default value
of new columns. In that case the db schema
may not fully match the in-memory model, leading
to an SQL error.

openerp/addons/base/res/res_users.py

index a864725..f1ddf4f 100644 (file)
@@ -226,11 +226,14 @@ class res_users(osv.osv):
     def _get_company(self,cr, uid, context=None, uid2=False):
         if not uid2:
             uid2 = uid
-        # use read method to compute default values to don't create browse record and fetch all fields
-        # browse crash for install or update module
-        user = self.pool['res.users'].read(cr, uid, uid2, ['company_id'], context)
-        company_id = user['company_id'] and user['company_id'][0] or False
-        return company_id
+        # Use read() to compute default company, and pass load=_classic_write to
+        # avoid useless name_get() calls. This will avoid prefetching fields
+        # while computing default values for new db columns, as the
+        # db backend may not be fully initialized yet.
+        user_data = self.pool['res.users'].read(cr, uid, uid2, ['company_id'],
+                                                context=context, load='_classic_write')
+        comp_id = user_data['company_id']
+        return comp_id or False
 
     def _get_companies(self, cr, uid, context=None):
         c = self._get_company(cr, uid, context)