1. 程式人生 > >Odoo8中“更多”下拉選單選項指定後臺執行程式碼

Odoo8中“更多”下拉選單選項指定後臺執行程式碼

在Odoo8中的倉庫模組,根據每日最小安全庫存數量,系統會自動生成一些補貨單,而且是一個產品會生成一筆,如果產品比較多,這裡生成的補貨單也會很多。

如果這裡的補貨單沒有即時處理,那相同產品後續不會再生成新的補貨單。

所以採購人員要求不處理的補貨單可以手動來取消,這樣方便第二天能產生出新的補貨單。

現在取消補貨單的功能是放在form檢視中,需要逐張單據點開,再去點取消按鈕,不方便操作。採購人員希望是可以全選一次取消所選單據,根據之前的經驗,我們可以在tree檢視的“更多”按鈕下加一個選單專案,但這個取消比較單純,我不想使用嚮導來彈出一個新視窗,這完全是一個多餘的操作。經查詢odoo的原始碼,在其它模組也有類似的需求,並且odoo也提供了一些動作型別來處理此類需求,主要xml配置如下:

<record id="action_procurement_order_cancel" model="ir.actions.server">
	<field name="name">取消補貨單</field>
	<field name="model_id" ref="procurement.model_procurement_order"/>
	<field name="state">code</field>
	<field name="code">
		if context.get('active_model') == 'procurement.order' and context.get('active_ids'):
			self.cancel(cr, uid, context['active_ids'], context=context)
	</field>
</record>

<record id="ir_procurement_order_cancel" model="ir.values">
	<field eval="'client_action_multi'" name="key2"/>
	<field eval="'procurement.order'" name="model"/>
	<field name="name">取消補貨單</field>
	<field eval="'ir.actions.server,%d'%action_procurement_order_cancel" name="value"/>
</record>

這裡使用到了ir.actions.server伺服器動作,就是說點選選單專案時,不彈出嚮導視窗,只是執行一個伺服器動作,並且這裡配置需要在伺服器上執行的程式碼,就是呼叫self.cancel方法,所選擇的資料id列表會通過上下文引數context中的active_ids帶入。