diff options
| author | Martin Trigaux <mat@openerp.com> | 2014-02-13 14:48:38 +0100 |
|---|---|---|
| committer | Martin Trigaux <mat@openerp.com> | 2014-02-13 14:48:38 +0100 |
| commit | 11c7e85a853c0f22bb4cd4fe3c032e37e2fcc4ab (patch) | |
| tree | 44e00f68aa6a462a90e70e96a07d7410a956a563 | |
| parent | 6e99d7a6cbef2d2e56f4052f73660462b7c31e09 (diff) | |
| parent | 7b41032e2a37ef9c5106772075adbeee257bd117 (diff) | |
[MERGE] [FIX] property fields: in _fnct_write call, make sure the removal of older properties applies only to current company and not to any properties found by the user. (opw 592328)
This was problematic when the admin or a mutlicompany user in parent company set a value for a property field on any record shared through companies. The change would remove the property already set on child companies instead of only replacing the current value.
The test requires previous revision (rev-id mat@openerp.com-20140213121853-mbbk6pkya92hy4xd) of server to avoid commiting changes in _field_create call.
bzr revid: mat@openerp.com-20140213134838-sia2s9vybq5oep65
| -rw-r--r-- | openerp/osv/fields.py | 15 | ||||
| -rw-r--r-- | openerp/tests/test_fields.py | 60 |
2 files changed, 67 insertions, 8 deletions
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") |
