參考资料点击这里.
构建Odoo模块
模块组成
业务对象
业务对象声明为Python类, 由Odoo自己主动加载.
数据文件
XML或CSV文件格式, 在当中声明了元数据(视图或工作流)、配置数据(模块參数)、演示数据等.
Web控制器
处理Web浏览器发来的requests.
静态web数据
Web用到的图像, CSS或JavaScript文件.
模块结构
一个Odoo模块也是一个Python模块, 存放在一个文件夹中, 包括一个__init__.py文件, 用于导入其它Python模块.
from . import mymodule
odoo.py提供了一个子命令scaffold能够方便地创建一个空的模块.
$ odoo.py scaffold name> <where to put it>
命令运行后, 将会创建一个子文件夹而且当中包括了Odoo模块所需的一些基本文件.
练习 #1
运行 ./odoo.py scaffold openacademy addons, 在addons文件夹下创建一个名为openacademy的模块, 生成的文件夹文件结构例如以下.
openacademy
├── __init__.py
├── __openerp__.py
├── controllers.py
├── demo.xml
├── models.py
├── security
│ └── ir.model.access.csv
└── templates.xml
各文件内容请查看文件或查看原文, 然后对__openerp__.py中的几种标识文本进行改动.
对象关系映射
ORM层是Odoo的一个关键组件, 它能够避免大部分的SQL语句编写从而提高扩展性和安全性.
业务对象用派生自Model的Python类(模型)来编写, 该类的_name属性定义了模型在Odoo系统中的名称.
from openerp import models
class MinimalModel(models.Model):_name = 'test.model'
字段
字段定义模型能够存储什么以及在哪里存储, 字段在模型类中用属性来定义.
from openerp import models, fieldsclass LessMinimalModel(models.Model):_name = 'test.model2'name = fields.Char()
通用属性
与模型相似, 字段也能够通过參数传递对其进行设定:
name = field.Char(required=True)
字段的经常使用属性有:
string (unicode, default: field’s name)
The label of the field in UI (visible by users).
required (bool, default: False)
If True, the field can not be empty, it must either have a default value or always be given a value when creating a record.
help (unicode, default: ‘’)
Long-form, provides a help tooltip to users in the UI.
index (bool, default: False)
Requests that Odoo create a database index on the column
简单字段
字段能够分为两类: 简单字段和关系字段. 前者为原子值, 直接保存在模型相应的数据库表中; 后者连接到其它的记录上(能够是同样的模型也能够是不同的模型).
Boolean, Date, Char这些都是简单字段.
保留字段
Odoo在模型中自己主动创建并维护一些字段, 这些字段就是保留字段, 这些字段数据不须要也不应该手动去改动.
id (Id)
the unique identifier for a record in its model
create_date (Datetime)
creation date of the record
create_uid (Many2one)
user who created the record
write_date (Datetime)
last modification date of the record
write_uid (Many2one)
user who last modified the record
特殊字段
默认情况下, Odoo要求模型中有一个name字段, 用于显示和搜索, 通过设置_rec_name也能够达到这种目的.
练习 #2
在openacademy模块中定义一个新的模型Course, openacademy/models.py内容例如以下:
# -*- coding: utf-8 -*-
from openerp import models, fields, api
class Course(models.Model):_name = 'openacademy.course'name = fields.Char(string="Title", required=True)description = fields.Text()
数据文件
Odoo是一个高度数据驱动的系统, 尽管使用Python代码来定制模块行为, 但非常多模块数据是在其加载时setup的, 而且有些模块仅仅为Odoo加入数据.
通过数据文件来定义模块数据, 比如能够使用XML文件里的
<openerp><data><record model="{model name}" id="{record identifier}"><field name="{a field name}">{a value}field>record>data>
<openerp>
model
Odoo模型名.
id
外部ID(External Identifier), 通过它能够引用到记录(而且不须要知道记录所在的数据库ID).
元素
name属性用于确定字段名称(比如description), 该元素的body给出字段的值.
数据文件必须在模块加载清单文件列表中, 也就是__openerp__.py的’data’列表(所有加载)或’demo’列表(仅仅有设定为加载演示数据才会加载)中.
练习 #3
创建一个数据文件来向Course中加入数据, 编辑openacademy/demo.xml, 并确认__openerp__.py的’demo’列表中有该文件.
<openerp><data><record model="openacademy.course" id="course0"><field name="name">Course 0field><field name="description">Course 0's descriptionCan have multiple linesfield>record><record model="openacademy.course" id="course1"><field name="name">Course 1field>record><record model="openacademy.course" id="course2"><field name="name">Course 2field><field name="description">Course 2's descriptionfield>record>data>
openerp>
动作和菜单
在Odoo中, 动作和菜单都是定义在数据库中的数据记录, 一般通过数据文件来定义.
动作能够由三种方式触发:
- 点击菜单项(菜单项链接到特定动作)
- 点击视图上的按钮(假设按钮连接到动作)
- 作为对象的上下文动作
使用
model="ir.actions.act_window" id="action_list_ideas">name="name">Ideas name="res_model">idea.idea name="view_mode">tree,form
注意: action必须先于menu的连接使用定义, 数据文件在加载时顺序地运行, 所以动作的ID必须首先存在于数据库中才干使用.
练习 #4
定义一个新的菜单项訪问OpenAcademy课程.
创建openacademy/views/openacademy.xml文件, 并在当中加入动作和菜单.
xml version="1.0" encoding="UTF-8"?
>
<openerp> <data> <record model="ir.actions.act_window" id="course_list_action"> <field name="name">Coursesfield> <field name="res_model">openacademy.coursefield> <field name="view_type">formfield> <field name="view_mode">tree,formfield> <field name="help" type="html"> <p class="oe_view_nocontent_create">Create the first course p> field> record> <menuitem id="main_openacademy_menu" name="Open Academy"/> <menuitem id="openacademy_menu" name="Open Academy" parent="main_openacademy_menu"/> <menuitem id="courses_menu" name="Courses" parent="openacademy_menu" action="course_list_action"/> data> openerp>
在__openerp__.py中加入这个数据文件名称到’data’.
'data': [# 'security/ir.model.access.csv','templates.xml','views/openacademy.xml',],
更新模块后能够看到菜单, 操作看看效果.
基本视图
视图定义了模型数据怎样显示, 每种类型的视图代表一种数据可视化模式.
主要的视图定义
一个视图是以一条ir.ui.view模型数据的形式定义的.
<record model="ir.ui.view" id="view_id"><field name="name">view.namefield><field name="model">object_namefield><field name="priority" eval="16"/><field name="arch" type="xml">field>
record>
Tree views
Tree view也被称为list views, 在一个表格中显示记录. 根元素是
<tree string="Idea list"><field name="name"/><field name="inventor_id"/>
tree>
Form views
Form用于创建或编辑单条记录, 根元素是