Odoo遵循 MVC-like 架构设计
- M模型层,定义app的数据结构,描述业务对象,模型是从 Odoo 模板类派生的 Python 类实现的。 它们直接转换为数据库对象,Odoo在安装或升级模块时会自动处理。负责此机制的是对象关系模型(ORM)。
- V视图层,描述用户界面,是使用XML定义的,它被Web客户端框架用来转换成数据感知的HTML视图,当模块安装或升级时,xml数据文件中的这些用户接口定义就会被加载到数据库中。所有的视图都存储在数据库中,在 ir.ui.view模式下.
- C 控制器层,支持应用的业务逻辑
在启动服务器实例时,附加选项–dev=all。
Odoo模块权限管理
一般odoo管理权限会放在security文件夹里、一个csv和一个xml重要的两个文件
1. security.xml:id可以看着来写,ref-=“中的内容是继承第一个id”,仔细观察下就会发现规律。
2. ir.model.access.csv:文件名与要加载的数据的模块名相对应,并且该文件的第一行包含列名称。以下是我们的 CSV 文件中提供的列:
* id是记录的外部标识符 (也称为 XML ID)。在我们的模块中它应该是唯一。
* name是一个描述标题。它只是内容展示,在模块中最好也保持其唯一性。官方模块通常使用模型名称和组的圆点分隔的字符串。遵循此约定,我们使用 todo.task.user
* model_id 是该模型的外部标识符。ORM给模型自动生成的 O的 XML Id︰ 如 todo.task,该标识符是model_todo_task
* group_id标识授予权限的访问组。最重要的一点是提供定义它的模块名前缀。比如员工组,它的标识符为base.group_user。
* perm字段标记授予的读, 写, 创建,或删除权限。
3. 不能忘记将引用添加到文件manifest.py的data属性中。 security/ir.model.access.csv’,
4. https://blog.csdn.net/qq_43504054/article/details/98958080
创建模型层
应用程序的主要功能有:用于描述的简单文本字段、用于将其标记为完成的复选框、最后需要添加一个按钮来清除已完成任务的旧的待办事项列表。
1 | # -*- coding: utf-8 -*- |
可以使用技术菜单查看新创建的模型。在顶部菜单设置中,转到技术|数据库结构|模型,在列表中搜索todo.task模型,并单击它以查看其定义:
加入自动化测试
Odoo支持使用两种方式来描述测试: 使用 YAML 数据文件或使用 Python 代码、基于 Unittest2 库。 YAML 测试是一种遗留下来的旧老版本, 不建议使用。 我们会更乐意使用 Python 测试并将添加基本的测试实例到我门的模块。
测试代码文件必须用test_开头 , 并且从tests/init.py文件导入。 但 测试的 目录(或 Python 的子模块)不应从模块的顶部的init.py导入, 因为仅在测试的执行的时候会自动被发现并装载。
运行我们的测试。 当我们在安装模,可以添加 –test-enable选项: $ ./odoo-bin -d todo -i todo_app –test-enable
创建视图层
用户界面接口,包括菜单和动作,存储在数据库表中。
添加一个菜单选项来打开To-do Task模型
添加id属性也称为XML ID,它用于唯一标识模块内的每个数据元素,并且可以由其他元素使用来引用它。
添加到manifest.py文件的data属性中。
1
2
3
4
5
6
7
8
9
10
11
12
<odoo>
<!-- <act_window>元素定义了一个客户端窗口动作,该动作将以列表和表单视图的顺序打开todo.task模型。 -->
<act_window id="action_todo_task"
name="To-do Task"
res_model="todo.task"
view_mode="tree,form" />
<!-- <menuitem>定义了一个顶级菜单项,调用前面定义的action_todo_task动作。 -->
<menuitem id="menu_todo_task"
name="Todos"
action="action_todo_task" />
</odoo>创建Form视图
要向模块添加视图,我们在XML文件中声明一个描述视图的
元素,该模块在安装模块时将被加载到数据库中。 todo_view.xml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<odoo>
<record id="view_form_todo_task" model="ir.ui.view">
<field name="name">To-do Task Form</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<form string="To-do Task">
<group>
<field name="name"/>
<field name="is_done"/>
<field name="active" readonly="1"/>
</group>
</form>
</field>
</record>
</odoo>form视图下的标签
- header
- sheet
- group
添加动作按钮
Form视图可以添加按钮以完成特定动作。这些按钮可以打开一个新的包含Form表单的窗口或运行定义在模块中的Python函数。
string:展示在按钮上的文本
type:动作的类型(执行的操作)
name:定义的动作(操作的标识符)
class:一个可选的属性,用于展示Css样式,同HTML规则一样
创建Tree视图
1
2
3
4
5
6
7
8
9
10<record id="view_tree_todo_task" model="ir.ui.view">
<field name="name">To-do Task Tree</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<tree decoration-muted="is_done==True">
<field name="name"/>
<field name="is_done"/>
</tree>
</field>
</record>创建Search视图
元素定义了在搜索框中输入时也能搜索的字段。 元素添加了预定义的过滤条件(过滤条件可以通过用户点击来切换),是使用特定语法来定义的。 1
2
3
4
5
6
7
8
9<record id="view_filter_todo_task" model="ir.ui.view">
<field name="name">To-do Task Filter</field>
<field name="model">todo.task</field>
<field name="arch" type="xml">
<search>
<field name="name"/>
</search>
</field>
</record>
业务逻辑层
Toggle Done按钮的操作将非常简单:只需切换Is Done? 标记。对于记录上的逻辑,使用@api.multi装饰器。 这里,self将表示一个记录集,然后我们应该遍历每个记录。
1 | def do_toggle_done(self): |
AttributeError: module ‘odoo.api’ has no attribute ‘multi’
After searching in github found that ‘multi’ is removed from Odoo 13.0 as it will be default.
https://github.com/odoo/odoo/commit/4b38cc6590abcb58a0ca102a06063eb3db7ac1f4#diff-2c418cb78b7c562a79e7032645a537d2