openerp开发案例
来源:互联网 发布:淘宝首页添加链接代码 编辑:程序博客网 时间:2024/04/30 02:22
开发案例:
通过此案例,你可以了解到:
1.一个基本的OpenERP模块的构成
2.字段的定义方法
3.视图定义定义的方法(表单视图,列表视图,视图动作,菜单)
1)写一个模块
需求
- 输入和查询课程,把信息储存到课程对象里
- 课程包含以下信息:名称,价格,天数,开始日期,教师,学员
- 每个课程可以有多个学员,要记录学员的姓名、电话、电子邮件
- 课程可以添加教材和作业等文档附件
- 用户可以设置默认值以加速输入
- 可以按名称查询课程,也可以用其他信息查找课程,并保存常用查询条件
- 可以导出课程信息到excel文件,并支持导入
- 可以按日期查看课程,并调整课程时间
- 老师只能看到自己的课程
在openerp的addons文件下新建一个模块名,
模块名就叫做oecn_training,然后它下面有四个文件,分别如下:
|--oecn_training
|--__init__.py
|--__openerp__.py
|--lesson.py
|--lesson_view.xml
__init__.py(编辑)
__init__.py文件是Python 的模块描述,因为OpenERP模块也是一个普通的Python模块:
- # -*- encoding: utf-8 -*-
- import lesson #导入包含Python代码的所有文件和目录
__openerp__.py
__openerp__.py文件(在6.0之前的版本也叫__terp__.py)它包含一个Python的字典声明这个模块的相关信息:模块名字,依赖关系,说明和组成。
- {
- "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' #模块类型
- }
lesson.py
- # -*- coding: utf-8 -*-
- from openerp.osv import fields, osv
- class oecn_training_lesson(osv.osv):
- _name = 'oecn.training.lesson'
- _discription = '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()
lesson_view.xml
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<!--定义表单视图-->
<record model="ir.ui.view" id="oecn_training_lesson_from_view">
<field name="name">课程表单</field>
<field name="type">form</field>
<field name="model">oecn.training.lesson</field>
<field name="arch" type="xml">
<field name="name"/>
<field name="date_start"/>
<field name="total_day"/>
<field name="price"/>
<field name="teacher"/>
<field name="students" colspan="4"/>
</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">
<field name="name"/>
<field name="date_start"/>
<field name="teacher"/>
<field name="price" sum="合计"/>
</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>
安装一个模块(编辑)
1.确保在扩展视图下(右上角小齿轮->首选项->扩展)
2.更新模块列表(设置->模块->更新模块列表)
3.搜索自己的模块(设置->模块->模块)
4.安装后重启服务器
2)通过继承修改一个模块
需求
我们想添加一个教室对象,而且给每个课程都分配一个教室。
分析
有两个办法可以做到:一、修改上面的程序。虽然上面是新的模块可能我们直接修改没有特别的问题,但是如果是系统默认模块怎么办呢,如果我直接修改了源码,那么以后模块的升级会造成各种不可预料的问题,而且同一个源码会影响到所有的的帐套。所以我们建议通过继承来修改模块。我们会以一个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
__init__.py
- # -*- encoding: utf-8 -*-
- #导入包含Python代码的所有文件和目录
- import lesson
- import classroom
__openerp__.py
- # -*- encoding: utf-8 -*-
- {
- "name" : "OECN Training Classroom",#模块名
- "version" : "1.0", #模块版本
- "description" : 'OECN Training Demo -- ClassRoom', #模块说明
- "author" : "Shine IT", #作者
- "website" : "http://www.openerp.cn",#网址
- "depends" : ['oecn_training'], #依赖的模块,此模块我们会继承oecn_training所以必须依赖他
- "update_xml" : [
- "lesson_view.xml" , #需要继承的视图
- "classroom_view.xml",], #模块更新的时候会读入的文件
- "installable" : True, #可否安装
- "category":'Generic Modules/Others' #模块类型
- }
lesson.py
- # -*- coding: utf-8 -*-
- from openerp.osv import fields, osv
- class oecn_training_lesson(osv.osv):
- _name = 'oecn.training.lesson' #本对象的名称
- _inherit = 'oecn.training.lesson' #要继承的对象的_name
- _columns = {
- 'classroom_id':fields.many2one('oecn.training.classroom','教室'),#添加一个教室属性,为多对一对象。
- }
- oecn_training_lesson()
- # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
classroom.py
- # -*- coding: utf-8 -*-
- from openerp.osv import fields, osv
- class oecn_training_classroom(osv.osv):
- _name = 'oecn.training.classroom'
- _discription = 'OECN 教室'
- _columns = {
- 'number':fields.char('编号', size=64,select=True),
- 'capacity':fields.integer('容纳人数',select=True),
- 'location':fields.char('地点', size=125,select=True),
- }
- oecn_training_classroom()
- # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
lesson_view.xml
<?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_from_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"),添加一个教室字段
classroom_view.xml
<?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>
- openerp开发案例
- OpenERP案例一
- OpenERP Web开发
- OpenERP Web开发
- 配置openerp的开发环境
- openerp开发ORM对象基本信息
- openerp开发ORM对象基本信息
- OpenERP开发文档 2.1.模块开发
- OpenERP分析会计(Analytic Account)应用案例
- OpenERP中商品销售的处理及案例解析
- Openerp开发进销存系统完毕总结
- Odoo(OpenERP)开发实践:菜单隐藏(1)
- Odoo(OpenERP)开发实践:菜单隐藏(2)
- Odoo(OpenERP)开发实践:数据模型学习
- Odoo(OpenERP)开发实践:基本字段类型
- OpenERP Server Developers Documentation (Openerp服务器开发文档)之 Module 之 Example of module creation
- OpenERP Server Developers Documentation (Openerp服务器开发文档)之 Module 之 Views and Events
- [推荐]OpenERP开发笔记(5) -- 自定义模块开发之一
- 专访邓凡平:Android开发路上的快速学习之道
- 投文章模板
- node.js npm ffi Could not locate the bindings file
- 在Android中对SD卡进行扇区级读写
- Android之用HTTP的get,post,HttpClient三种方式向service提交文本数据
- openerp开发案例
- 有待验证的问题
- 王超:奇虎360 MongoDB
- Android 异步获取网络图片并处理导致内存溢出问题解决方法
- Magento A-Z和sitemap插件
- SNMP监控系统cpu、disk、memory等问题汇总
- 阅读paper技巧
- 直接拿来用!最火的Android开源项目(一)
- ArcGIS桌面定制-灵巧的Python Add-in