如何检查用户是否属于 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) { ... }