diff --git a/openerp/osv/fields.py b/openerp/osv/fields.py index 9921e3f762d..1ef47bc94af 100644 --- a/openerp/osv/fields.py +++ b/openerp/osv/fields.py @@ -1393,9 +1393,9 @@ class property(function): 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 context and context.get('company_id'): + domain += [('company_id', '=', context.get('company_id'))] if vids: domain = [('res_id', 'in', vids)] + domain return prop.search(cr, uid, domain, context=context) @@ -1405,7 +1405,12 @@ class property(function): if context is None: context = {} - nids = self._get_by_id(obj, cr, uid, [prop_name], [id], context) + 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) + # TODO for trunk: add new parameter company_id to _get_by_id method + context_company = dict(context, company_id=cid) + nids = self._get_by_id(obj, cr, uid, [prop_name], [id], context_company) if nids: cr.execute('DELETE FROM ir_property WHERE id IN %s', (tuple(nids),)) @@ -1419,10 +1424,6 @@ class property(function): 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') diff --git a/openerp/tests/test_fields.py b/openerp/tests/test_fields.py index 774bbf41fb2..151b96b8013 100644 --- a/openerp/tests/test_fields.py +++ b/openerp/tests/test_fields.py @@ -121,4 +121,62 @@ class TestRelatedField(common.TransactionCase): # restore res.partner fields self.partner._columns = old_columns -# vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4: + +class TestPropertyField(common.TransactionCase): + + def setUp(self): + super(TestPropertyField, self).setUp() + self.user = self.registry('res.users') + self.partner = self.registry('res.partner') + self.company = self.registry('res.company') + self.country = self.registry('res.country') + self.property = self.registry('ir.property') + self.imd = self.registry('ir.model.data') + + def test_1_property_multicompany(self): + cr, uid = self.cr, self.uid + + parent_company_id = self.imd.get_object_reference(cr, uid, 'base', 'main_company')[1] + country_be = self.imd.get_object_reference(cr, uid, 'base', 'be')[1] + country_fr = self.imd.get_object_reference(cr, uid, 'base', 'fr')[1] + group_partner_manager = self.imd.get_object_reference(cr, uid, 'base', 'group_partner_manager')[1] + group_multi_company = self.imd.get_object_reference(cr, uid, 'base', 'group_multi_company')[1] + + sub_company = self.company.create(cr, uid, {'name': 'MegaCorp', 'parent_id': parent_company_id}) + alice = self.user.create(cr, uid, {'name': 'Alice', + 'login':'alice', + 'email':'alice@youcompany.com', + 'company_id':parent_company_id, + 'company_ids':[(6, 0, [parent_company_id, sub_company])], + 'country_id':country_be, + 'groups_id': [(6, 0, [group_partner_manager, group_multi_company])] + }) + bob = self.user.create(cr, uid, {'name': 'Bob', + 'login':'bob', + 'email':'bob@megacorp.com', + 'company_id':sub_company, + 'company_ids':[(6, 0, [parent_company_id, sub_company])], + 'country_id':country_fr, + 'groups_id': [(6, 0, [group_partner_manager, group_multi_company])] + }) + + self.partner._columns = dict(self.partner._columns) + self.partner._columns.update({ + 'property_country': fields.property('res.country', type='many2one', relation="res.country", string="Country by company", view_load=True), + }) + self.partner._all_columns.update({ + 'property_country': fields.column_info('property_country', self.partner._columns['property_country'], None, None, None), + }) + self.partner._field_create(cr) + + partner_id = self.partner.create(cr, alice, { + 'name': 'An International Partner', + 'email': 'partner@example.com', + 'company_id': parent_company_id, + }) + self.partner.write(cr, bob, [partner_id], {'property_country': country_fr}) + self.assertEqual(self.partner.browse(cr, bob, partner_id).property_country.id, country_fr, "Bob does not see the value he has set on the property field") + + self.partner.write(cr, alice, [partner_id], {'property_country': country_be}) + self.assertEqual(self.partner.browse(cr, alice, partner_id).property_country.id, country_be, "Alice does not see the value he has set on the property field") + self.assertEqual(self.partner.browse(cr, bob, partner_id).property_country.id, country_fr, "Changes made by Alice have overwritten Bob's value")