From 80bb106463c9ea3dede141b823a378ed6c7f22e8 Mon Sep 17 00:00:00 2001 From: Christophe Simonis Date: Fri, 9 Oct 2015 15:11:46 +0200 Subject: [PATCH] [IMP] base: only recompute `share` field on users when users are added/removed from group "Employee" Note: The change in `base_security.xml` is needed as xmlid must exists when adding/removing users from group to determine the value of `share` field. Also add a test to reassure @odony the function fields are correctly recomputed for removed m2m entries (see http://git.io/vCqAG for context) --- openerp/addons/base/res/res_users.py | 10 ++++++++-- openerp/addons/base/security/base_security.xml | 2 +- openerp/addons/base/tests/test_orm.py | 16 ++++++++++++++++ 3 files changed, 25 insertions(+), 3 deletions(-) diff --git a/openerp/addons/base/res/res_users.py b/openerp/addons/base/res/res_users.py index 523db591a73..60b19502fd0 100644 --- a/openerp/addons/base/res/res_users.py +++ b/openerp/addons/base/res/res_users.py @@ -162,6 +162,12 @@ class res_users(osv.osv): res[user.id] = not self.has_group(cr, user.id, 'base.group_user') return res + def _store_trigger_share_res_groups(self, cr, uid, ids, context=None): + group_user = self.pool['ir.model.data'].xmlid_to_object(cr, SUPERUSER_ID, 'base.group_user', context=context) + if group_user and group_user.id in ids: + return group_user.users.ids + return [] + def _get_users_from_group(self, cr, uid, ids, context=None): result = set() groups = self.pool['res.groups'].browse(cr, uid, ids, context=context) @@ -197,8 +203,8 @@ class res_users(osv.osv): 'company_ids':fields.many2many('res.company','res_company_users_rel','user_id','cid','Companies'), 'share': fields.function(_is_share, string='Share User', type='boolean', store={ - 'res.users': (lambda self, cr, uid, ids, c={}: ids, None, 50), - 'res.groups': (_get_users_from_group, None, 50), + 'res.users': (lambda self, cr, uid, ids, c={}: ids, ['groups_id'], 50), + 'res.groups': (_store_trigger_share_res_groups, ['users'], 50), }, help="External user with limited access, created only for the purpose of sharing data."), } diff --git a/openerp/addons/base/security/base_security.xml b/openerp/addons/base/security/base_security.xml index a93dd785e26..c5c60632758 100644 --- a/openerp/addons/base/security/base_security.xml +++ b/openerp/addons/base/security/base_security.xml @@ -23,7 +23,6 @@ Employee - @@ -44,6 +43,7 @@ + diff --git a/openerp/addons/base/tests/test_orm.py b/openerp/addons/base/tests/test_orm.py index a288a1c2f37..9f96931ad44 100644 --- a/openerp/addons/base/tests/test_orm.py +++ b/openerp/addons/base/tests/test_orm.py @@ -166,6 +166,22 @@ class TestORM(common.TransactionCase): ['date'], ['date:month', 'date:day'], lazy=False) self.assertEqual(len(rg), len(all_partners)) + def test_m2m_store_trigger(self): + group_user = self.env.ref('base.group_user') + + user = self.env['res.users'].create({ + 'name': 'test', + 'login': 'test_m2m_store_trigger', + 'groups_id': [(6, 0, [])], + }) + self.assertTrue(user.share) + + group_user.write({'users': [(4, user.id)]}) + self.assertFalse(user.share) + + group_user.write({'users': [(3, user.id)]}) + self.assertTrue(user.share) + class TestInherits(common.TransactionCase): """ test the behavior of the orm for models that use _inherits;