Odoo中文网|Odoo实施培训

 找回密码
 立即注册
搜索
热搜: Odoo OpenERP 实施
查看: 7430|回复: 0
打印 上一主题 下一主题

入门级案例

[复制链接]

5

主题

5

帖子

17

积分

新手上路

Rank: 1

积分
17
跳转到指定楼层
楼主
发表于 2015-9-15 20:58:00 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
对于OpenERP的开发,你只需要安装一个OpenERP(源码、ALL-IN-ONE),直接打开Python代码(推荐使用notepad++,editplus编辑器),修改。

只需要有基本的Python语法知识还有就是Just Do It。

系统架构

OpenERP数据库使用的是PostgreSQL,有基于GTK的富客户端,也有基于网页的浏览器端

开发案例

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

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

2.字段的定义方法

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

1)写一个模块

需求

输入和查询课程,把信息储存到课程对象里
课程包含以下信息:名称,价格,天数,开始日期,教师,学员
每个课程可以有多个学员,要记录学员的姓名、电话、电子邮件
课程可以添加教材和作业等文档附件
用户可以设置默认值以加速输入
可以按名称查询课程,也可以用其他信息查找课程,并保存常用查询条件
可以导出课程信息到excel文件,并支持导入
可以按日期查看课程,并调整课程时间
老师只能看到自己的课程
模块名就叫做oecn_training,然后它下面有四个文件,分别如下。

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

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

Python (plain)

# -*- coding: utf-8 -*-

import lesson #导入包含Python代码的所有文件和目录

__openerp__.py

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

Python (plain)

# -*- 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'  

}

lesson.py

Python (plain)

# -*- 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()

lesson_view.xml

<?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

1.确保在扩展视图下(右上角小齿轮->首选项->扩展)

!!7.0 版本OpenERP 可以忽略此步直接 `更新模块列表`, 如果没有`更新模块列表`菜单, 请用 admin 用户登陆修改对应登陆用户的权限, 勾选"技术特性".

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

Python (plain)

# -*- coding: utf-8 -*-

#导入包含Python代码的所有文件和目录

import lesson

import classroom

__openerp__.py

Python (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.py

Python (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,重新登陆一下.

学习OpenERP二次开发的最佳路径

首先需要自己的尝试,但是也有很多的资源可以用到

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|技术支持|开发手册|Odoo中文网-远鼎旗下odoo培训网站 ( 苏ICP备15039516号 )

GMT+8, 2024-5-17 10:55 , Processed in 0.011100 second(s), 10 queries , Xcache On.

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表