一些 Odoo 模块创建新应用,而另一些则对已有应用添加功能或作出修改。虽然两者的技术组件基本相同,但应用会被预期包含一些特征性元素。我们创建的是一个图书应用,所以应包含这些元素,它们是:
- 图标:用于在应用列表中展示
- 顶级菜单项:其下放置所有的应用菜单项
- 应用安全组:通过权限访问仅对指定用户开放
添加图标(icon),仅需在模块目录下static/description/子文件夹中放置icon.png文件,前面已经介绍过了。下面我们来添加应用顶级菜单。
添加应用顶级菜单项
我们创建的是一个新应用,因此应包含主菜单项,在社区版本中,显示在左侧下拉菜单中,而在企业版中,则作为附加图标显示在应用切换器主界面中。
菜单项是使用 XML 文件中添加的视图组件,通过创建views/library_menu.xml来定义菜单项:
<?xml version="1.0"?>
<odoo>
<!-- Library App Menu -->
<menuitem id="menu_library"
name="Library" />
</odoo>
用户界面中的菜单项和操作均存储于数据表中,上面的代码是一个 Odoo 数据文件,描述了要载入 Odoo 数据库的记录。其中的元素是向ir.ui.menu模型写入记录的指示。 id 属性也称作XML ID,用于唯一标识每个数据元素,以供其它元素引用。例如在添加图书子菜单时,就需要引用顶级菜单的XML ID,即menu_library。XML ID是一个重要话题,将在后面探讨。
此处添加的菜单项非常简单,仅用到了 name 属性。其它常用的属性这里没有使用,没有设置父菜单,因为这是一个顶级菜单。也没有设置 action,因菜单项本身并不做任何事,仅仅用于放置后面要创建的子菜单项。模块还不知道 XML 数据文件的存在,我们需要在__manifest__.py中使用 data 属性来添加安装或更新时需要加载的模块列表以进行声明。在manifest 文件的字典中加入:
'data': [
'views/library_menu.xml',
],
要向Odoo数据库中加载这些菜单设置,需要升级模块。此时还不会有什么显式的效果,因菜单项还不包含可操作子菜单,所以不会显示。在添加好子菜单及合适的访问权限时即可显示。
添加权限组
普通用户在使用功能前需获得相应的权限。Odoo 中使用安全组来实现,权限授予组,组中分配用户。Odoo 应用通常有两个组:针对普通用户的用户组,包含额外应用配置权限的管理员组。
下面我们就来添加这两个安全组。权限安全相关的文件通常放在模块下/security子目录中,这里我们创建security/library_security.xml 文件来进行权限定义。安全组使用分类来更好地组织关联应用。所以第一步我们在ir.module.category模型中创建针对图书应用的分类:
<?xml version="1.0"?>
<odoo>
<record id="module_library_category" model="ir.module.category">
<field name="name">Library</field>
</record>
</odoo>
下一步,我们要添加两个安全组,首先添加用户组。在以上结束标签前添加如下 XML 代码块:
<!-- Library User Group -->
<record id="library_group_user" model="res.groups">
<field name="name">User</field>
<field name="category_id"
ref="module_library_category"/>
<field name="implied_ids"
eval="[(4, ref('base.group_user'))]"/>
</record>
记录在res.groups模型中创建,添加了三个字段:
- name:组名
- category_id:关联应用,这是一个关联字段,因此使用了 ref 属性来通过 XML ID 连接已创建的分类
- implied_ids:这是一个one-to-many关联字段,包含一系列组来对组内用户生效。这里使用了一个特殊语法。我们使用了编号4来连接基本内部用户组base.group_user。
然后我们创建管理员组,授予用户组的所有权限以及为应用管理员保留的其它权限:
<!-- Library Manager Group -->
<record id="library_group_manager" model="res.groups">
<field name="name">Manager</field>
<field name="category_id"
ref="module_library_category"/>
<field name="implied_ids"
eval="[(4, ref('library_group_user'))]"/>
<field name="users"
eval="[(4, ref('base.user_root')),
(4, ref('base.user_admin'))]"/>
</record>
像用户组一样,这里也有name, category_id和implied_ids ,implied_ids关联了图书用户组,以继承其权限。还添加了一个 users 字段,让管理员和内部 root 用户自动成为应用管理员。
同样需要在声明文件中添加该 XML 文件:
'data': [
'security/library_security.xml',
'views/library_menu.xml',
],
注意library_security.xml 加在library_menu.xml文件之前,数据文件的加载顺序非常重要,因为我们只能引用已经定义过的标识符。菜单项经常引用到安全组,所以建议将安全组定义文件放到菜单和视图文件之前。
更新应用后,就会在用户组里发现我们新建的两个权限组:
演示视频:
http://www.tderp.com/download/details/odoo12-854
http://ctdrive.tderp.com/file/13502532-466325574