(11)odoo权限机制

*访问权限管理:
  对于其内的数据访问权限管理有两种机制: 
  第一种是模型访问权限管理 (accessrule);
  第二种是记录规则管理 (record rule)。
  record rule 是对accessrule的细化
  如果不为模块设置规则,默认只有Administator才能访问这个模型的数据
  record rule 对 Administator 用户是无效的,而access rule还是有效
   
  # access rule
   一般是放在security 文件夹下的 ir.model.access.csv 文件来管理的
   文件表头如下:
   id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
   
   来一个例子:
   id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
   access_todo_task_group_user,todo.task.user,model_todo_task,base.group_user,1,1,1,1
   
       模型名todo.task  model_id:id对应的就是 model_todo_task 这是规定死的
       id,name 名字随意取,但还是规则一些
       group_id:id 是群组
       下面的,0 表示无权限, 1 表示有权限
       perm_read  读
       perm_write 写
       perm_create 建
       perm_unlink 删除
       
  # record rule     
     一般是放在security 文件夹下的 模块名_record_rules.xml 文件来管理的 
    <?xml version=”1.0” encoding=”utf-8”?>
    <openerp>
        <data noupdate=”1”>
            <record id=”todo_task_user_rule” model=”ir.rule”>
                <field name=”name”>ToDo Tasks only for owner</field>
                <field name=”model_id” ref=”model_todo_task”/>
                <field name=”domain_force”>[(’create_uid’,’=’,user.id)]</field>
                <field name=”groups” eval=”[(4,ref(’base.group_user’))]”/>
            </record>
        </data>
    </openerp>   

    record rule    记录是 ir.rule 模型, 存在public.ir_rule 表格中
    model_id 作用于哪个模型
    domain_force 对该模型中所有记录进行某种过滤操作
    noupdate 值为1 表示升级模块不会更新本数据
    base.group_user 是人力资源 / 雇员
    
    
* 来一个完整的例子解说:

   # 建立组
    <record id="group_department_project_admin" model="res.groups">
    <field name="name">A</field>
    <fieldname="category_id" ref="B"/>
    <field name="users" eval="[(4, ref('base.user_root'))]"/> //把admin用户加入该组中
    </record>

    @ name 组名称
    @ category_id 属于哪个应用程序,或者哪个模块
    @ users 组里面的用户
    这样B应用程序就建立了一个名叫A的组。并且初始化了A组的一个用户admin
    
   # 组控制菜单显示
    A

    <record model="ir.ui.menu" id=" memu_id1">
        <field name="name" >menu1</field>
        <field name="groups_id" eval="[(6,0,[ref('A'),ref('B')]),]"/>           
        <field name="sequence">1</field>
    </record>

    @ name 菜单名称
    @ groups_id 哪些组可以访问该菜单
    @ sequence 该菜单的序号
    这样A组与B组的成员都可以访问menu1菜单,menu1菜单的显示顺序为1 
    注:eval 后面解释,多个组访问用“,”隔开    
    
    <menuitem id="menu_id2 " name="menu2" parent="menu_id1" sequence="1" groups="A,B "/>
    @ name 菜单名称
    @ parent 父类菜单 如果没有可以不写parent
    @ groups哪些组可以访问该菜单
    这样menu1的子菜单menu2可以被A组合B组的成员访问
    
   # 权限规则
    <record model="ir.rule" id="rule1">
        <field name="name">rule1</field>
        <field name="model_id" ref="model_model1"/>
        <field name="global" eval="True"/>
        <field name="domain_force">[1,’=’,1]</field>
        <field name="groups" eval="[(4,ref('A'))]"/>
    </record>

    @ name 规则名称
    @ model_id 依赖的模块
    @ global 是否是全局
    @ domain_force 过滤条件
    @ groups 属于哪个组

    这样A组的成员就可以取到model_model1的所有数据
    
   # ir.model.access.csv
    @id 随便取
    @name 随便取
    @model_id:id 这个就是你所定义的对象了
    @group_id:哪个组
    @perm_read","perm_write","perm_create","perm_unlink" 增删改查权限了。1代表有权限
    
    
   # Eval

    many2many
    (0,0,{values}) 根据values里面的信息新建一个记录。
    (1,ID,{values})更新id=ID的记录(写入values里面的数据)
    (2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)
    (3,ID) 切断主从数据的链接关系但是不删除这个数据
    (4,ID) 为id=ID的数据添加主从链接关系。
    (5) 删除所有的从数据的链接关系就是向所有的从数据调用(3,ID)
    (6,0,[IDs]) 用IDs里面的记录替换原来的记录(就是先执行(5)再执行循环IDs执行(4,ID))

    例子[(6, 0, [8, 5, 6, 4])] 设置 many2many to ids [8, 5, 6, 4]
    one2many
    (0, 0,{ values })根据values里面的信息新建一个记录。
    (1,ID,{values}) 更新id=ID的记录(对id=ID的执行write 写入values里面的数据)
    (2,ID) 删除id=ID的数据(调用unlink方法,删除数据以及整个主从数据链接关系)
    例子:
    [(0,0,{'field_name':field_value_record1,...}),(0,0,{'field_name':field_value_record})]
    many2one的字段比较简单,直接填入已经存在的数据的id或者填入False删除原来的记录。
    
   # 隐藏的常用技巧

    * 直接隐藏
     <group name="owner" position="attributes">
            <attribute name="invisible">True</attribute>
     </group>

    * 满足某些条件的隐藏

    <xpath expr="//field[@name='parent_id']" position='attributes'>
     <attribute name="attrs">{'invisible': [('passenger','=', True)]}</attribute>
    </xpath>

    <group col="4" string='旅客信息' attrs="{'invisible': [('supplier','=', True)]}"></group>

     * 通过组来隐藏
     <xpath expr="//field[@name='type']" position="attributes">
        <attribute name="groups">base.group_no_one</attribute>
     </xpath>

    * 菜单的隐藏
      <record model="ir.ui.menu" id="crm.menu_crm_opportunities">
            <field eval="[(6,0, [ref('base.group_no_one'),])]" name="groups_id"/>
      </record>

作者:陈伟明 | 联系 : QQ 942923305 | 微信 toby942923305 | E-mail: toby2chen@hotmail.com


转载于:https://my.oschina.net/toby2chen/blog/611432

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值