[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
This commit is contained in:
commit
11c7e85a85
|
@ -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')
|
||||
|
|
|
@ -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")
|
||||
|
|
Loading…
Reference in New Issue