第十七章 用户与组

我们在第一部分中简要地介绍过系统的用户与组的概念,但是并没有在编程意义上的深入探讨。其实用户(res.users)和组(res.group)是两个关于全局的重要对象,通常他们与系统的权限紧密相联。

用户

用户在系统中的对象是res.users

字段中的过滤

有时候,我们会有这样的需求,在某个引用了用户对象的Many2one字段中,对某个组的用户进行过滤,例如,这里有某个对象的字段engineer使用Many2one关联了用户这个对象,而此时用户想要这个字段只能显示某个组内的用户。

这种情况下,通常的domian写法已经不能满足我们的要求,因此组对象不是一个特定的值,需要依赖系统生成的ID,因此我们需要借助ref方法来动态获取这个组对象的id,我们可以将domian使用一个函数将其动态地返回。

def _get_enginneer_domain(self):
    return [('groups_id','in',self.env.ref('juhui_purchase.group_purchase_test').id)]

engineer = fields.Many2one("res.users",string="工程师", compute=_get_enginneer_domain)

需要注意的是,这里的组必须是由xml定义的组,用户在系统中手动创建的组是不能满足要求的,因为他们没有xmlid,也就无法被ref方法获取。

用户对象的内置判断方法

我们知道odoo中的用户可以分为三种类型

  • 公共用户 (base.group_public)
  • 门户用户 (base.group_portal)
  • 内部用户 (base.group_user)

其基本的判断逻辑是判断用户是否在相应的用户组内。

有时候我们在开发过程中会遇到判断用户类型的情况,odoo给我们提供了几个用来判断用户类型的方法:

  • _is_internal(): 是否是内部用户
  • _is_portal(): 是否是门户用户
  • _is_public(): 是否是公共用户

16.0中没有_is_portal方法,需要自行实现。且_is_internal内部方法的实现有所不同。

除此之外,还有几个方法用于判断用户是否是管理员账号:

  • _is_system():是否是系统管理员
  • _is_admin(): 是否是系统设置用户
  • _is_superuser(): 是否是超级管理员

results matching ""

    No results matching ""