本帖最后由 南帝 于 2016-6-24 23:02 编辑
构建Odoo模块模块组成业务对象 业务对象声明为Python类, 由Odoo自动载入. 数据文件 XML或CSV文件格式, 在其中声明了元数据(视图或工作流)、配置数据(模块参数)、演示数据等. Web控制器 处理Web浏览器发来的requests. 静态web数据 Web用到的图像, CSS或JavaScript文件. 模块结构一个Odoo模块也是一个Python模块, 存放在一个目录中, 包含一个__init__.py文件, 用于导入其他Python模块. from . import mymoduleodoo.py提供了一个子命令scaffold可以方便地创建一个空的模块. $ odoo.py scaffold 命令执行后, 将会创建一个子目录并且其中包括了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 modelsclass 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, apiclass Course(models.Model): _name = 'openacademy.course' name = fields.Char(string="Title", required=True) description = fields.Text()数据文件Odoo是一个高度数据驱动的系统, 虽然使用Python代码来定制模块行为, 但很多模块数据是在其载入时setup的, 并且有些模块仅仅为Odoo添加数据. 通过数据文件来定义模块数据, 例如可以使用XML文件中的元素定义数据, 每一个元素创建或者更新数据库中的一条记录, 形式如下: {a value} model Odoo模型名. id 外部ID(External Identifier), 通过它可以引用到记录(并且不需要知道记录所在的数据库ID). 元素 name属性用于确定字段名称(例如description), 该元素的body给出字段的值. 数据文件必须在模块载入清单文件列表中, 也就是__openerp__.py的’data’列表(全部载入)或’demo’列表(只有设定为载入演示数据才会载入)中. 练习 #3创建一个数据文件来向Course中添加数据, 编辑openacademy/demo.xml, 并确认__openerp__.py的’demo’列表中有该文件. Course 0 Course 0's descriptionCan have multiple lines Course 1 Course 2 Course 2's description 动作和菜单在Odoo中, 动作和菜单都是定义在数据库中的数据记录, 一般通过数据文件来定义. 动作可以由三种方式触发: 点击菜单项(菜单项链接到特定动作) 点击视图上的按钮(如果按钮连接到动作) 作为对象的上下文动作
使用声明一个ir.ui.menu并将其连接到一个action, 可以用下面的形式的代码. Ideas idea.idea tree,form注意: action必须先于menu的连接使用定义, 数据文件在载入时顺序地执行, 所以动作的ID必须首先存在于数据库中才能使用. 练习 #4定义一个新的菜单项访问OpenAcademy课程. 创建openacademy/views/openacademy.xml文件, 并在其中添加动作和菜单. Courses openacademy.course form tree,form <field name="help" type="html">Create the first course 在__openerp__.py中添加这个数据文件名到’data’. 'data': [ # 'security/ir.model.access.csv', 'templates.xml', 'views/openacademy.xml', ],更新模块后可以看到菜单, 操作看看效果.
|