1. 程式人生 > >openERP筆記 自定義模塊開發

openERP筆記 自定義模塊開發

oom size 創建工程 for 編號 文檔 姓名 use python

##需求描述

  1. 輸入和查詢課程,把信息儲存到課程對象裏
  2. 課程包含以下信息:名稱,價格,天數,開始日期,教師,學員
  3. 每個課程可以有多個學員,要記錄學員的姓名、電話、電子郵件
  4. 課程可以添加教材和作業等文檔附件
  5. 用戶可以設置默認值以加速輸入
  6. 可以按名稱查詢課程,也可以用其他信息查找課程,並保存常用查詢條件
  7. 可以導出課程信息到excel文件,並支持導入
  8. 可以按日期查看課程,並調整課程時間
  9. 老師只能看到自己的課程

##編寫課程模塊

###PyCharm中創建工程

PyCharm中創建一個工程my_training, 存放在OE addons目錄下, 並在該工程中打開OE目錄(見之前的文章).

###文件結構

模塊名命名為”my_training”, 目錄下四個文件, 如下:

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

###__init__.py

Python模塊描述文件, 每個OE模塊也是一個Python模塊.

# -*- coding: utf-8 -*-
import lesson

###__openerp__.py

# -*- coding: utf-8 -*-
{
    "name": "My Training", #模塊名
    "version": "1.0",        #模塊版本
    "description": ‘My Training Demo‘, #模塊說明
    "author": "Jeff",    #作者
    "website": "http://www.jeffzhang.cn", #網址
    "depends": [],                      #依賴的模塊
    "data": ["lesson_view.xml"],
    "demo": [],
    "installable": True,                #可否安裝
    ‘auto_install‘: False,
 }

###lesson.py

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

from openerp.osv import fields, osv

class my_training_lesson(osv.osv):
    _name = ‘my.training.lesson‘
    _discription = u‘培訓課程示例‘
    _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)),
    }

my_training_lesson()

###lesson_view.xml

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
    <!--定義表單視圖-->
        <record model="ir.ui.view" id="my_training_lesson_form_view">
            <field name="name">課程表單</field>
            <field name="type">form</field>
            <field name="model">my.training.lesson</field>
            <field name="arch" type="xml">
                <form string="課程表單">
                    <field name="name"/>
                    <field name="date_start"/>
                    <field name="total_day"/>
                    <field name="price"/>
                    <field name="teacher"/>
                    <field name="students" colspan="4"/>
                </form>
            </field>
        </record>
        <!--定義列表視圖-->
        <record model="ir.ui.view" id="my_training_lesson_tree_view">
            <field name="name">課程列表</field>
            <field name="type">tree</field>
            <field name="model">my.training.lesson</field>
            <field name="arch" type="xml">
                <tree string="課程列表">
                    <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_my_training_lesson">
        <field name="name">課程</field>    <!--這個字符串即課程對應列表或編輯界面的標題-->
        <field name="res_model">my.training.lesson</field>
        <field name="view_type">form</field>
        <field name="view_mode">form,tree</field>
        <field name="view_id" ref="my_training_lesson_tree_view"/>
    </record>
<!--定義菜單-->
    <menuitem id="my_menu" name="培訓示例"/>
    <menuitem id="my_training_menu" name="培訓" parent="my_menu"/>
    <menuitem id="my_training_lesson_menu" name="培訓課程" parent="my_training_menu" action="action_my_training_lesson"/>
</data>
</openerp>

##通過繼承修改模塊

Custom Module Development第一部分中說明了怎麽擴展一個系統模塊, 這部分擴展剛才編寫的課程模塊.

###PyCharm中創建工程

PyCharm中創建一個工程my_training_classroom, 存放在OE addons目錄下, 並在該工程中打開OE目錄(見之前的文章).

###文件結構

模塊名命名為”my_training_classroom”, 目錄下六個文件, 如下:

|--my_training_classroom
     |--__init__.py
     |--__openerp__.py
     |--lesson.py  #繼承my.training.lesson對象的文件
     |--classroom.py
     |--lesson_view.xml
     |--classroom_view.xml

###__init__.py

# -*- coding: utf-8 -*-
import lesson
import classroom

###__openerp__.py

# -*- coding: utf-8 -*-
{
    "name": "My Training Classroom", #模塊名
    "version": "1.0",        #模塊版本
    "description": ‘My Training Demo -- ClassRoom‘, #模塊說明
    "author": "Jeff",    #作者
    "website": "http://www.jeffzhang.cn", #網址
    "depends": ["my_training"],                      #依賴的模塊
    "data": [
        "lesson_view.xml",      # 需要繼承的視圖
        "classroom_view.xml",],   # 模塊更新時讀入的文件
    "demo": [],
    "installable": True,                #可否安裝
    ‘auto_install‘: False,
 }

###classroom.py

from openerp.osv import fields, osv

class my_training_classroom(osv.osv):
    _name = ‘my.training.classroom‘
    _discription = u‘教室‘
    _columns = {
        ‘number‘: fields.char(u‘編號‘, size=64, select=True),
        ‘capacity‘: fields.integer(u‘容納人數‘, select=True),
        ‘location‘: fields.char(u‘地點‘, size=125, select=True),
    }
my_training_classroom()

###lesson.py

from openerp.osv import fields, osv

class my_training_lesson(osv.osv):
    _name = ‘my.training.lesson‘  #本對象的名稱
    _inherit = ‘my.training.lesson‘  #要繼承的對象的_name
    _columns = {
       ‘classroom_id‘: fields.many2one(‘my.training.classroom‘, u‘教室‘), #添加一個教室屬性,為多對一對象。
    }

my_training_lesson()

###lesson_view.xml

<?xml versi>on="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <!--教室-->
            <record model="ir.ui.view" id="my_training_lesson_from_inherit_classroom_view">
            <field name="name">課程教室繼承視圖</field>
            <field name="type">form</field>
            <field name="model">my.training.lesson</field>
            <field name="inherit_id" ref="my_training.my_training_lesson_from_view"/>
            <field name="arch" type="xml">
                <field name="name" position="after">
                    <field name="classroom_id"/>
                </field>
            </field>
        </record>
    </data>
</openerp>

###classroom_view.xml

<?xml version="1.0" encoding="utf-8"?>
<openerp>
    <data>
        <!--教室-->
            <record model="ir.ui.view" id="my_training_classroom_from_view">
            <field name="name">教室</field>
            <field name="type">form</field>
            <field name="model">my.training.classroom</field>
            <field name="arch" type="xml">
                <form string="教室表單">
                    <field name="number"/>
                    <field name="capacity"/>
                    <field name="location" />
                </form>
            </field>
        </record>
         <!--定義列表視圖-->
        <record model="ir.ui.view" id="my_training_classroom_tree_view">
            <field name="name">教室列表</field>
            <field name="type">tree</field>
            <field name="model">my.training.classroom</field>
            <field name="arch" type="xml">
                <tree string="教室列表">
                    <field name="number"/>
                    <field name="capacity" />
                    <field name="location" />
                </tree>
            </field>
        </record>
<!--定義視圖動作-->
    <record model="ir.actions.act_window"  id="action_my_training_classroom">
        <field name="name">教室</field>
        <field name="res_model">my.training.classroom</field>
        <field name="view_type">form</field>
        <field name="view_mode">form,tree</field>
        <field name="view_id" ref="my_training_classroom_tree_view"/>
    </record>
<!--定義菜單-->
        <menuitem id="my_training_classroom_menu" name="教室" parent="my_training.my_training_menu" action="action_my_training_classroom"/>
    </data>
</openerp>

openERP筆記 自定義模塊開發