创建一个Odoo包(Module)
1. 简介
odoo的模块均以包(module)为基础管理,在odoo系统中我们可以选择性的安装需要的包。
将包中的内容加载进数据库,进而达到新增逻辑或者修改逻辑的目的。
2. 包组成
1. 业务对象
一般Odoo的python文件定义的class类,会根据config配置文件自动加载
2. 视图对象
将定义的业务对象内容,通过网页视图的方式展现出来
2. 数据文件
主要有XML或CSV两种文件类型,包括视图views定义文件、报表reports定义文件、权限屏蔽、
记录股则、演示数据和其他
3. 路由控制
处理来自网络浏览器的路由请求
4. 静态文件
网页文件需要加载的图片、CSS、JS等静态文件
3. 包结构
odoo文件中有一个odoo-bin.py文件,通过执行它提供的命令行,可以快速创建一个odoo包结构:
odoo-bin scaffold module_name module_save_address
注意:执行时,需要对应的python环境支持,如果本地python环境不是odoo使用的python环境,请
手动切换(比如:MAC+Anaconda -> source activate py36 注:py36是我启动odoo的虚拟环境)
相应虚拟环境Anaconda了解请挪步 Python - Anaconda.
例如我的odoo-bin.py文件在 C:/odoo/odoo-bin,我要快速创建一个新的odoo包放在C:/odoo_extends目录下:
source activate py36 (MAC) 或 activate py36 (WIN)
C:/odoo/odoo-bin scaffold demo01 C:/odoo_extends
__manifest__.py
name: 包名称
summary: 包简介
description: 包详细说明
author: 作者
website:关联的网站
category:包类别
version:包版本
depends:包依赖
data:包配置常用数据文件
demo:包配置演示数据文件
qweb:静态文件配置
installable:是否可安装
application:是否应用类
auto_install:是否自动安装
__init__.py
from . import controllers
from . import models
controllers
odoo - 浏览器网络请求路由文件包
models
odoo - python业务文件包
views
odoo - XML显示视图文件包
security
odoo - 权限屏蔽、记录规则文件包
demo
odoo - demo初始数据文件包
4. 对象关系映射
为了避免大量sql的编写,提高开发效率、高扩展性和安全性,Odoo提供了对应的ORM机制
业务对象都通过继承odoo.models.Model类,实现实体Odoo的model类,系统自动持久化数据结层。
在定义一个模型类(model)的时候,最重要的是必须要定义一个_name属性,它在odoo文件系统中
必须唯一。
数据库会同步将_name字符串的点(.)变成(_)存储在数据库中
# 简单的例子
from odoo import models
class MinimalModel(models.Model):
_name = 'test.model'
5. 模型类(model)字段
在model中定义的odoo.fields扩展内容(字段),将作为当前model的属性。
# 简单的例子
from odoo import models, fields
class LessMinimalModel(models.Model):
_name = 'test.model2'
name = fields.Char()
字段通用属性
字段可以去使用一些ORM定义好的通用属性:
string:字段视图显示名称
required:单据创建时,字段必须输入值
help:字段帮助信息
index:对当前字段在数据库对应的列 创建字段索引
...
字段类型
Odoo目前支持两种类型的基础字段:
1. 较为简单直接存储在当前model表中的基础字段:Char、Integer、Float、Boolean、Date、Datetime
2. 关系字段(数据库外键): Many2one、One2many、Many2many
字段后面会在专题中学习和说明
保留字段
Odoo默认给每个model创建几个预制字段,在Oracle EBS中叫做5个who字段:
1. id:默认给当前模型创建一个id自增序列字段
2. create_date(Datetime类型):记录创建时间
3. create_uid(Many2one类型):记录的创建人
4. write_date(Datetime类型):记录最后一次修改时间
5. write_uid(Many2one类型):记录最后一次修改人
特殊字段
odoo的每个model必须有一个name,它用于在视图界面上显示名称,如果没有name或者想指定显示成其他字段的名称
可以使用 _rec_name = 'field_name'
from odoo import models, fields, api
class Course(models.Model):
_name = 'openacademy.course'
_description = "OpenAcademy Courses"
name = fields.Char(string="Title", required=True)
description = fields.Text()
数据文件
Odoo是一个高度数据驱动的系统,我们可以通过XML预制模型数据(初始化数据条目)
xml中使用<record>标签去创建或者更新数据记录
<odoo>
<record model="{model name}" id="{record identifier}">
<field name="{a field name}">{a value}</field>
</record>
</odoo>
1. model是当前Odoo的model类_name内容
2. id是个在整个系统中唯一的标识名称
3. <field>标签中name是model中的字段名
定义好的XML单据要在__manifest__.py文件中注册,如果是业务记录放在data字典中,如果是演示数据记录放在demo字典中
<odoo>
<record model="openacademy.course" id="course0">
<field name="name">Course 0</field>
<field name="description">Course 0's description Can have multiple lines
</field>
</record>
<record model="openacademy.course" id="course1">
<field name="name">Course 1</field>
<!-- no description for this one -->
</record>
<record model="openacademy.course" id="course2">
<field name="name">Course 2</field>
<field name="description">Course 2's description</field>
</record>
</odoo>
6. 动作(Actions)和菜单(Menus)
动作和菜单是一些会更新到数据库的固定记录,所以一般写在XML文件中(记得注册),动作会有三种触发方式:
1. 点击菜单按钮,如果菜单按钮上绑定动作,将执行对应的动作
2. 点击视图上定义的按钮,如果按钮绑定了动作,将执行对应的动作
3. 作为对象的上下文动作
因为菜单申明有些复杂,所以我们可以使用一个简短的<menuitem>标签来定义ir.ui.menu的模型记录,而且
绑定动作更为方便
<odoo>
<!--省略Tree视图定义-->
<!--省略Form视图定义-->
<!--动作-->
<record model="ir.actions.act_window" id="action_list_ideas">
<field name="name">Ideas</field>
<field name="res_model">idea.idea</field>
<field name="view_mode">tree,form</field>
</record>
<!--菜单-->
<menuitem id="menu_ideas" parent="menu_root" name="Ideas" sequence="10"
action="action_list_ideas"/>
</odoo>
注意:action动作必须定义在menu菜单之前,XML数据文件的执行是按照流程加载的,如果顺序错误会报错
找不到动作记录。