Odoo10.0中能夠經過兩種方式來實現工做流(workflow)html
一種的官網API中給出的方式,連接:https://www.odoo.com/documentation/10.0/reference/workflows.htmlweb
還有一種是經過查看Odoo10.0的源碼,發現自帶模塊中使用的方式;api
先來講下第一種方式:app
首先,建立文件目錄:學習
接下來編寫model及XML文件:測試
model文件:ui
# -*- coding: utf-8 -*- from odoo import models, fields, api class WorkflowDemo(models.Model): _name = 'workflow_demo.leave' _description = u'工做流請假測試' name = fields.Char(u'請假說明') start_date = fields.Datetime(u'開始時間') end_date = fields.Datetime(u'結束時間') state = fields.Selection( [ ('init', u'初始'), ('start', u'開始'), ('confirm', u'確認'), ('complete', u'完成'), ], default='init', string=u'狀態', copy=False, readonly=True, ) @api.one def do_start(self): print '-' * 40 print 'do_start' self.state = 'start' @api.one def do_confirm(self): print '-' * 40 print 'do_confirm' self.state = 'confirm' @api.one def do_complete(self): print '-' * 40 print 'do_complete' self.state = 'complete'
view.xml文件:this
<odoo> <data> <record model="ir.ui.view" id="workflow_demo.list"> <field name="name">workflow_demo list</field> <field name="model">workflow_demo.leave</field> <field name="arch" type="xml"> <tree> <field name="name"/> <field name="start_date"/> <field name="end_date"/> <field name="state"/> </tree> </field> </record> <record model="ir.ui.view" id="workflow_demo.form"> <field name="name">workflow_demo form</field> <field name="model">workflow_demo.leave</field> <field name="arch" type="xml"> <form string="請假單"> <header> <button name="leave_start" states="init" string="開始" groups="workflow_demo.workflow_leave_group_employee" type="workflow" class="oe_highlight"/> <button name="leave_confirm" states="start" string="確認" groups="workflow_demo.workflow_leave_group_manager" type="workflow" class="oe_highlight"/> <button name="leave_complete" states="confirm" string="完成" groups="workflow_demo.workflow_leave_group_leader" type="workflow" class="oe_highlight"/> <field name="state" widget="statusbar" statusbar_visible="start,confirm,complete"/> </header> <group> <field name="name"/> <field name="start_date"/> <field name="end_date"/> </group> </form> </field> </record> <record model="ir.actions.act_window" id="workflow_demo.action_window"> <field name="name">workflow_demo window</field> <field name="res_model">workflow_demo.leave</field> <field name="view_mode">tree,form</field> <field name="help" type="html"> <p class="oe_view_nocontent_create">建立請假單</p> </field> </record> <!-- Top menu item --> <menuitem name="workflow_demo" id="workflow_demo.menu_root"/> <!-- menu categories --> <menuitem name="Menu 1" id="workflow_demo.menu_1" parent="workflow_demo.menu_root"/> <!-- actions --> <menuitem name="List" id="workflow_demo.menu_1_list" parent="workflow_demo.menu_1" action="workflow_demo.action_window"/> </data> </odoo>
leave_security.xml文件:spa
<?xml version="1.0" encoding="utf-8" ?> <odoo> <!-- noupdate 0,升級模塊時更新數據 1,只在安裝時建立數據,開發時可設置爲0,定版後改回1 --> <data noupdate="0"> <record id="model_workflow_leave_category" model="ir.module.category"> <field name="name">請假管理</field> </record> <record id="workflow_leave_group_employee" model="res.groups"> <field name="name">團隊成員</field> <field name="category_id" ref="model_workflow_leave_category"/> <field name="implied_ids" eval="[(4, ref('base.group_user'))]"/> <field name="comment">團隊成員</field> </record> <record id="workflow_leave_group_manager" model="res.groups"> <field name="name">項目經理</field> <field name="category_id" ref="model_workflow_leave_category"/> <field name="implied_ids" eval="[(4, ref('workflow_demo.workflow_leave_group_employee'))]"/> <field name="comment">項目經理</field> </record> <record id="workflow_leave_group_leader" model="res.groups"> <field name="name">領導</field> <field name="category_id" ref="model_workflow_leave_category"/> <field name="implied_ids" eval="[(4, ref('workflow_demo.workflow_leave_group_manager'))]"/> <field name="users" eval="[(4, ref('base.user_root'))]"/> <field name="comment"></field> </record> </data> </odoo>
ir.model.access.csv文件:code
id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_workflow_demo_workflow_demo,workflow_demo.leave,model_workflow_demo_leave,workflow_leave_group_leader,1,1,1,0
access_workflow_demo_workflow_demo,workflow_demo.leave,model_workflow_demo_leave,workflow_leave_group_manager,1,1,1,1
access_workflow_demo_workflow_demo,workflow_demo.leave,model_workflow_demo_leave,workflow_leave_group_employee,1,1,1,1
leave_workflow.xml文件:
<odoo> <data> <!-- 設置record爲系統自帶的workflow --> <record model="workflow" id="workflow_leave"> <field name="name">workflow_demo</field> <!-- 關聯model --> <field name="osv">workflow_demo.leave</field> <!-- 是否主動被實例化 --> <field name="on_create">True</field> </record> <!-- workflow.activity 用來指定要調用的model裏的方法, 通常用來更改state的狀態 --> <!--<record model="workflow.activity" id="activity_start">--> <!--<!– wkf_id 指定上面生命的workflow –>--> <!--<field name="wkf_id" ref="workflow_leave" />--> <!--<field name="name">workflow_demo.leave start</field>--> <!--<!– dummy 類型用來指定這個activity是workflow的開始仍是結束 –>--> <!--<field name="kind">dummy</field>--> <!--<!– flow_start:開始, flow_end:結束 –>--> <!--<field name="flow_start">True</field>--> <!--</record>--> <record model="workflow.activity" id="activity_do_start"> <field name="wkf_id" ref="workflow_leave" /> <field name="name">workflow_demo.leave do start</field> <field name="flow_start">True</field> <!-- function 表示要執行model中的方法 --> <field name="kind">function</field> <!-- 對應model中的方法 --> <field name="action">do_start()</field> </record> <record model="workflow.activity" id="activity_do_confirm"> <field name="wkf_id" ref="workflow_leave" /> <field name="name">workflow_demo.leave do confirm</field> <!-- function 表示要執行model中的方法 --> <field name="kind">function</field> <!-- 對應model中的方法 --> <field name="action">do_confirm()</field> </record> <record model="workflow.activity" id="activity_do_complete"> <field name="wkf_id" ref="workflow_leave" /> <field name="name">workflow_demo.leave do complete</field> <field name="flow_end">True</field> <!-- function 表示要執行model中的方法 --> <field name="kind">function</field> <!-- 對應model中的方法 --> <field name="action">do_complete()</field> </record> <!--<record model="workflow.activity" id="activity_end">--> <!--<field name="wkf_id" ref="workflow_leave" />--> <!--<field name="name">workflow_demo.leave end</field>--> <!--<field name="kind">dummy</field>--> <!--<field name="flow_end">True</field>--> <!--</record>--> <!-- Transitions control how the workflow progresses from activity to activity. --> <!-- Transitions 來控制activity的走向 --> <record model="workflow.transition" id="transition_one"> <field name="act_from" ref="activity_start" /> <field name="act_to" ref="activity_do_start" /> <field name="condition">state == 'init'</field> <field name="signal">leave_start</field> </record> <record model="workflow.transition" id="transition_two"> <field name="act_from" ref="activity_do_start" /> <field name="act_to" ref="activity_do_confirm" /> <field name="condition">state == 'start'</field> <field name="signal">leave_confirm</field> </record> <record model="workflow.transition" id="transition_three"> <field name="act_from" ref="activity_do_confirm" /> <field name="act_to" ref="activity_do_complete" /> <field name="condition">state == 'confirm'</field> <field name="signal">leave_complete</field> </record> </data> </odoo>
__mainfest__.py文件:
# -*- coding: utf-8 -*- { 'name': "工做流Demo", 'summary': """ 工做流測試 """, 'description': """ Long description of module's purpose """, 'author': "ed", 'website': "http://www.yourcompany.com", 'category': 'Uncategorized', 'version': '0.1', 'application': True, # any module necessary for this one to work correctly 'depends': ['base'], 'sequence': 10, # always loaded 'data': [ 'security/leave_security.xml', 'security/ir.model.access.csv', 'views/leave_workflow.xml', 'views/views.xml', ], # only loaded in demonstration mode 'demo': [ ], }
使用這種方式定義workflow,FromView中有兩處須要注意:
1.button中的name屬性對應workflow.transition中的signal;
2.button的type屬性必須設置爲workflow,不然會報錯;
接下來第二種方式定義workflow,這種方式相比較第一種方式,要簡單一些
原理是直接在button中調用model中定義的方法來修改state的狀態,可是此處button的type屬性須要定義爲object
具體以下:
__mainfest__.py文件中註釋掉該行
# 'views/leave_workflow.xml',
view.xml中須要將header中的button坐下調整:
<header> <button name="do_start" states="init" string="開始" groups="workflow_demo.workflow_leave_group_employee" type="object" class="oe_highlight"/> <button name="do_confirm" states="start" string="確認" groups="workflow_demo.workflow_leave_group_manager" type="object" class="oe_highlight"/> <button name="do_complete" states="confirm" string="完成" groups="workflow_demo.workflow_leave_group_leader" type="object" class="oe_highlight"/> <field name="state" widget="statusbar" statusbar_visible="start,confirm,complete"/> </header>
其中name屬性爲model中的方法,type屬性修改成object,其餘不用修改。
以上兩種方式我本身都本地驗證過,是沒有問題的,有疑問的夥伴能夠留言
你們共同窗習,共同進步