summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMartin Trigaux <mat@openerp.com>2014-02-13 14:48:38 +0100
committerMartin Trigaux <mat@openerp.com>2014-02-13 14:48:38 +0100
commit11c7e85a853c0f22bb4cd4fe3c032e37e2fcc4ab (patch)
tree44e00f68aa6a462a90e70e96a07d7410a956a563
parent6e99d7a6cbef2d2e56f4052f73660462b7c31e09 (diff)
parent7b41032e2a37ef9c5106772075adbeee257bd117 (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.py15
-rw-r--r--openerp/tests/test_fields.py60
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")