如何检查用户是否属于 Odoo 中的多个组?
How to check if an user belongs to several groups in Odoo?
如果用户属于多个组,我将尝试在 JavaScript 中执行操作。
所以我有以下有效的代码:
Users.call('has_group', ['group1']).done(function(belongs_to_group1) {
if (belongs_to_group1 == true)
Users.call('has_group', ['group2']).done(function(belongs_to_group2) {
if (belongs_to_group2 == true)
Users.call('has_group', ['group3']).done(function(belongs_to_group3) {
if (belongs_to_group3 == true)
perform_the_action();
else
return;
});
else
return;
});
else
return;
});
问题是它看起来很糟糕,我想知道是否有更简单的方法来实现这一点,例如:
Users.call('has_group', ['group1', 'group2', 'group3']).done(function(belongs_to_all_groups) { ... }
但是最后一行根本不起作用。有什么想法吗?
没有简单的方法可以实现 - has_group 方法当时只需要一个组(并且必须是带点的完全限定组名),但您可以轻松编写自己的方法通过更改 python 中的几行来继承 res_users
,如下所示:
@api.noguess
@tools.ormcache('uid', 'groups_ext_id')
def _has_groups(self, cr, uid, groups_ext_id):
if not isinstance(groups_ext_id, list):
groups_ext_id = [groups_ext_id]
for group_ext_id in groups_ext_id:
assert group_ext_id and '.' in group_ext_id, "External ID must be fully qualified"
module, ext_id = group_ext_id.split('.')
cr.execute("""SELECT 1 FROM res_groups_users_rel WHERE uid=%s AND gid IN
(SELECT res_id FROM ir_model_data WHERE module=%s AND name=%s)""",
(uid, module, ext_id))
if cr.fetchone() == False:
return False
return True
我希望该方法有效(没有实际检查它,只是修改了 https://github.com/odoo/odoo/blob/7a483a85d46a7298b0b3d27efeefbcd2a11772c4/openerp/addons/base/res/res_users.py#L552 中的现有方法)- 我想在那之后你从最后一行调用就没问题了。
因为您需要在属于 res.users 模型的 python 文件中创建另一个方法,您应该在其中检查用户是否属于多个组或不是,然后您需要在 javascript.
中使用此自定义方法
我只是告诉你如何做到这一点(但是给定的代码可能无法直接执行)
@api.model
def customize_has_groups(self, groups_ext_ids):
"""here groups_ext_ids is a list of groups(external_id may be)"
if not groups_ext_ids:
return False
user = self.env.user
for group in groups_ext_ids:
group_id = self.env.ref(group).id
if group_id in user.groups_id:
return False
return True
这里的方法 returns 如果任何组不属于用户,则为 false。您可能需要根据您的要求更新方法行为。
然后您可以通过单个 json_rpc 调用获得结果。
Users.call('customize_has_groups', ['group1', 'group2', 'group3']).done(function(belongs_to_all_groups) { ... }
如果用户属于多个组,我将尝试在 JavaScript 中执行操作。
所以我有以下有效的代码:
Users.call('has_group', ['group1']).done(function(belongs_to_group1) {
if (belongs_to_group1 == true)
Users.call('has_group', ['group2']).done(function(belongs_to_group2) {
if (belongs_to_group2 == true)
Users.call('has_group', ['group3']).done(function(belongs_to_group3) {
if (belongs_to_group3 == true)
perform_the_action();
else
return;
});
else
return;
});
else
return;
});
问题是它看起来很糟糕,我想知道是否有更简单的方法来实现这一点,例如:
Users.call('has_group', ['group1', 'group2', 'group3']).done(function(belongs_to_all_groups) { ... }
但是最后一行根本不起作用。有什么想法吗?
没有简单的方法可以实现 - has_group 方法当时只需要一个组(并且必须是带点的完全限定组名),但您可以轻松编写自己的方法通过更改 python 中的几行来继承 res_users
,如下所示:
@api.noguess
@tools.ormcache('uid', 'groups_ext_id')
def _has_groups(self, cr, uid, groups_ext_id):
if not isinstance(groups_ext_id, list):
groups_ext_id = [groups_ext_id]
for group_ext_id in groups_ext_id:
assert group_ext_id and '.' in group_ext_id, "External ID must be fully qualified"
module, ext_id = group_ext_id.split('.')
cr.execute("""SELECT 1 FROM res_groups_users_rel WHERE uid=%s AND gid IN
(SELECT res_id FROM ir_model_data WHERE module=%s AND name=%s)""",
(uid, module, ext_id))
if cr.fetchone() == False:
return False
return True
我希望该方法有效(没有实际检查它,只是修改了 https://github.com/odoo/odoo/blob/7a483a85d46a7298b0b3d27efeefbcd2a11772c4/openerp/addons/base/res/res_users.py#L552 中的现有方法)- 我想在那之后你从最后一行调用就没问题了。
因为您需要在属于 res.users 模型的 python 文件中创建另一个方法,您应该在其中检查用户是否属于多个组或不是,然后您需要在 javascript.
中使用此自定义方法我只是告诉你如何做到这一点(但是给定的代码可能无法直接执行)
@api.model
def customize_has_groups(self, groups_ext_ids):
"""here groups_ext_ids is a list of groups(external_id may be)"
if not groups_ext_ids:
return False
user = self.env.user
for group in groups_ext_ids:
group_id = self.env.ref(group).id
if group_id in user.groups_id:
return False
return True
这里的方法 returns 如果任何组不属于用户,则为 false。您可能需要根据您的要求更新方法行为。
然后您可以通过单个 json_rpc 调用获得结果。
Users.call('customize_has_groups', ['group1', 'group2', 'group3']).done(function(belongs_to_all_groups) { ... }