http://www.openerp-china.org/index.php?page=developer
./odoo.py scaffold module_name target(addons_path)
对于OpenERP的开发,你只需要安装一个OpenERP(源码、ALL-IN-ONE),直接打开Python代码(推荐使用notepad++,editplus编辑器),修改。
只需要有基本的Python语法知识还有就是Just Do It。
OpenERP数据库使用的是PostgreSQL,有基于GTK的富客户端,也有基于网页的浏览器端
通过此案例,你可以了解到:
一个基本的OpenERP模块的构成
字段的定义方法
视图定义定义的方法(表单视图,列表视图,视图动作,菜单)
|--oecn_training
|--__init__.py
|--__openerp__.py
|--lesson.py
|--lesson_view.xml
init.py文件是Python 的模块描述,因为OpenERP模块也是一个普通的Python模块。
# -*- coding: utf-8 -*-
import lesson #导入包含Python代码的所有文件和目录
openerp.py文件(在6.0之前的版本也叫terp.py)它包含一个Python的字典声明这个模块的相关信息:模块名字,依赖关系,说明和组成。
# -*- coding: utf-8 -*-
# name: 模块名
#version: 模块版本
#description:模块说明
#author:作者
#website:网址
#depends:依赖的模块
#update_xml:模块更新的时候会读入的文件
#installable:可否安装
#category:模块类型
{
"name" : "OECN Training",
"version" : "1.0",
"description" : 'OECN Training Demo',
"author" : "Shine IT",
"website" : "http://www.openerp.cn",
"depends" : [],
"update_xml" : ["lesson_view.xml"],
"installable" : True,
"category":'Generic Modules/Others'
}
# -*- coding: utf-8 -*-
from openerp.osv import fields, osv
class oecn_training_lesson(osv.osv):
_name = 'oecn.training.lesson'
_description = u'OECN 培训课程'
_columns = {
'name':fields.char( u'课程名',size=64,select=True),
'date_start':fields.date(u'开始日期',select=True),
'total_day':fields.float(u'总天数',digits=(16,1)),
'teacher':fields.many2one('res.users',u'授课老师'),
'students':fields.many2many('res.partner',string=u'学生'),
'price':fields.float(u'价格',digits=(16,2)),
}
oecn_training_lesson()
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--定义表单视图-->
<record model="ir.ui.view" id="oecn_training_lesson_form_view">
<field name="name">课程表单</field>
<field name="type">form</field>
<field name="model">oecn.training.lesson</field>
<field name="arch" type="xml">
<form string="课程表单" version="7.0">
<group>
<field name="name"/>
<field name="date_start"/>
<field name="total_day"/>
<field name="price"/>
<field name="teacher"/>
<field name="students" colspan="4"/>
</group>
</form>
</field>
</record>
<!--定义列表视图-->
<record model="ir.ui.view" id="oecn_training_lesson_tree_view">
<field name="name">课程列表</field>
<field name="type">tree</field>
<field name="model">oecn.training.lesson</field>
<field name="arch" type="xml">
<tree string="课程列表" version="7.0">
<field name="name"/>
<field name="date_start"/>
<field name="teacher"/>
<field name="price" sum="合计"/>
</tree>
</field>
</record>
<!--定义视图动作-->
<record model="ir.actions.act_window" id="action_oecn_training_lesson">
<field name="name">课程</field>
<field name="res_model">oecn.training.lesson</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="view_id" ref="oecn_training_lesson_tree_view"/>
</record>
<!--定义菜单-->
<menuitem id="oecn_menu" name="OECN"/>
<menuitem id="oecn_training_menu" name="OECN Training" parent="oecn_menu"/>
<menuitem id="oecn_training_lesson_menu" name="OECN Training Lesson" parent="oecn_training_menu" action="action_oecn_training_lesson"/>
</data>
</openerp>
把oecn_training这个目录复制到openerp的addons目录下
登录OpenERP
确保在扩展视图下(右上角小齿轮->首选项->扩展)
!!7.0 版本OpenERP 可以忽略此步直接 更新模块列表
, 如果没有更新模块列表
菜单, 请用 admin 用 户登陆修改对应登陆用户的权限, 勾选"技术特性".
更新模块列表(设置->模块->更新模块列表)
搜索自己的模块(设置->模块->模块)
安装后重启服务器
我们想添加一个教室对象,而且给每个课程都分配一个教室。
有两个办法可以做到:一、修改上面的程序。虽然上面是新的模块可能我们直接修改没有特别的问题,但是如果是系统默认模块怎么办呢,如果我直接修改了源码,那么以后模块的升级会造成各种不可预料的问题,而且同一个源码会影响到所有的的帐套。所以我们建议通过继承来修改模块。我们会以一个oecn_training_classroom来继承oecn_training
|--oecn_training_classroom
|--__init__.py
|--__openerp__.py
|--lesson.py #继承oecn.training.lesson对象的文件
|--classroom.py
|--lesson_view.xml
|--classroom_view.xml
# -*- coding: utf-8 -*-
#导入包含Python代码的所有文件和目录
import lesson
import classroom
# -*- coding: utf-8 -*-
# -*- coding: utf-8 -*-
# name: 模块名
#version: 模块版本
#description:模块说明
#author:作者
#website:网址
#depends:#依赖的模块,此模块我们会继承oecn_training所以必须依赖他
#update_xml:模块更新的时候会读入的文件 #需要继承的视图
#installable:可否安装
#category:模块类型
{
"name" : "OECN Training Classroom",
"version" : "1.0",
"description" : "OECN Training Demo -- ClassRoom",
"author" : "Shine IT",
"website" : "http://www.openerp.cn",
"depends" : ['oecn_training'],
"update_xml" : [
"lesson_view.xml" ,
"classroom_view.xml",],
"installable" : True,
"category":"Generic Modules/Others"
}
# -*- coding: utf-8 -*-
from openerp.osv import fields, osv
class oecn_training_lesson(osv.osv):
_inherit = 'oecn.training.lesson' #要继承的对象的_name
_columns = {
'classroom_id':fields.many2one('oecn.training.classroom','教室'),#添加一个教室属性,为多对一对象。
}
oecn_training_lesson()
# -*- coding: utf-8 -*-
from openerp.osv import fields, osv
class oecn_training_classroom(osv.osv):
_name = 'oecn.training.classroom'
_description = u'OECN 教室'
_columns = {
'number':fields.char(u'编号', size=64, select=True),
'capacity':fields.integer(u'容纳人数', select=True),
'location':fields.char(u'地点', size=125, select=True),
}
oecn_training_classroom()
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--OECN 教室-->
<record model="ir.ui.view" id="oecn_training_lesson_from_inherit_classroom_view">
<field name="name">课程教室继承视图</field>
<field name="type">form</field>
<field name="model">oecn.training.lesson</field>
<field name="inherit_id" ref="oecn_training.oecn_training_lesson_form_view"/>
<field name="arch" type="xml">
<field name="name" position="after">
<field name="classroom_id"/>
</field>
</field>
</record>
</data>
</openerp>
上面就是继承视图的例子。
id: XML ID每个模块里必须是唯一的,如果存在多个,则会后者覆盖前者。
type:需要继承的视图的类型。
model:需要继承的对象的名字
inherit_id:需要继承的视图的ID,格式为:模块名.XML ID
<field name="name" position="after">
<field name="classroom_id"/>
</field>
意思是在要继承的视图的name字段后(position="after"),添加一个教室字段。
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--OECN 教室-->
<record model="ir.ui.view" id="oecn_training_classroom_from_view">
<field name="name">教室</field>
<field name="type">form</field>
<field name="model">oecn.training.classroom</field>
<field name="arch" type="xml">
<field name="number"/>
<field name="capacity"/>
<field name="location" />
</field>
</record>
<!--定义列表视图-->
<record model="ir.ui.view" id="oecn_training_classroom_tree_view">
<field name="name">教室列表</field>
<field name="type">tree</field>
<field name="model">oecn.training.classroom</field>
<field name="arch" type="xml">
<field name="number"/>
<field name="capacity"/>
<field name="location" />
</field>
</record>
<!--定义视图动作-->
<record model="ir.actions.act_window" id="action_oecn_training_classroom">
<field name="name">教室</field>
<field name="res_model">oecn.training.classroom</field>
<field name="view_type">form</field>
<field name="view_mode">form,tree</field>
<field name="view_id" ref="oecn_training_classroom_tree_view"/>
</record>
<menuitem id="oecn_training_classroom_menu" name="OECN Training Classroom" parent="oecn_training.oecn_training_menu" action="action_oecn_training_classroom"/>
</data>
</openerp>