个人博客

odoo中xml搜索视图与分组权限的使用

一、简介

odoo除了常用的tree、form视图以外,还会用到search视图、用户分组权限、群组访问规则等等xml的配置。通过简单的xml文件的配置,就可以实现各种功能,简化了开发流程。

odoo除了常用的tree、form视图以外,还会用到search视图、filter过滤器、group分组功能等等。这些都是比较常用的界面功能,通常都是在xml文件中配置。

这里主要介绍的是tree视图界面下的,右上角的功能模块。

picture

1,搜索功能

默认情况下,搜索视图只会搜索模型中的name字段,例如我们输入我们需要搜索的字,在搜索框下就能看到我们搜索的内容,只有name字段被检索出来。

picture

如果我们想要检索其他的字段,这时候我们就得定义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应用中进行搜索。

picture

picture

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语法。

我们可以升级模块,在看看效果:

picture

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,自然要升级下模块才能看到效果:

picture

三、用户组与权限

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个用户组,并在指定了用户组所属的分类。implied_ids用于指定当前用户组下的用户也同时加入到该字段所指定的用户组中。users指定默认添加到当前用户组的用户。

同时还要把新加入的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模块中点击用户并编辑用户组:

picture

picture

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',
],

重启并升级模块查看效果。

相关标签
回到顶部