【问题标题】:How to check if an user belongs to several groups in Odoo?如何检查用户是否属于 Odoo 中的多个组?
【发布时间】:2016-05-25 10:34:36
【问题描述】:

如果用户属于多个组,我正在尝试在 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) { ... }

但最后一行根本不起作用。有什么想法吗?

【问题讨论】:

    标签: javascript odoo-8 odoo


    【解决方案1】:

    你需要在python文件中创建另一个方法属于res.users模型,你应该检查用户是否属于多个组,然后你需要使用这个自定义方法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
    

    如果任何组不属于用户,则此方法返回 false。您可能需要根据您的要求更新方法行为。

    然后你可以通过单个 json_rpc 调用来获得结果。

    Users.call('customize_has_groups', ['group1', 'group2', 'group3']).done(function(belongs_to_all_groups) { ... }
    

    【讨论】:

      【解决方案2】:

      没有简单的方法可以实现这一点 - has_group 方法一次只需要一个组(并且它必须是带点的完全限定组名),但是您可以通过继承到 res_users 轻松编写自己的方法像这样在python中更改几行:

      @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 中的现有方法)- 我想在那之后你从最后一行调用会很好。

      【讨论】:

      • 谢谢@Mariusz! +1,但我认为如果我必须实现该功能,因为它还不存在,最好不要覆盖现有方法,并创建你的以防万一。
      猜你喜欢
      • 2012-08-15
      • 1970-01-01
      • 1970-01-01
      • 2016-04-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多