openERP筆記,自定義開發模塊
##目標
- OpenERP模塊基本結構
- 使用模塊添加額外的字段(Date Required和Rush Order)
- 擴展視圖, 讓OpenERP能夠顯示新的字段
- 修改用於OpenERP工作流的可用狀態
##創建第一個OpenERP模塊
不修改OE源碼情況下寫自己的模塊擴展OE是OpenERP框架一個很好的特性. 我們所做的所有修改都放在我們自己的目錄, 自己的文件中.
每個OE模塊能夠被OE框架正確認識並安裝, 一旦成功安裝了我們的模塊, OE框架將會用該模塊的功能擴展OE.
##指定一個目錄保存我們的OE模塊
兩種方式:
- 在OE的addons目錄下保存我們的模塊;
- 創建一個獨立的目錄保存我們的模塊, 這種方式的有點是能夠將OE標準模塊與我們的模塊分開.
對於第二種方式, 需要修改OE的配置文件:
[options]
admin_passwd = admin
db_user = jeff
db_password = greater
addons_path = /home/openerp/server/addons,/home/mymodules
這樣, home目錄下的mymodules目錄中保存我們定制的OE模塊.
##模塊目錄內容
在OE的addos目錄下(addons_path中設定)創建一個目錄silkworm保存我們的silkworm模塊. 在silkworm目錄下創建兩個文件:
- __init__.py
- __openerp__.py
__init__.py文件的目的是指定該模塊中想要包含的Python文件(不用管文件的擴展名).
import silkworm
__openerp__.py文件是OE模塊的清單文件, 向OE框架說明該模塊的一些屬性. 這個文件有時也被稱為模塊描述文件, 用Python中的字典(dictionary)描述.
{ ‘name‘: ‘Screen Printing‘, ‘version‘: ‘1.0‘, ‘description‘: """ This module adds functionality for screen printing companies """, ‘author‘: ‘Greg Moss‘, ‘depends‘: [‘base‘,‘sale‘], ‘data‘: [‘silkworm_view.xml‘], ‘demo‘: [], ‘installable‘: True, ‘auto_install‘: False, }
在安裝OpenERP模塊時, __openerp__.py文件給出框架配置該模塊所需的各種信息.
- name: 顯示在OpenERP模塊列表中;
- version: 模塊版本號;
- description: 安裝模塊時顯示;
- author: 作者;
- depends: 前面幾項(name, version等)是用於文檔的說明性的元素, depends告訴框架這個模塊是建構在哪些其他模塊基礎上的. 至少要依賴於base, 本例中因為擴展了sales order系統, 所以也要依賴於sale模塊;
- data: 指定模塊的xml視圖文件. 如果希望改變OE的forms或UI, 創建一個視圖文件. 其他類型的數據文件也可以在這裏指定, 例如包含初始化數據或訪問權限的數據. 本例中只有一個文件silkworm_view.xml文件;
- demo: OE提供了一種方便的方式來包含定制模塊的說明數據, 本例中留空, 但是如果希望在模塊安裝時可以添加一些說明數據, 用這項指定;
- installable: 使用此項可以臨時禁止一個模塊的安裝;
- auto_install: 如果此項為True, OE將會在該模塊的所有依賴項安裝好之後自動安裝這個模塊, 大部分情況下不會指定自動安裝.
##silkworm.py中擴展OpenERP模型
為了向我們的sales order添加Date Required和Rush Order字段, 首先創建silkworm.py文件, 然後添加下面的代碼到silkworm.py文件中:
from openerp.osv import osv, fields
class silkworm_sale_order(osv.Model):
_inherit = ‘sale.order‘
_columns = {
‘x_daterequired‘: fields.date(‘Date Required‘, required=True),
‘x_rush‘: fields.boolean(‘Rush Order‘),
}
###繼承sales order
代碼中, 創建了一個silkworm_sale_order類, 派生自osv.Model, Python的OO繼承.
_inherit_ = ‘sale.order’, 這一句指出這個類繼承了sale.order, OpenERP的繼承.
_columns字典列出了我們向sales order模塊添加的兩個自定義字段.
###將自定義字段添加到sales order視圖中
__openerp__.py文件中的’data’指定了視圖xml文件, silkworm_view.xml.
<?xml version="1.0" encoding="utf-8"?>
<openerp>
<data>
<record id="sale_view_order_form" model="ir.ui.view">
<field name="model">sale.order</field>
<field name="inherit_id" ref="sale.view_order_form"/>
<field name="arch" type="xml">
<field name="client_order_ref" position="after">
<field name="x_daterequired"/>
<field name="x_rush"/>
</field>
</field>
</record>
</data>
</openerp>
OE中的視圖定義使用XML語法. OE視圖文件用openerp標記包裹, 下一級是data標記. 為了在自定義的OE模塊中修改或添加視圖, 添加record標記.
<record id="sale_view_order_form" model="ir.ui.view">
每一個record必須有一個id屬性, 另外這裏我們指定了這個record的model屬性為ir.ui.view.
<field name="model">sale.order</field>
接下來, 應該指定這個record對應的model, 本例中為sale.order, 因為我們為sale.order添加了字段. 如果我們為purchase order添加了字段, 那這裏就應該是purchase.order.
在OE的開發模式下, 鼠標移動到字段上可以查看該字段所屬的模型; 在開發模式下的Manage Views中, 也可以發現想要使用的view的名字. 這些功能可以方便OpenERP的模塊開發.
<field name="inherit_id" ref="sale.view_order_form"/>
類似於我們的模型派生自sale.model, 我們的視圖也應該從sale.view_order_form視圖派生而來, 這樣我們可以增加一些自定義的字段. 開發模式下使用”Manage Views”查看這些信息.
<field name="arch" type="xml">
arch項是所有視圖改變都需要的, 不需要知道為什麽, 用吧.
接下來就到了給新增的自定義字段指定顯示位置了.
<field name="client_order_ref" position="after">
添加字段到form上時, 應該明確地確定這個字段應該放在什麽位置. 例如上面的那行代碼, 告訴OpenERP框架首先找到client_order_ref字段, 然後在它的後面(position=”after”)顯示增加的兩個字段.
client_order_ref字段怎麽找到的? 只需要激活OE的開發者模式(OE的關於對話框中激活), 打開相應的view, 然後將鼠標懸停在字段的label上即可在tooltip上顯示出來.
<field name="x_daterequired"/>
<field name="x_rush"/>
上面這兩句向form中添加我們新增的字段顯示.
##安裝模塊
這個例子很簡單, 僅僅把兩個字段添加到了sales order form中, 這個模塊目錄中有四個文件:
- __init__.py
- __openerp__.py
- silkworm.py
- silkworm_view.xml
###參數設定
OpenERP addons_path設定
首先./openerp-server -s, 在$HOME/下生成.openerp-serverrc文件, 修改其中的addons_path選項, 增加addons目錄. 這裏要註意, 多個路徑之間用逗號分隔並且不能有空格.
###安裝
需要該用戶啟用了技術特性(設置->用戶->編輯->訪問權限->勾選”技術特性”).
首先”設置->更新模塊列表”, 然後輸入過濾關鍵字找到模塊安裝. 安裝後打開一個sale order(銷售訂單), 可以看到在”客戶關聯單號(client_order_ref)”後增加了兩個新的字段
openERP筆記,自定義開發模塊