odoo中xml搜索视图与分组权限的使用
作者:向前的步伐 / 发表: 2020年4月1日 00:13 / 更新: 2020年4月1日 22:08 / odoo / 阅读量:989
一、简介
odoo除了常用的tree、form视图以外,还会用到search视图、用户分组权限、群组访问规则等等xml的配置。通过简单的xml文件的配置,就可以实现各种功能,简化了开发流程。
二、search视图
odoo除了常用的tree、form视图以外,还会用到search视图、filter过滤器、group分组功能等等。这些都是比较常用的界面功能,通常都是在xml文件中配置。
这里主要介绍的是tree视图界面下的,右上角的功能模块。
1,搜索功能
默认情况下,搜索视图只会搜索模型中的name字段,例如我们输入我们需要搜索的字,在搜索框下就能看到我们搜索的内容,只有name字段被检索出来。
如果我们想要检索其他的字段,这时候我们就得定义search视图,让想要搜索的字段也加入到搜索中。这需要编辑views.xml文件:
<record id="todo_task_view_filter" model="ir.ui.view">
<field name="name">todo.task.view_filter</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<search string="Todo">
<field name="name"/>
<field name="category_id"/>
</search>
</field>
</record>
这里使用到了
这时我们需要升级模块,在app中搜索todo,并点击升级,再回到todo应用中进行搜索。
2,过滤器
我们在搜索视图下方可以看到一个过滤功能,里面默认没有定义好的过滤规则,都需要手动添加,下次重新进来的时候,手动定义的过滤规则也会消失,这时需要我们自己定义好一些过滤规则,方便我们进到tree视图时候可以直接使用。
我们的过滤器的定义也是在views.xml视图中,编写views.xml文件:
<search string="Todo">
<field name="name"/>
<field name="category_id"/>
<separator/>
<filter string="未完成" name="undone" domain="[('is_done', '=', False)]"/>
<filter string="已完成" name="done" domain="[('is_done', '=', True)]"/>
<separator/>
<filter string="待办" name="todo" domain="[('priority', '=', 'todo')]"/>
<filter string="普通" name="normal" domain="[('priority', '=', 'normal')]"/>
<filter string="紧急" name="urgency" domain="[('priority', '=', 'urgency')]"/>
</search>
可以看出,在search标签下,添加相应的filter标签就可以添加相应的过滤器。domain属性就是用来实现该标签的过滤规则的,它以一个3元素的元组作为一个条件,多个条件之前可以使用‘,’隔开。元组的第一个元素为用于判断的参数,第二个为操作符,最后一个为对应的参数值,组合成需要过滤的条件。
separator标签的作用是将搜索字段和过滤器之间进行分组隔离,也用于过滤规则之前的逻辑关系,即同一分割线内的为or语法,不同分组之间为and语法。
我们可以升级模块,在看看效果:
3,分组
在大部分时候,我们都需要使用到分组的功能,对某些字段进行分组展示,方便我们查看数据。odoo也有自己的分组功能,我们也可以通过配置xml进行自定义的分组配置,这给我们的操作带来了方便。
同样我们还是在search标签下添加分组信息,标记views.xml文件:
<search string="Todo">
<field name="name"/>
<field name="category_id"/>
<separator/>
<filter string="未完成" name="undone" domain="[('is_done', '=', False)]"/>
<filter string="已完成" name="done" domain="[('is_done', '=', True)]"/>
<separator/>
<filter string="待办" name="todo" domain="[('priority', '=', 'todo')]"/>
<filter string="普通" name="normal" domain="[('priority', '=', 'normal')]"/>
<filter string="紧急" name="urgency" domain="[('priority', '=', 'urgency')]"/>
<group expand="0" string="分组">
<filter string="分类" name="category" domain="[]" context="{'group_by':'category_id'}"/>
<filter string="紧急程度" name="priority" domain="[]" context="{'group_by':'priority'}"/>
</group>
</search>
分组功能就是在search标签下添加group标签,并在group标签下添加filter标签进行分组。context属性存放的是一个字典,这里指定的是排序的字段。在group标签中,我们还看到一个expand,这个属性主要用于分组是否展开,当值为1的时候,默认就是展开分组。
由于我们更改的是xml,自然要升级下模块才能看到效果:
三、用户组与权限
1,用户组
一般在管理系统中,都会对用户进行分组,然后赋予不同的权限,这里我们将设置两个用户组,分别为“用户”和“管理员”两个用户组。
我们先在security目录下创建一个todo_security.xml文件,并且写入用户组的配置信息:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<record id="module_category_todo" model="ir.module.category">
<field name="name">待办事项</field>
</record>
<record id="group_todo_user" model="res.groups">
<field name="name">用户</field>
<field name="implied_ids" eval="[(4, ref('base.group_user'))]"/>
<field name="category_id" ref="todo.module_category_todo"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
<record id="group_todo_manager" model="res.groups">
<field name="name">管理员</field>
<field name="implied_ids"
eval="[(4, ref('base.group_user')), (4, ref('todo.group_todo_user'))]"/>
<field name="category_id" ref="todo.module_category_todo"/>
<field name="users" eval="[(4, ref('base.user_root'))]"/>
</record>
</data>
</odoo>
这里首先是在ir.module.category模型中创建了类别,然后在res.groups中创建了2个用户组,并在
同时还要把新加入的todo_security.xml文件配置到应用中的__manifest__.py的data列表中,如:
'data': [
'security/todo_security.xml',
'security/ir.model.access.csv',
'views/views.xml',
'views/templates.xml',
'views/menus.xml',
],
重启应用后并升级todo模块,我们可以在settings模块中点击用户并编辑用户组:
2,权限配置
如果我们没有给用户组分配任何数据操作的权限,用户对数据没有读写权限,自然就会看不到相关的内容,这时,我们就要往security/ir.model.access.csv添加相应的用户组权限:
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_todo_task_user,todo_task_user,model_todo_task,group_todo_user,1,1,1,1
access_todo_category_user,todo_category_user,model_todo_category,group_todo_user,1,0,0,0
access_todo_task_manager,todo_task_manager,model_todo_task,group_todo_manager,1,1,1,1
access_todo_category_manager,todo_category_manager,model_todo_category,group_todo_manager,1,1,1,1
id表示这条权限记录的ID,name表示权限记录的名称,model_id:id表示模型的ID(以model_+模型名),group_id:id表示配置权限的用户组ID(如果为空,则全部用户组有效),perm_read | perm_write | perm_create | perm_unlink分别表示读取、修改、创建、删除的权限。
最后要把ir.model.access.csv配置到__manifest__.py的data列表中。
3,记录集权限配置
用户组的权限配置对整个组生效,控制比较大范围的权限。我们还可以通过记录集权限的控制方式来实现更细的权限控制,编写记录集规则将权限细化到记录上去。
我们先在security目录下创建一个ir_rule.xml文件,并配置记录集规则:
<?xml version="1.0" encoding="utf-8"?>
<odoo>
<data noupdate="0">
<record id="rule_todo_task_user" model="ir.rule">
<field name="name">待办事项规则 - 用户</field>
<field name="model_id" ref="model_todo_task"/>
<field name="domain_force">[('create_uid', '=', user.id)]</field>
<field name="groups" eval="[(4, ref('todo.group_todo_user'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="True"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
<record id="rule_todo_task_manager" model="ir.rule">
<field name="name">待办事项规则 - 管理员</field>
<field name="model_id" ref="model_todo_task"/>
<field name="domain_force">[('create_uid', '!=', user.id)]</field>
<field name="groups" eval="[(4, ref('todo.group_todo_manager'))]"/>
<field name="perm_read" eval="True"/>
<field name="perm_write" eval="False"/>
<field name="perm_create" eval="True"/>
<field name="perm_unlink" eval="True"/>
</record>
</data>
</odoo>
从配置可以看除,记录集的规则都是记录在模型ir.rule中,model_id是用于配置规则操作的模型,domain_force是编写记录集的过滤规则,符合条件的才可看见,groups用于指定该规则生效的用户组,如果不指定就是对所有用户生效。
最后我们还要把新加的security/ir_rule.xml添加到__manifest__.py的data列表中:
'data': [
'security/todo_security.xml',
'security/ir_rule.xml',
'security/ir.model.access.csv',
'views/views.xml',
'views/templates.xml',
'views/menus.xml',
],
重启并升级模块查看效果。