Odoo10.0中的工做流

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">-->
            <!--&lt;!&ndash; wkf_id 指定上面生命的workflow &ndash;&gt;-->
            <!--<field name="wkf_id" ref="workflow_leave" />-->
            <!--<field name="name">workflow_demo.leave start</field>-->
            <!--&lt;!&ndash; dummy 類型用來指定這個activity是workflow的開始仍是結束 &ndash;&gt;-->
            <!--<field name="kind">dummy</field>-->
            <!--&lt;!&ndash; flow_start:開始, flow_end:結束 &ndash;&gt;-->
            <!--<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,其餘不用修改。

 

以上兩種方式我本身都本地驗證過,是沒有問題的,有疑問的夥伴能夠留言

 

你們共同窗習,共同進步

相關文章
相關標籤/搜索