【Odoo 模塊開發(fā)】(一)Wokflow 教程

工作流概念:“ 工作流闯两,指的是一系列相互銜接、自動(dòng)進(jìn)行的業(yè)務(wù)活動(dòng)或任務(wù)返吻。” -百度百科
我的個(gè)人理解乎婿,工作流就是執(zhí)行一個(gè)任務(wù)的一系列過程(步驟)测僵,每個(gè)步驟可能需要設(shè)計(jì)不同“模塊”,而且步驟之間又有著各種各樣的聯(lián)系谢翎。以企業(yè)的采購為例:采購過程包括 采購申請(qǐng)采購批準(zhǔn)采購訂單審核采購訂單→…… 捍靠;其中采購申請(qǐng)可能是A部門申請(qǐng),批準(zhǔn)可能是B部門批準(zhǔn)……這就是一個(gè)簡單的工作流森逮。

  • 本文將使用Odoo框架榨婆,開發(fā)一個(gè)簡單的workflow模塊,代碼解釋將嵌套在源碼中

文件結(jié)構(gòu)

文件結(jié)構(gòu)

Model創(chuàng)建(models.py)

  • 注意在init.py 文件中導(dǎo)入你的“ models.py ”模塊
  • Odoo 框架中的代碼跟平時(shí)開發(fā)時(shí)代碼規(guī)范有些許出入
  • 關(guān)于@api.one 鏈接
# -*- coding: utf-8 -*-

from openerp import models, fields, api


class workflow_demo(models.Model):
    """
    Author  : SXY
    Date    : 2016/3/24 9:28
    Version : 1.0
    """
    _name = 'workflow_demo.workflow_demo'

    WORKFLOW_STATE_SELECTION = [
        ('init', '初始'),
        ('start', '開始'),
        ('confirm', '確認(rèn)'),
        ('complete', '完成'),
    ]

    name = fields.Char(string="姓名")
    state = fields.Selection(WORKFLOW_STATE_SELECTION, default='init', string="狀態(tài)", readonly=True)

    # 注意使用新版本定義方法是褒侧,需要添加裝飾器@api.one/@api.multi
    # 將state 置于開始狀態(tài)
    @api.one
    def do_start(self):
        print "------------self.state = 'start'"
        self.state = 'start'
        return True

    # 將state 置于確認(rèn)狀態(tài)
    @api.one
    def do_confirm(self):
        print "------------self.state = 'confirm'"
        self.state = 'confirm'
        return True

    # 將state 置于完成狀態(tài)
    @api.one
    def do_complete(self):
        print "------------self.state = 'complete'"
        self.state = 'complete'
        return True

View 創(chuàng)建 (workflow_view.xml)

  • 注意良风,關(guān)于field,官網(wǎng)(鏈接)(參見lists中的field)有如下要求:要求同一個(gè)name只能使用一次闷供。如 <field name="state" /> 中這個(gè)“state”只能使用一次烟央,如果多次使用,那么只顯示最后使用這個(gè)"state"的標(biāo)簽
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
    <data>
        <!-- form 視圖-->
        <record id="workflow_demo_form_view" model="ir.ui.view">
            <field name="name">Workflow</field>
            <field name="type">form</field>
            <field name="model">workflow_demo.workflow_demo</field>
            <field name="arch" type="xml">
                <form string="Workflow單">
                    <!-- workflow 聲明-->
                    <!-- 添加header標(biāo)簽用來顯示workflow中的按鈕-->
                    <header>
                        <!-- 首先指明button的type為workflow類型 -->
                        <!-- name 對(duì)應(yīng)于workflow.transition中的signal-->
                        <!-- states 屬性用來控制button顯示隱藏歪脏,例如states="init"吊档,當(dāng)state屬性為init時(shí),這個(gè)button顯示唾糯,否則不顯示 -->
                        <button name="workflow_start" states="init" string="開始" type="workflow" class="oe_highlight"/>
                        <button name="workflow_confirm" states="start" string="確認(rèn)" type="workflow" class="oe_highlight"/>
                        <button name="workflow_end" states="confirm" string="完成" type="workflow" class="oe_highlight"/>
                        <!-- 右上角 進(jìn)度顯示怠硼。注意在此處已經(jīng)使用的state屬性鬼贱,所以在接下來的tree標(biāo)簽里面就不能再次聲明<field name="state"/>了如果再次聲明此處的進(jìn)度顯示便會(huì)失去作用 -->
                        <field name="state" widget="statusbar" statusbar_visible="start,confirm,complete"/>
                    </header>
                    <sheet>
                        <group col="4">
                            <field name="name"/>
                        </group>
                    </sheet>
                </form>
            </field>
        </record>
        <!-- tree(list)視圖 -->
        <record id="workflow_demo_tree_view" model="ir.ui.view">
            <field name="name">workflow_demo</field>
            <field name="type">tree</field>
            <field name="model">workflow_demo.workflow_demo</field>
            <field name="arch" type="xml">
                <tree string="Workflow">
                    <field name="name"/>
                </tree>
            </field>
        </record>

        <record id="workflow_demo_action" model="ir.actions.act_window">
            <field name="name">Workflow</field>
            <field name="type">ir.actions.act_window</field>
            <field name="res_model">workflow_demo.workflow_demo</field>
            <field name="view_type">form</field>
            <field name="view_mode">tree,form</field>
            <field name="help" type="html">
                <p class="oe_view_nocontent_create">創(chuàng)建Workflow單</p>
            </field>
        </record>

        <!-- 菜單 -->
        <menuitem id="workflow_demo_main_menu" name="Workflow演示"/>
        <menuitem id="workflow_demo_sub_menu" name="Workflow演示" parent="workflow_demo_main_menu"/>
        <menuitem id="workflow_demo_item_menu" name="Workflow" parent="workflow_demo_sub_menu"
                  action="workflow_demo_action" sequence="1"/>
    </data>
