From c01e2fe122ed1d3d4447b046b8c75a8f30d3567d Mon Sep 17 00:00:00 2001 From: Date: Mon, 20 May 2013 14:31:11 +0530 Subject: [PATCH] [FIX]ir_property: If we add a property on a many2one field with multicompany the value of main company is replaced in all companies value bzr revid: ado@tinyerp.com-20130520090111-h20jboltev763mj6 --- openerp/osv/fields.py | 78 ++++++++++++++++++++----------------------- 1 file changed, 37 insertions(+), 41 deletions(-) diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 34968a662fb..64275fafca8 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -1380,50 +1380,46 @@ class property(function): return res def _get_by_id(self, obj, cr, uid, prop_name, ids, context=None): - prop = obj.pool.get('ir.property') - vids = [obj._name + ',' + str(oid) for oid in ids] - - domain = [('fields_id.model', '=', obj._name), ('fields_id.name', 'in', prop_name)] - #domain = prop._get_domain(cr, uid, prop_name, obj._name, context) - if vids: - domain = [('res_id', 'in', vids)] + domain - return prop.search(cr, uid, domain, context=context) + property_pool = obj.pool.get('ir.property') + company_pool = obj.pool.get('res.company') + reference = [obj._name + ',' + str(oid) for oid in ids] + def_id = self._field_get(cr, uid, obj._name, prop_name) + company_id = company_pool._company_default_get(cr, uid, obj._name, def_id, context=context) + #match the prop value on current user company to match + #property get and write based on current user company, + domain = [('fields_id.model', '=', obj._name), + ('fields_id.name', '=', prop_name), + ('company_id', '=', company_id)] + #add reference for more accurate property result, if any. + if reference: + domain.extend([('res_id', 'in', reference)]) + return property_pool.search(cr, uid, domain, context=context) + + def _create_property(self, obj, cr, uid, id, prop_name, id_val, old_ids, context): + company_pool = obj.pool.get('res.company') + property_pool = obj.pool.get('ir.property') + if old_ids: + property_pool.unlink(cr, uid, old_ids, context) + def_id = self._field_get(cr, uid, obj._name, prop_name) + company_id = company_pool._company_default_get(cr, uid, obj._name, def_id, context=context) + property_field = obj.pool.get('ir.model.fields').browse(cr, uid, def_id, context=context) + return property_pool.create(cr, uid, { + 'name': property_field.name, + 'value': id_val, + 'res_id': obj._name+','+str(id), + 'company_id': company_id, + 'fields_id': def_id, + 'type': self._type, + }, context=context) # TODO: to rewrite more clean def _fnct_write(self, obj, cr, uid, id, prop_name, id_val, obj_dest, context=None): - if context is None: - context = {} - - nids = self._get_by_id(obj, cr, uid, [prop_name], [id], context) - if nids: - cr.execute('DELETE FROM ir_property WHERE id IN %s', (tuple(nids),)) - - default_val = self._get_default(obj, cr, uid, prop_name, context) - - property_create = False - if isinstance(default_val, openerp.osv.orm.browse_record): - if default_val.id != id_val: - property_create = True - elif default_val != id_val: - property_create = True - - if property_create: - def_id = self._field_get(cr, uid, obj._name, prop_name) - company = obj.pool.get('res.company') - cid = company._company_default_get(cr, uid, obj._name, def_id, - context=context) - propdef = obj.pool.get('ir.model.fields').browse(cr, uid, def_id, - context=context) - prop = obj.pool.get('ir.property') - return prop.create(cr, uid, { - 'name': propdef.name, - 'value': id_val, - 'res_id': obj._name+','+str(id), - 'company_id': cid, - 'fields_id': def_id, - 'type': self._type, - }, context=context) - return False + #check the result of ir.property.get() for existing prop field value + default_val = self._get_defaults(obj, cr, uid, [prop_name], context=None)[prop_name] + #if values found same skip the unlinking the creation and creation of new records + if (isinstance(default_val, openerp.osv.orm.browse_record) and default_val.id != id_val) or (default_val != id_val): + old_ids = self._get_by_id(obj, cr, uid, prop_name, [id], context) + return self._create_property(obj, cr, uid, id, prop_name, id_val, old_ids, context) def _fnct_read(self, obj, cr, uid, ids, prop_names, obj_dest, context=None): prop = obj.pool.get('ir.property')