建立一個Odoo Module (六)- Workflows

Workflows

Workflows 是通過model 來描述業務邏輯之間的變化過程,Workflows are also used to track processes that evolve over time.


練習 6-1
給session 添加一個 state field ,用來幫助弄 workflow
一個 session 有3個狀態,分別是 Draft(默認),Confirmed, Done
在session form中,添加一個 read-only field 用來顯示 state,添加一個button 用來調整 state。

  • Draft -> Confirmed
  • Confirmed -> Draft
  • Confirmed -> Done
  • Done -> Draft

openacademy/models.py

    attendees_count = fields.Integer(
        string="Attendees count", compute='_get_attendees_count', store=True)
    # 新增
    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'
    # 結束
    @api.depends('seats', 'attendee_ids')
    def _taken_seats(self):
        for r in self:

openacademy/views/openacademy.xml

            <field name="model">openacademy.session</field>
            <field name="arch" type="xml">
                <form string="Session Form">
                    <!-- 新增 -->
                    <header>
                        <button name="action_draft" type="object"
                                string="Reset to draft"
                                states="confirmed,done"/>
                        <button name="action_confirm" type="object"
                                string="Confirm" states="draft"
                                class="oe_highlight"/>
                        <button name="action_done" type="object"
                                string="Mark as done" states="confirmed"
                                class="oe_highlight"/>
                        <field name="state" widget="statusbar"/>
                    </header>
                    <!-- 結束 -->

                    <sheet>
                        <group>
                            <group string="General">

workflows 可以與任何 Odoo object 相關聯起來,而且完全的可定製化。Workflows 是用來的管理將商業閉環,還可以通過可視化的方式,修改業務之間的轉化關係和各種觸發條件的鉤子。Workflows, activities (nodes or actions) and transitions (conditions) are declared as XML records, as usual. The tokens that navigate in workflows are called workitems.

注意:
workflow 與 session 關聯之後,只有新建的 session 纔有 workflow instance,之前的 session 都不會有 workflow instance


練習 6-2
替換上面的 僞 workflow, 用真正的 workflow 來重寫,所以 button 點擊後,調用的就不是 object的method,而是 workflow的 trigger。
openacademy/__openerp__.py

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

openacademy/models.py

        ('draft', "Draft"),
        ('confirmed', "Confirmed"),
        ('done', "Done"),
    ])  # 去掉了 default

    @api.multi
    def action_draft(self):

openacademy/views/openacademy.xml

            <field name="arch" type="xml">
                <form string="Session Form">
                    <header>
                        <!-- 3個 button 的 type 由 object 變爲 workflow -->
                        <button name="draft" type="workflow" 
                                string="Reset to draft"
                                states="confirmed,done"/>
                        <button name="confirm" type="workflow" 
                                string="Confirm" states="draft"
                                class="oe_highlight"/>
                        <button name="done" type="workflow" 
                                string="Mark as done" states="confirmed"
                                class="oe_highlight"/>
                        <field name="state" widget="statusbar"/>

openacademy/views/session_workflow.xml

<openerp>
    <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>
</openerp>

爲了檢測,是否建立了 workflow ,可以到 Settings ‣ Technical ‣ Workflows ‣ Instances 查看


練習 6-3
添加一個根據條件自動觸發的 workflow

openacademy/views/session_workflow.xml

            <field name="act_to" ref="done"/>
            <field name="signal">done</field>
        </record>
        <!-- 添加 -->
        <record model="workflow.transition" id="session_auto_confirm_half_filled">
            <field name="act_from" ref="draft"/>
            <field name="act_to" ref="confirmed"/>
            <field name="condition">taken_seats &gt; 50</field>
        </record>
    </data>
</openerp>

練習 6-4
用 server action 代替 python methods
workflow 和 server action 都可以從用戶界面,手動建立。

openacademy/views/session_workflow.xml

            <field name="on_create">True</field>
        </record>
        <!-- 新增 -->
        <record model="ir.actions.server" id="set_session_to_draft">
            <field name="name">Set session to Draft</field>
            <field name="model_id" ref="model_openacademy_session"/>
            <field name="code">
model.search([('id', 'in', context['active_ids'])]).action_draft()
            </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">dummy</field>
            <field name="action"></field>
            <field name="action_id" ref="set_session_to_draft"/>
            <!-- 結束 -->
        </record>
        <!-- 新增 -->
        <record model="ir.actions.server" id="set_session_to_confirmed">
            <field name="name">Set session to Confirmed</field>
            <field name="model_id" ref="model_openacademy_session"/>
            <field name="code">
model.search([('id', 'in', context['active_ids'])]).action_confirm()
            </field>
        </record>
        <!-- 結束 -->
        <record model="workflow.activity" id="confirmed">
            <field name="name">Confirmed</field>
            <field name="wkf_id" ref="wkf_session"/>
            <!-- 修改 -->
            <field name="kind">dummy</field>
            <field name="action"></field>
            <field name="action_id" ref="set_session_to_confirmed"/>
            <!-- 結束 -->
        </record>
        <!-- 新增 -->
        <record model="ir.actions.server" id="set_session_to_done">
            <field name="name">Set session to Done</field>
            <field name="model_id" ref="model_openacademy_session"/>
            <field name="code">
model.search([('id', 'in', context['active_ids'])]).action_done()
            </field>
        </record>
         <!-- 結束 -->
        <record model="workflow.activity" id="done">
            <field name="name">Done</field>
            <field name="wkf_id" ref="wkf_session"/>
            <!-- 修改 -->
            <field name="kind">dummy</field>
            <field name="action"></field>
            <field name="action_id" ref="set_session_to_done"/>
            <!-- 結束 -->
        </record>

        <record model="workflow.transition" id="session_draft_to_confirmed">
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章