</openerp>

Workflow 創(chuàng)建(workflow_demo.xml)

  • workflow 介紹
  • Workflow transitions 中的group 屬性可以進(jìn)行操作權(quán)限控制
<?xml version="1.0" encoding="UTF-8"?>
<openerp>
    <data>
        <!-- Workflow 工作流 -->
        <!-- https://www.odoo.com/documentation/8.0/reference/workflows.html -->
        <!-- 設(shè)置record的model為系統(tǒng)自帶的 “workflow” -->
        <record model="workflow" id="workflow_demo">
            <field name="name">workflow_demo</field>
            <!-- 關(guān)聯(lián)的model -->
            <field name="osv">workflow_demo.workflow_demo</field>
            <!-- 是否主動(dòng)被實(shí)例化 -->
            <field name="on_create">True</field>
        </record>

        <!-- workflow.activity 用來指定要調(diào)用的model里的方法,一般用來更改state狀態(tài)-->
        <record model="workflow.activity" id="activity_one">
            <!-- wkf_id 這個(gè)activity對(duì)應(yīng)于哪個(gè)workflow,這里對(duì)應(yīng)于上面聲明的workflow-->
            <field name="wkf_id" ref="workflow_demo"/>
            <field name="name">workflow.demo.activity.one</field>
            <!-- dummy 類型用來指定這個(gè)activity 是workflow的開始還是結(jié)束-->
            <field name="kind">dummy</field>
            <!-- 開始是flow_start  結(jié)束是flow_end-->
            <field name="flow_start">True</field>
        </record>

        <record model="workflow.activity" id="activity_two">
            <field name="wkf_id" ref="workflow_demo"/>
            <field name="name">workflow.demo.activity.two</field>
            <!-- function 表示要執(zhí)行model中的方法-->
            <field name="kind">function</field>
            <!-- 對(duì)應(yīng)model中的方法-->
            <field name="action">do_start()</field>
        </record>

        <record model="workflow.activity" id="activity_three">
            <field name="wkf_id" ref="workflow_demo"/>
            <field name="name">workflow.demo.activity.three</field>
            <field name="kind">function</field>
            <field name="action">do_confirm()</field>
        </record>

        <record model="workflow.activity" id="activity_four">
            <field name="wkf_id" ref="workflow_demo"/>
            <field name="name">workflow.demo.activity.four</field>
            <field name="kind">function</field>
            <field name="action">do_complete()</field>
        </record>

        <record model="workflow.activity" id="activity_five">
            <field name="wkf_id" ref="workflow_demo"/>
            <field name="name">workflow.temp.activity.five</field>
            <field name="kind">dummy</field>
            <field name="flow_end">True</field>
        </record>

        <!-- 相當(dāng)于一個(gè)轉(zhuǎn)換器香璃,用來接受button傳來的信號(hào)这难,調(diào)用相關(guān)的activity-->
        <record model="workflow.transition" id="transition_one">
            <!-- 表示上一個(gè)執(zhí)行的activity,與上面聲明的activity對(duì)應(yīng)-->
            <field name="act_from" ref="activity_one"/>
            <!-- 表示上一個(gè)將要執(zhí)行的activity-->
            <field name="act_to" ref="activity_two"/>
            <!-- 用來做一個(gè)嚴(yán)重葡秒,當(dāng)滿足條件是才能執(zhí)行姻乓,可省略-->
            <field name="condition">state == 'init'</field>
            <!-- 接收的信號(hào) -->
            <field name="signal">workflow_start</field>
        </record>

        <record model="workflow.transition" id="transition_two">
            <field name="act_from" ref="activity_two"/>
            <field name="act_to" ref="activity_three"/>
            <field name="condition">state == 'start'</field>
            <field name="signal">workflow_confirm</field>
        </record>

        <record model="workflow.transition" id="transition_three">
            <field name="act_from" ref="activity_three"/>
            <field name="act_to" ref="activity_four"/>
            <field name="condition">state == 'confirm'</field>
            <field name="signal">workflow_end</field>
        </record>

    </data>
