現在用戶已經可以在系統添加請假單了。但是還沒有審批流程。先來設置一個簡單的審批流程,員工填寫請假單(草稿狀態)->提交請假單給領導(待審批狀態)->領導審批(完成狀態)。
編輯類文件?`models/models.py`
~~~
# -*- coding: utf-8 -*-
from odoo import models, fields, api
class qingjiadan(models.Model):
WORKFLOW_STATE_SELECTION = [
('draft', '草稿'),
('confirm', '待審批'),
('complete', '已完成')
]
_name = 'qingjia.qingjiadan'
name = fields.Char(string="申請人")
days = fields.Integer(string="天數")
startdate = fields.Date(string="開始日期")
reason = fields.Text(string="請假事由")
state = fields.Selection(WORKFLOW_STATE_SELECTION,
default='draft',
string='狀態',
readonly=True)
@api.multi
def do_confirm(self):
self.state = 'confirm'
return True
@api.multi
def do_complete(self):
self.state = 'complete'
return True
~~~
添加了一個字段`state`,請假單狀態,字段類型為`fields.Selection`,包含三個狀態draft(草稿),confirm(待審批),complete(已完成),默認值為draft(草稿),`readonly=True`屬性表示在form視圖下是不能修改的。
添加了兩個方法`do_confirm()`,`do_complete()`,用于改變請假單狀態。`@api.multi`修飾符還不明白用途。按鈕事件方法必須有返回值,這里沒有什么需要返回的值就返回`return True`
然后編輯視圖資源文件?`views/views.xml`中的form視圖部分
~~~
<!-- form視圖 -->
<record id="view_form_qingjia_qingjiadan" model="ir.ui.view">
<field name="name">請假單</field>
<field name="model">qingjia.qingjiadan</field>
<field name="arch" type="xml">
<form>
<header>
<button name="button_confirm" states="draft"
string="提交" type="workflow" class="oe_highlight"/>
<button name="button_complete" states="confirm"
string="批準" type="workflow" class="oe_highlight"
groups="base.group_user"/>
<!-- 右上角 進度顯示。-->
<field name="state" widget="statusbar"/>
</header>
<sheet>
<group name="group_top" string="請假單">
<field name="name"/>
<field name="days"/>
<field name="startdate"/>
<field name="reason"/>
</group>
</sheet>
</form>
</field>
</record>
~~~
添加了`<header>...</header>`節,名稱可知這是表單布局的頭部。其中添加了三個元素,兩個按鈕,一個狀態條。
按鈕的屬性:
name:
指定按鈕點擊后的事件名,對應工作流的activity,后面會看到
states:
表示按鈕在什么狀態下顯示,對應state字段的值
type:
工作流的按鈕固定值`workflow`
class:
按鈕的class樣式,`oe_highlight`樣式為高亮顯示
groups:
這里就是上一節提到的第三級權限,字段級權限
狀態條屬性:
name:
狀態條綁定字段名
widget:
類型,狀態條固定值`statusbar`
* * *
在tree視圖中加入`state`字段顯示
~~~
<!-- tree視圖 -->
<record id="view_tree_qingjia_qingjiadan" model="ir.ui.view">
<field name="name">請假單列表</field>
<field name="model">qingjia.qingjiadan</field>
<field name="arch" type="xml">
<tree>
<field name="name"/>
<field name="days"/>
<field name="startdate"/>
<field name="state"/>
</tree>
</field>
</record>
~~~
新建工作流資源文件`views/workflow.xml`
添加工作流:
~~~
<!-- 工作流 -->
<record id="workflow_qingjia_qingjiadan" model="workflow">
<field name="name">請假單工作流</field>
<field name="osv">qingjia.qingjiadan</field>
<field name="on_create">True</field>
</record>
~~~
這個文件中定義了一個工作流,id為`workflow_qingjia_qingjiadan`。三個工作流活動,id分別為`activity_draft`,`activity_confirm`,`activity_complete`,兩個工作流流轉,id分別為`transition_draft2confirm`,`transition_confirm2complete`。工作流屬性:
model:
工作流模型,固定為`workflow`
name:
工作流名稱,任意填寫
osv:
工作流綁定的對象模型
on_create:
創建一個綁定的對象模型的對象時,是否自動生成一個工作流對象。說起來有點繞口,其實就是創建一個請假單時,自動創建一個請假單工作流對象。
* * *
添加工作流活動:
~~~
<!-- 工作流活動 -->
<record id="activity_draft" model="workflow.activity">
<field name="name">草稿</field>
<field name="wkf_id">workflow_qingjia_qingjiadan</field>
<field name="kind">dummy</field>
<field name="flow_start">True</field>
</record>
<record id="activity_confirm" model="workflow.activity">
<field name="name">待審核</field>
<field name="wkf_id">workflow_qingjia_qingjiadan</field>
<field name="kind">function</field>
<field name="action">do_confirm()</field>
</record>
<record id="activity_complete" model="workflow.activity">
<field name="name">已完成</field>
<field name="wkf_id">workflow_qingjia_qingjiadan</field>
<field name="kind">function</field>
<field name="action">do_complete()</field>
</record>
~~~
model:
工作流活動模型,固定為`workflow.activity`
name:
工作流活動名稱,任意填寫
wkf_id:
工作流活動所屬的工作流id
kind:
工作流活動類型,有三個可選項,`'dummy'`不執行任何動作,`'function'`執行action中定義的python代碼,并且執行action_id中定義的server action,`'subflow'`觸發subflow_id中指定的工作流。
flow_start:
表示流程的開始節點
* * *
添加工作流流轉:
~~~
<!-- 工作流流轉 -->
<record id="transition_draft2confirm" model="workflow.transition">
<field name="act_from">activity_draft</field>
<field name="act_to">activity_confirm</field>
<field name="signal">button_confirm</field>
</record>
<record id="transition_confirm2complete" model="workflow.transition">
<field name="act_from">activity_confirm</field>
<field name="act_to">activity_complete</field>
<field name="signal">button_complete</field>
</record>
~~~
model:
工作流流轉模型,固定為`workflow.transition`
act_from:
流轉起始的工作流活動id
act_to:
流轉結束的工作流活動id
signal:
觸發流轉的信號,還記得前面在form視圖中添加的工作流按鈕
~~~
<button name="button_confirm" states="draft"
string="提交" type="workflow" class="oe_highlight"/>
<button name="button_complete" states="confirm"
string="批準" type="workflow" class="oe_highlight"
groups="base.group_user"/>
~~~
按鈕name值就是發出的信號,觸發對應的流轉。
* * *
最后工作流資源文件`views/workflow.xml`是這樣的:
~~~
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
<data>
<!-- 工作流 -->
<record id="workflow_qingjia_qingjiadan" model="workflow">
<field name="name">請假單工作流</field>
<field name="osv">qingjia.qingjiadan</field>
<field name="on_create">True</field>
</record>
<!-- 工作流活動 -->
<record id="activity_draft" model="workflow.activity">
<field name="name">草稿</field>
<field name="wkf_id" ref="workflow_qingjia_qingjiadan"/>
<field name="kind">function</field>
<field name="flow_start">True</field>
</record>
<record id="activity_confirm" model="workflow.activity">
<field name="name">待審核</field>
<field name="wkf_id" ref="workflow_qingjia_qingjiadan"/>
<field name="kind">function</field>
<field name="action">do_confirm()</field>
</record>
<record id="activity_complete" model="workflow.activity">
<field name="name">已完成</field>
<field name="wkf_id" ref="workflow_qingjia_qingjiadan"/>
<field name="kind">function</field>
<field name="action">do_complete()</field>
</record>
<!-- 工作流流轉 -->
<record id="transition_draft2confirm" model="workflow.transition">
<field name="act_from">activity_draft</field>
<field name="act_to">activity_confirm</field>
<field name="signal">button_confirm</field>
</record>
<record id="transition_confirm2complete" model="workflow.transition">
<field name="act_from">activity_confirm</field>
<field name="act_to">activity_complete</field>
<field name="signal">button_complete</field>
</record>
</data>
</openerp>
~~~
編輯配置文件`__manifest__.py`,添加對工作流資源文件`views/workflow.xml`載入:
~~~
# always loaded
'data': [
'security/ir.model.access.csv',
'views/workflow.xml',
'views/views.xml',
'views/templates.xml',
],
~~~
好了,代碼編輯完了,可以測試下效果。因為修改了python代碼文件,所以需要重啟服務,然后升級請假模塊。也可以把之前的模塊卸載后再次安裝,不過卸載模塊會將之前的數據也清空,這里因為在表中新建了字段,所以我是直接卸載后重新安裝的。
用user1用戶登錄系統,創建一個請假單,并保存。

帶工作流的請假單
我們看到在頭部出現的`提交`按鈕,狀態條,并顯示默認的`草稿`狀態。
提交后,出現了`審批`按鈕,顯示`待審批`狀態。
批準后,無按鈕,顯示`已完成`狀態。
工作流都按預期執行了,但是這里有點問題,就是自己有權限審批自己的請假單,這是因為權限配置的問題,我們把`審批`按鈕的權限給到了`base.group_user`組,而我們知道這是一個默認全部賬號都有的基本組。下次我們來解決這個問題。