在odoo中新建两个用户user1,user2
![](http://upload-images.jianshu.io/upload_images/3551405-2e9c89e6b9ef2e85.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
新建用户
建完了用户,记得编辑用户,设置密码。
然后以user1用户登录系统,在导航菜单中我们看不到`请假`菜单,因为我们没有给user1这个用户请假模块的权限。编辑`security/ir.model.access.csv`
~~~
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_qingjia_qingjiadan,qingjia.qingjiadan,model_qingjia_qingjiadan,base.group_user,1,1,1,1
~~~
id
权限id,默认规则是`access_模块名_类名`,还没发现有什么用
name
权限名,默认规则是`模块名.类名`,还没发现有什么用
model_id:id
这个是固定写法,规则是`model_模块名_类名`,其它地方引用权限会用这个id
group_id:id
组id,这里的`base.group_user`是系统内置组,即`员工.员工`组,创建帐户时,默认属于这个组。所以给这个组赋权限,相当于给新帐户的默认权限。
perm_read,perm_write,perm_create,perm_unlink
对应读、写、增加、删除权限,1是有权限,0是无权限,具体根据需要来设置权限
编辑`__manifest__.py`
~~~
# -*- coding: utf-8 -*-
{
'name': "qingjia",
'summary': """
请假模块""",
'description': """
请假模块
""",
'author': "leo",
'website': "http://www.yourcompany.com",
# Categories can be used to filter modules in modules listing
# Check https://github.com/odoo/odoo/blob/master/openerp/addons/base/module/module_data.xml
# for the full list
'category': 'Uncategorized',
'version': '0.1',
# any module necessary for this one to work correctly
'depends': ['base'],
# always loaded
'data': [
'security/ir.model.access.csv',
'views/views.xml',
'views/templates.xml',
],
# only loaded in demonstration mode
'demo': [
'demo/demo.xml',
],
'application': True,
}
~~~
在`'data':[]`中添加权限文件 `'security/ir.model.access.csv'`,
新增一行`'application': True,`这样在应用中默认能搜索到请假单模块,因为应用列表默认使用`应用`过滤器的。
以管理员身份登录系统,在应用>应用查找qingjia模块。然后升级。
![](http://upload-images.jianshu.io/upload_images/3551405-0fa397b435335423.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
新增请假单
使用user1用户登录系统,现在可以看到`请假`菜单了。新建一个请假单。看起来功能正常。然后我们用user2登录系统。也可以看到这个请假单。如果我们希望用户只能看到自己的请假单,如何做呢,修改代码`views/views.xml`
~~~
<openerp>
<data>
<!-- tree视图 -->
<record id="view_tree_qingjia_qingjiadan" model="ir.ui.view">
<field name="name">请假单列表</field>
<field name="model">qingjia.qingjiadan</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="days"/>
<field name="startdate"/>
</tree>
</field>
</record>
<!-- form视图 -->
<record id="view_form_qingjia_qingjiadan" model="ir.ui.view">
<field name="name">请假单</field>
<field name="model">qingjia.qingjiadan</field>
<field name="arch" type="xml">
<form>
<sheet>
<group name="group_top" string="请假单">
<field name="name"/>
<field name="days"/>
<field name="startdate"/>
<field name="reason"/>
</group>
</sheet>
</form>
</field>
</record>
<!-- 视图动作 -->
<act_window id="action_qingjia_qingjiadan"
name="请假单"
res_model="qingjia.qingjiadan"
view_mode="tree,form" />
<!-- 顶级菜单 -->
<menuitem name="请假" id="menu_qingjia"/>
<!-- 二级菜单 -->
<menuitem name="请假单" id="menu_qingjia_qingjiadan" parent="menu_qingjia" action="action_qingjia_qingjiadan"/>
<!--record 规则 -->
<record id="rule_user_qingjia_qingjiadan" model="ir.rule">
<field name="name">自己编辑自己的请假单</field>
<field name="model_id" ref="model_qingjia_qingjiadan" />
<field name="domain_force">[('create_uid','=',user.id)]</field>
<field name="groups" eval="[(4,ref('base.group_user'))]"/>
</record>
</data>
</openerp>
~~~
增加了一个record 规则,几个关键属性
model_id
模块id,对应`ir.model.access.csv`文件中定义的`model_id`
domain_forc
domain表达式,`'create_uid'`是`qiangjia_qingjiadan`表的字段,在insert数据时,odoo自动写入添加用户的id。`user.id`是当前用户id。这个domain表达式的含义就是请假单数据的添加用户id等于当前用户id.
groups
组id,`base.group_user`前面说过,是系统内置的员工组的外部id
再次升级请假模块,现在user1、user2都只能看到自己的请假单,管理员可以看到全部的请假单。odoo管理员默认拥有全部权限。
#### 总结下odoo权限分级:
* 第一级是access rule,即表级权限,控制用户组对表的访问权限,一般是用`security/ir.model.access.csv`文件来管理
* 第二级是record rule,即行级权限,控制用户组对表中数据行的访问权限,可以写在`views/views.xml`文件中
* 其实还有第三级权限,是字段级权限,之后再学习。