odoo10 学习笔记4(工作流)

现在用户已经可以在系统添加请假单了。但是还没有审批流程。先来设置一个简单的审批流程,员工填写请假单(草稿状态)->提交请假单给领导(待审批状态)->领导审批(完成状态)。
编辑类文件 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">dummy</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组,而我们知道这是一个默认全部账号都有的基本组。下次我们来解决这个问题。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容