|
通过继承修改一个模块
需求
我们想添加一个教室对象,而且给每个课程都分配一个教室。
分析有两个办法可以做到:一、修改上面的程序。虽然上面是新的模块可能我们直接修改没有特别的问题,但是如果是系统默认模块怎么办呢,
如果我直接修改了源码,那么以后模块的升级会造成各种不可预料的问题,而且同一个源码会影响到所有的的帐套。所以我们建议通过继承来修改模块。
我们会以一个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__.pyPython (plain)
- # -*- coding: utf-8 -*-
- #导入包含Python代码的所有文件和目录
- import lesson
- import classroom
__openerp__.pyPython (plain)
- # -*- 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"
- }
lesson.pyPython (plain)
- # -*- 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()
- ?
- # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:
classroom.py
- Python (plain)
- # -*- 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()
- ?
- # 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_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"),添加一个教室字段。
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>
复制代码
继承修改一个模块后, 请记住,也需要按上面安装一个模块那样. 去 重启服务器, 更新模块, 推荐再退出OE,重新登陆一下.
|
|