</openerp>

xml聲明(openerp.py)

部分代碼:

'data': [
        # 聲明workflow的相關(guān)xml
        'views/workflow_view.xml',
        'views/workflow_demo.xml',
    ],

切記添加完workflow之后,一定要在此做一下聲明眯牧,好讓模塊加載過程中能夠?qū)orkflow進(jìn)行實(shí)例化蹋岩。
到此,workflow 已經(jīng)基本實(shí)現(xiàn)

測試

  • 安裝模塊
  • 測試
test_one.png
test_two.png

小結(jié)

workflow 該功能的開發(fā)要注意学少,workflow剪个、workflow_activity、workflow_transition三者的關(guān)系
Odoo 相比較于現(xiàn)在的workflow聲明方式版确,還有另外一種簡單的方式扣囊,這種方式要在下一章節(jié)給大家介紹。
源碼地址 http://git.oschina.net/tobe/OdooDemo (workflow_demo)

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末绒疗,一起剝皮案震驚了整個(gè)濱河市侵歇,隨后出現(xiàn)的幾起案子字柠,更是在濱河造成了極大的恐慌产阱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,539評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件睛挚,死亡現(xiàn)場離奇詭異磨镶,居然都是意外死亡枷遂,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評(píng)論 3 396
  • 文/潘曉璐 我一進(jìn)店門棋嘲,熙熙樓的掌柜王于貴愁眉苦臉地迎上來酒唉,“玉大人,你說我怎么就攤上這事沸移』韭祝” “怎么了?”我有些...
    開封第一講書人閱讀 165,871評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵雹锣,是天一觀的道長网沾。 經(jīng)常有香客問我,道長蕊爵,這世上最難降的妖魔是什么辉哥? 我笑而不...
    開封第一講書人閱讀 58,963評(píng)論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上醋旦,老公的妹妹穿的比我還像新娘恒水。我一直安慰自己,他們只是感情好饲齐,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,984評(píng)論 6 393
  • 文/花漫 我一把揭開白布钉凌。 她就那樣靜靜地躺著,像睡著了一般捂人。 火紅的嫁衣襯著肌膚如雪御雕。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,763評(píng)論 1 307
  • 那天滥搭,我揣著相機(jī)與錄音酸纲,去河邊找鬼。 笑死瑟匆,一個(gè)胖子當(dāng)著我的面吹牛闽坡,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播脓诡,決...
    沈念sama閱讀 40,468評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼媒役!你這毒婦竟也來了祝谚?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤酣衷,失蹤者是張志新(化名)和其女友劉穎交惯,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體穿仪,經(jīng)...
    沈念sama閱讀 45,850評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡席爽,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,002評(píng)論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了啊片。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片只锻。...
    茶點(diǎn)故事閱讀 40,144評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖紫谷,靈堂內(nèi)的尸體忽然破棺而出齐饮,到底是詐尸還是另有隱情,我是刑警寧澤笤昨,帶...
    沈念sama閱讀 35,823評(píng)論 5 346
  • 正文 年R本政府宣布祖驱,位于F島的核電站,受9級(jí)特大地震影響瞒窒,放射性物質(zhì)發(fā)生泄漏捺僻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,483評(píng)論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望匕坯。 院中可真熱鬧束昵,春花似錦、人聲如沸醒颖。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽泞歉。三九已至逼侦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腰耙,已是汗流浹背榛丢。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評(píng)論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留挺庞,地道東北人晰赞。 一個(gè)月前我還...
    沈念sama閱讀 48,415評(píng)論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像选侨,于是被迫代替她去往敵國和親掖鱼。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,092評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容