Odoo工作流介紹及代碼示例


本文主要介紹了Odoo工作流的開發方法並提供代碼示例

新版本的odoo開始減少workflow的使用,推薦使用workflow-ish的方式來處理工作流過程。從odoo11起已經完全移除了工作流引擎的相關代碼。
在odoo中,workflow是關聯到某個model的對象,用來動態的管理記錄的生命周期.

創建模擬的workflow-ish

創建一個模擬的workflow-ish(http://language.chinadaily.com.cn/2007-03/16/content_829692.htm)
給課時加入狀態字段state, 有三種狀態 草稿Draft (默認), 確認Confirmed 以及完成Done。
在課時session的form里加入state狀態(只讀)顯示和改變狀態的按鈕

狀態的改變流程如下
Draft -> Confirmed
Confirmed -> Draft
Confirmed -> Done
Done -> Draft

添加代碼的步驟
1 添加state字段
2 添加state狀態轉移方法,並綁定方法到form view上的按鈕
3 添加相關按鈕到form view

odoogoedu/models.py

state = fields.Selection([('draft', "Draft"),('confirmed', "Confirmed"),('done', "Done")], default='draft')

@api.multi
def action_draft(self):
self.state = 'draft'
@api.multi
def action_confirm(self):
self.state = 'confirmed'
@api.multi
def action_done(self):
self.state = 'done'
odoogoedu/views/openacademy.xml

<odoo>
<data>
<record model="workflow" id="wkf_session">
<field name="name">OpenAcademy sessions workflow</field>
<field name="osv">openacademy.session</field>
<field name="on_create">True</field>
</record>

<record model="workflow.activity" id="draft">
<field name="name">Draft</field>
<field name="wkf_id" ref="wkf_session"/>
<field name="flow_start" eval="True"/>
<field name="kind">function</field>
<field name="action">action_draft()</field>
</record>
<record model="workflow.activity" id="confirmed">
<field name="name">Confirmed</field>
<field name="wkf_id" ref="wkf_session"/>
<field name="kind">function</field>
<field name="action">action_confirm()</field>
</record>
<record model="workflow.activity" id="done">
<field name="name">Done</field>
<field name="wkf_id" ref="wkf_session"/>
<field name="kind">function</field>
<field name="action">action_done()</field>
</record>

<record model="workflow.transition" id="session_draft_to_confirmed">
<field name="act_from" ref="draft"/>
<field name="act_to" ref="confirmed"/>
<field name="signal">confirm</field>
</record>
<record model="workflow.transition" id="session_confirmed_to_draft">
<field name="act_from" ref="confirmed"/>
<field name="act_to" ref="draft"/>
<field name="signal">draft</field>
</record>
<record model="workflow.transition" id="session_done_to_draft">
<field name="act_from" ref="done"/>
<field name="act_to" ref="draft"/>
<field name="signal">draft</field>
</record>
<record model="workflow.transition" id="session_confirmed_to_done">
<field name="act_from" ref="confirmed"/>
<field name="act_to" ref="done"/>
<field name="signal">done</field>
</record>
</data>
</odoo>

使用odoo workflow管理狀態(廢棄)

以上沒有使用odoo workflow對象。odoo中的workflow使用xml定義,在workflows中有activities (nodes or actions) ,transitions (conditions) 和workitems。

Activities定義了一些由odoo服務器所要完成的任務,如改變記錄狀態,發送郵件
Transitions定義了如何從一個Activity到另外Activity

注意
workflow是在關聯的model對象創建時一起創建並運行的。

替換session workflow

替換剛才臨時的(ad-hoc)session workflow到一個真正的workflow對象. 並且改變button的綁定方法到workflow的transition方法
去除state的default值,交由workflow管理。

openacademy/__openerp__.py

'templates.xml',
'views/openacademy.xml',
'views/partner.xml',
'views/session_workflow.xml',
],
# only loaded in demonstration mode
'demo': [

openacademy/models.py

('draft', "Draft"),
('confirmed', "Confirmed"),
('done', "Done"),
])

@api.multi
def action_draft(self):
openacademy/views/openacademy.xml

<odoo>
<data>
<record model="workflow" id="wkf_session">
<field name="name">OpenAcademy sessions workflow</field>
<field name="osv">openacademy.session</field>
<field name="on_create">True</field>
</record>

<record model="workflow.activity" id="draft">
<field name="name">Draft</field>
<field name="wkf_id" ref="wkf_session"/>
<field name="flow_start" eval="True"/>
<field name="kind">function</field>
<field name="action">action_draft()</field>
</record>
<record model="workflow.activity" id="confirmed">
<field name="name">Confirmed</field>
<field name="wkf_id" ref="wkf_session"/>
<field name="kind">function</field>
<field name="action">action_confirm()</field>
</record>
<record model="workflow.activity" id="done">
<field name="name">Done</field>
<field name="wkf_id" ref="wkf_session"/>
<field name="kind">function</field>
<field name="action">action_done()</field>
</record>

<record model="workflow.transition" id="session_draft_to_confirmed">
<field name="act_from" ref="draft"/>
<field name="act_to" ref="confirmed"/>
<field name="signal">confirm</field>
</record>
<record model="workflow.transition" id="session_confirmed_to_draft">
<field name="act_from" ref="confirmed"/>
<field name="act_to" ref="draft"/>
<field name="signal">draft</field>
</record>
<record model="workflow.transition" id="session_done_to_draft">
<field name="act_from" ref="done"/>
<field name="act_to" ref="draft"/>
<field name="signal">draft</field>
</record>
<record model="workflow.transition" id="session_confirmed_to_done">
<field name="act_from" ref="confirmed"/>
<field name="act_to" ref="done"/>
<field name="signal">done</field>
</record>
</data>
</odoo>

創建的workflow可以在Settings ‣ Technical ‣ Workflows ‣ Instances里查看

button name="transition signal 名稱"

自動執行transition

根據條件自動執行transition,當課時的上課人數大於50%的時候 自動從草稿到確認狀態。

openacademy/views/session_workflow.xml

done

taken_seats > 50

服務器動作

服務器動作 server action
可以在xml里定義的python方法 用來替換model的方法
openacademy/views/session_workflow.xml

參考文章


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM