Odoo权限机制

权限管理的四个层次

    一、菜单级别:不属于指定菜单所包含组的用户看不到该菜单,只隐藏菜单,若知道菜单ID,任然可以通过指定URL访问

    二、对象级别:对某个对象是否有“创建,读取,修改,删除”的权限,可以简单理解为表对象

    三、记录级别:对对象表中的数据的访问权限,比如“客户”对象,业务员只能对自己所创建的客户有访问权限,而经理可以访问其管辖的所有业务员的“客户”对象

    四、字段级别:一个对象或表上的某些字段的访问权限,比如产品的成本字段只有经理有读写权限

1 name = fields.Char('Name', size=128, required=True, select=True, read=['base.group_admin'], write=['base.group_admin'])

            定义name字段只有超级用户组可读写

建立权限组

就是我们常说的用户组,通常存放在 "reurity/模块名_security.xml" 文件下

    例如:

1 <!-- 新建用户组manager -->
2 
3     <record id="manager" model="res.groups">
4         <field name="category_id" ref="module_category_hidden"/>
5         <field name="name">Manager</field>
6         <field name="comment">经理将可以访问 任务管理-配置</field>
7         <field name="implied_ids" eval="[(4, ref('base.group_hr_user'))]"/>
8         <field name="users" eval="[(4, ref('base.user_root'))]"/>
9     </record> 

    @category_id:用户组所属的模块名

    @name:用户组名

    @comment:用户组的注释

    @implied_ids:基于哪个用户组,这个层级关系 

<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>

      是最基础的用户名,最初是基于这个,后面一层一层递增,例如 base.group_hr_user  定义时就是基于最基础

    @users:预设用户属于这个用户组

权限组

    权限管理核心是权限组,每个权限组,可以设置权限组的Menus, Access Right, Record Rule

    #Menus:

        定义该权限组可以访问哪些菜单,若该权限组可以访问某父菜单,父菜单对应的子菜单会显示出来,若不想显示其子菜单,可以把其子菜单加入一个空的权限组

    #Access Right:

        定义该权限组可以访问哪些对象,以及拥有 增、删、查、改的哪个权限(create, read, write, unlink)

    #Record Rule:

        定义该权限组可以访问对象中的哪些记录,以及拥有 增、删、查、改的哪个权限,Access Right 是对对象中的所有记录赋权限,Record Rule 则通过定义domain过滤指定某些记录赋权限 

['&',('department','=',user.context_department_id.id),('state','=','pr_draft')]

          申购单的部门等于当前用户的部门,且申购单的状态是草稿状态

基于组的访问控制

    #视图中

        运用group_id

1 <record id="view_form_manage_list" model="ir.ui.view">
2     <field name="name">yati.form.manage</field>
3     <field name="model">yati.tdm</field>
4     <field name="inherit_id" ref="yati.view_apply_inspection_backend"/>
5     <field name="group_id" eval="[(6,0,[ref('yati.employee),ref('yati.manage')])]"
6 />
7 
8 </record>

        eval:把eval的值通过作为python运算返回该属性

        ref:视图的方法,根据 module_name.xml_id 返回数据库id

        [(6,0,[xx,yy])]

            (0,_,{'field': value}) 这将创建一个新的记录并连接它

            (1,id,{'field': value}) 这是更行一个已经连接了的记录的值

            (2,id,_) 这是删除或取消连接某个已经连接了的记录

            (3,id,_) 这是取消连接但不删除一个已经连接了的记录

            (4,id,_) 连接一个已经存在的记录

            (5,_,_) 取消连接但不删除所有已经连接了的记录

            (6,_,[ids]) 用给出的列表替换掉已经连接了的记录

            这里的下划线一般是0或False

        运用groups

            <button name="invoice_pay_customer" type="object" string="Register Payment" attrs="{'invisible': ['|', ('state','!=','open'),('sent','=',True)]}"                groups="base.group_user"/>

            <field name="invoice_line_ids" groups="account.group_account_invoice"/>

            <menuitem name="China Account" id="menu_china_account" parent="account.menu_finance" sequence="4" groups="account.group_account_user"/>

    #在模型中

        package_id = fields.Many2one(comodel_name='stock.quant.package', string='package', related='quant.package_id', readonly=True,            groups="stock.group_tracking_lot")

        如果有多个用户组,用户组之间用逗号隔开

    #小结

    只有在视图中有完整标签时,会用group_id,其他都用groups

原文地址:https://www.cnblogs.com/laky/p/11447834.html