openerp开发案例

开发案例:

通过此案例,你可以了解到:

1.一个基本的OpenERP模块的构成

2.字段的定义方法

3.视图定义定义的方法(表单视图,列表视图,视图动作,菜单)

1)写一个模块

需求
  1. 输入和查询课程,把信息储存到课程对象里
  2. 课程包含以下信息:名称,价格,天数,开始日期,教师,学员
  3. 每个课程可以有多个学员,要记录学员的姓名、电话、电子邮件
  4. 课程可以添加教材和作业等文档附件
  5. 用户可以设置默认值以加速输入
  6. 可以按名称查询课程,也可以用其他信息查找课程,并保存常用查询条件
  7. 可以导出课程信息到excel文件,并支持导入
  8. 可以按日期查看课程,并调整课程时间
  9. 老师只能看到自己的课程

在openerp的addons文件下新建一个模块名,

模块名就叫做oecn_training,然后它下面有四个文件,分别如下:

|--oecn_training
     |--__init__.py
     |--__openerp__.py
     |--lesson.py
     |--lesson_view.xml

__init__.py(编辑)

__init__.py文件是Python 的模块描述,因为OpenERP模块也是一个普通的Python模块:

  1. # -*- encoding: utf-8 -*-
  2. import lesson #导入包含Python代码的所有文件和目录
__openerp__.py

__openerp__.py文件(在6.0之前的版本也叫__terp__.py)它包含一个Python的字典声明这个模块的相关信息:模块名字,依赖关系,说明和组成。

  1. {
  2.     "name" : "OECN Training", #模块名
  3.     "version" : "1.0",        #模块版本
  4.     "description" : 'OECN Training Demo', #模块说明
  5.     "author" : "Shine IT",    #作者
  6.     "website" : "http://www.openerp.cn", #网址
  7.     "depends" : [ ],                      #依赖的模块
  8.     "update_xml" : [ "lesson_view.xml" ]#模块更新的时候会读入的文件
  9.     "installable" : True,                #可否安装                 
  10.     "category": 'Generic Modules/Others'  #模块类型
  11. }

lesson.py

  1. # -*- coding: utf-8 -*-
  2. from openerp.osv import fields, osv
  3. class oecn_training_lesson (osv. osv ):
  4.      _name = 'oecn.training.lesson'
  5.      _discription = 'OECN 培训课程'
  6.      _columns = {
  7.         'name':fields. char ( u '课程名',size= 64, select= True ),
  8.         'date_start':fields. date (u '开始日期', select= True ),
  9.         'total_day':fields. float (u '总天数',digits= ( 16, 1 ) ),
  10.         'teacher':fields. many2one ( 'res.users',u '授课老师' ),
  11.         'students':fields. many2many ( 'res.partner', string=u '学生' ),
  12.         'price':fields. float (u '价格',digits= ( 16, 2 ) ),
  13.          }
  14. 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

 

  1. # -*- encoding: utf-8 -*-
  2. #导入包含Python代码的所有文件和目录
  3. import lesson
  4. import classroom

__openerp__.py

  1. # -*- encoding: utf-8 -*-
  2. {
  3.    "name" : "OECN Training Classroom", #模块名
  4.    "version" : "1.0",        #模块版本
  5.    "description" : 'OECN Training Demo -- ClassRoom', #模块说明
  6.    "author" : "Shine IT",    #作者
  7.    "website" : "http://www.openerp.cn", #网址
  8.    "depends" : [ 'oecn_training' ],       #依赖的模块,此模块我们会继承oecn_training所以必须依赖他
  9.    "update_xml" : [
  10.        "lesson_view.xml"  ,          #需要继承的视图
  11.        "classroom_view.xml", ]#模块更新的时候会读入的文件
  12.    "installable" : True,                #可否安装                 
  13.    "category": 'Generic Modules/Others'  #模块类型
  14. }

lesson.py

 

  1. # -*- coding: utf-8 -*-
  2. from openerp.osv import fields, osv
  3. class oecn_training_lesson (osv. osv ):
  4.     _name = 'oecn.training.lesson' #本对象的名称
  5.     _inherit = 'oecn.training.lesson' #要继承的对象的_name
  6.     _columns = {
  7.        'classroom_id':fields. many2one ( 'oecn.training.classroom', '教室' ), #添加一个教室属性,为多对一对象。
  8.         }
  9. oecn_training_lesson ( )
  10. # vim:expandtab:smartindent:tabstop=4:softtabstop=4:shiftwidth=4:

classroom.py

 

  1. # -*- coding: utf-8 -*-
  2. from openerp.osv import fields, osv
  3. class oecn_training_classroom (osv. osv ):
  4.     _name = 'oecn.training.classroom'
  5.     _discription = 'OECN 教室'
  6.     _columns = {
  7.         'number':fields. char ( '编号', size= 64, select= True ),
  8.         'capacity':fields. integer ( '容纳人数', select= True ),
  9.         'location':fields. char ( '地点', size= 125, select= True ),
  10.         }
  11. oecn_training_classroom ( )
  12. # 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开发案例)