一:工作流

工作流是与业务流程相关联的模型,可用于跟踪工序的动态演变过程。

工作流、活动(节点或操作)、转换通常在xml里以record定义。在工作流中处理的单个流程称为工作项。

与模型关联的工作流是在创建模型记录时生成的,工作流定义之前创建的模型记录是没有相应的工作流的。

工作流的一般开发流程:

1:新建workflow.xml视图文件,并在manifest中注册。

2:模型内定义工作流状态以及节点点击事件:用下拉列表保存节点状态,点击相应节点就转换为相应状态

wkf = fields.Selection([
('节点值', "节点显示内容"),
('节点值', "显示内容"),
('节点值', "显示内容"),
], default='默认节点值')
#函数:改变工作流节点为XX节点值
@api.multi
def action_节点值(self):
self.wkf = '节点值'
.....

3:在工作流所在模型的form表单头定义工作流按钮以及工作流状态条,显示工作流:

odoo中位置:

#views.xml
<form string="模型的form表单">
<header>
<button name="btn_confirm(工作流转换信号名)" type="workflow" states="draft(上图中右侧状态条显示的状态)" string="发送(上图左侧显示按钮显示文字)" class="oe_highlight"/>

<button name="btn_accept(工作流转换信号)" type="workflow" states="confirmed(状态条中位置)" string="批准" class="oe_highlight"/>
<button name="btn_reject" type="workflow" states="confirmed(状态条中位置)" string="拒绝" class="oe_highlight"/>
<!--可以看到,上面两个按钮对应的状态条状态都是confirmed,所以如同上图所示,处于confirmed状态时,左上角有两个按钮显示。点击他们进行下一步的状态转换。-->

<field name="state(数据模型中的状态下拉列表字段)" widget="statusbar" statusbar_visible="draft,confirmed,accepted,rejected(状态列表中可以在状态条显示的部分)"/>
</header>
......
</form>

4:在1中新建的workflow.xml文件中,定义工作流,定义3中form表单头的工作流按钮点击事件,定义工作流转换。

分为:定义工作流——定义按钮点击事件(根据前面form表单中button名作为信号,调用模型中的点击函数)——定义节点间的转换(起点/终点,分别引用前面定义的节点点击事件id)

<odoo>
<data>
<odoo>
<data>
<!--定义工作流-->
<record model="workflow" id="wkf_工作流id">
<field name="name">wfk.</field>
<field name="osv">数据模型</field>
<field name="on_create">True</field>
</record>
<!--定义按钮的点击事件-->
<!--工作流起点-->
<record model="workflow.activity" id="act_">
<field name="name"></field>
<field name="wkf_id" ref="wkf_工作流id"/>
<field name="flow_start" eval="True"/>
<field name="kind">function</field>
<field name="action">数据模型中起点状态的点击函数()</field>
</record>
<!--定义中间点-->
<record model="workflow.activity" id="act_">
<field name="name"> <field>
<field name="wkf_id" ref="wkf_工作流id"/>
<field name="kind">function</field>
<field name="action">节点函数()</field>
</record>
<!--工作流终点-->
<record model="workflow.activity" id="act_">
<field name="name"></field>
<field name="wkf_id" ref="wkf_"/>
<field name="kind">function</field>
<field name="flow_stop" eval="True"/>
<field name="action">节点点击函数()</field>
</record> <!--定义工作流转换动作-->
<record model="workflow.transition" id="模块名_节点1_to_节点2">
<field name="act_from" ref="act_上面节点1id"/>
<field name="act_to" ref="act_节点2 id"/>
<field name="signal">btn_节点2(在另一个视图的form表单定义的工作流按钮id)</field>
<field name="condition">一个条件或一个boolean字段</field>
</record> </data>
</odoo>
</data>
</odoo>

5:也可以定义工作流根据某些值而自动转换:

<record model="workflow.transition" id="session_auto_">
<field name="act_from" ref=""/>
<field name="act_to" ref=""/>
<field name="condition">条件表达式</field>
</record>

6:也可以使用服务器动作来定义节点转换函数,把   起点——>终点   简化为   ?——>终点  的转换:

<!--1:定义一个服务器动作-->
<record model="ir.actions.server" id="set_session_to_">
<field name="name"></field>
<field name="model_id" ref=""/>
<field name="code">
model.search([domain表达式,过滤出需要变化工作流的记录])]).action_节点值()//节点按钮点击事件
</field>
</record>
<!--2:定义一个工作流节点,并指定其点击动作为上面的服务器动作-->
<record model="workflow.activity" id="节点值">
<field name="name"></field>
<field name="wkf_id" ref="工作流"/>
<field name="flow_start" eval="True"/>
<field name="kind">dummy</field>
<field name="action_id" ref="set_session_to_节点值(引用上面的定义好的响应)"/>
</record>

二:安全机制

Odoo对数据的访问权限管理有两种机制:模型访问权限管理(access rule)、记录规则管理(record rule)。记录规则管理是对模型访问权限管理的细化。

模型权限访问管理:模型级的权限控制,该模型的所有记录,对于群组内用户(如无定义,则对所有用户)的读写改删权限控制。

access rule是通过security文件夹下的ir.model.access.csv文件来控制的:

这个文件第一行指明了需要控制的内容:

id,name,model_id,group_id,perm_read,perm_write,perm_create,perm_unlink

然后,在下面各行,对数据模型进行访问权限控制即可,主要有:

id:一般格式为 access_模型名

name:模型名,把 . 换成 _

model_id:模型id,模型名前加 model_ 即可。如: model_todo_task

group_id:群组id,访问这个模型的用户属于那个群组。如果不确定,可以不写

perm_read,write,create,unlink:用户对这个数据模型的读/写/新建/删除 操作权限。

一个例子:

id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink
access_todo_task,todo.task,model_todo_task,,1,1,1,1

记录控制:记录级别的权限控制,可以为某模型的记录定义权限条件,对于某群组中(如无指定,则所有用户)符合过滤条件的用户,赋予模型记录的读写改删权限。

基于记录的权限可以控制指定模型的实例对象(数据纪录)的访问权限:

<data noupdate="1">//设置为1,则更新模块不会更新该文件。
<record id="记录控制id" model="ir.rule">
<field name="name"> </field>
<field name="model_id" ref="模型"/>
<field name="groups" eval="[(值, ref(''))]"/>
<field name="perm_read" eval="0/1"/>
<field name="perm_write" eval="0/1"/>
<field name="perm_create" eval="0/1"/>
<field name="perm_unlink" eval="0/1" />
<field name="domain_force">[domain表达式:表示该权限控制生效的条件]</field>
</record>
</data>

三:向导

向导的视图位置:

定义好的向导表单视图示例:

一个向导是一个继承自TransientModel的模型,TransientModel又继承自model

向导的主要作用:可以通过many2one、many2many关联其他模型纪录,从而可以在向导表单视图中操作其它模型的数据。

1:创建向导模型

class 向导名(models.TransientModel):
_name = '模块.模型名'
var = fields.Many2one('被关联字段', string="", required=True)
vars = fields.Many2many('被关联字段', string="")

def 对上面字段的操作函数():
......

2:在视图层定义向导的form表单

 <record model="ir.ui.view" id="wizard_form_view">
<field name="name">wizard.form</field>
<field name="model"></field>
<field name="arch" type="xml">
<form string="form视图显示名">
<group>
<field name="引用的字段"/>
<field name="引用的字段"/>
</group>
<footer>//位于form表单底部的按钮
<button name="subscribe" type="object"
string="Subscribe" class="oe_highlight"/>
or
<button special="cancel" string="Cancel"/>
</footer>
</form>
</field>
</record>

3:在视图层定义向导启动:在新窗口启动向导(即:在新窗口打开向导form视图)

向导可以通过ir.actions.act_window记录来启动,将target字段值设置为new即可。

src_model属性指定某个模型的向导操作可用

<act_window id="launch_the_wizard"
name=""
src_model="context.model.name" //向导关联的模型名
res_model="wizard.model.name" //引用具体向导
view_mode="form"
target="new"
key2="client_action_multi"/>

向导使用的是常规视图,我们可以给它的按钮添加special="cancel"属性来实现不保存任何数据的情况下关闭向导。

<button special="cancel" string="Cancel"/>

odoo开发教程六:工作流、安全机制、向导的更多相关文章

  1. 公众号第三方平台开发 教程六 代公众号使用JS SDK说明

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  2. XAF应用开发教程(六)控制器

    是的,XAF也是MVC结构的,但不仅限于MVC,ViewModel也存在,它是一项复合技术,AOP,ORM,MVC都有. 真实运行的系统中,仅有增删改查功能肯定是远远不够的,ERP.CRM等系统的开发 ...

  3. Android OpenGL ES 开发教程 从入门到精通

    感谢,摘自:http://blog.csdn.net/mapdigit/article/details/7526556 Android OpenGL ES 简明开发教程 Android OpenGL ...

  4. 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  5. Senparc.Weixin.MP SDK 微信公众平台开发教程(十六):AccessToken自动管理机制

    在<Senparc.Weixin.MP SDK 微信公众平台开发教程(八):通用接口说明>中,我介绍了获取AccessToken(通用接口)的方法. 在实际的开发过程中,所有的高级接口都需 ...

  6. Senparc.Weixin.MP SDK 微信公众平台开发教程(六):了解MessageHandler

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...

  7. C#微信公众号开发系列教程六(被动回复与上传下载多媒体文件)

    微信公众号开发系列教程一(调试环境部署) 微信公众号开发系列教程一(调试环境部署续:vs远程调试) C#微信公众号开发系列教程二(新手接入指南) C#微信公众号开发系列教程三(消息体签名及加解密) C ...

  8. 《ArcGIS Engine+C#实例开发教程》第六讲 右键菜单添加与实现

    原文:<ArcGIS Engine+C#实例开发教程>第六讲 右键菜单添加与实现 摘要:在这一讲中,大家将实现TOCControl控件和主地图控件的右键菜单.在AE开发中,右键菜单有两种实 ...

  9. 转载收藏之用 - 微信公众平台开发教程(六):了解MessageHandler

    上一篇<Senparc.Weixin.MP SDK 微信公众平台开发教程(五):使用Senparc.Weixin.MP SDK>我们讲述了如何使用Senparc.Weixin.MP SDK ...

  10. iOS 11开发教程(十六)iOS11应用视图之删除空白视图

    iOS 11开发教程(十六)iOS11应用视图之删除空白视图 当开发者不再需要主视图的某一视图时,可以将该视图删除.实现此功能需要使用到removeFromSuperview()方法,其语法形式如下: ...

随机推荐

  1. PMP常见会议小结

    转载请注明出处: 会议是吸引项目团队和其他干系人参与的重要方式.它们是整个项目的主要沟通方式. 一. 项目启动会 召开时间:是启动阶段结束时召开的会议. 主要任务:发布项目章程,并任命项目经理,赋予项 ...

  2. Java面试——Netty

    一.BIO.NIO 和 AIO [1]阻塞 IO(Blocking I/O):同步阻塞I/O模式,当一条线程执行 read() 或者 write() 方法时,这条线程会一直阻塞直到读取一些数据或者写出 ...

  3. 罗技GHUB怎么写入板载内存

    本文以自用罗技MX518复刻版鼠标作为例子,让大家怎么学会把logitech G HUB的设置写入鼠标板载内存,并且一键切换各组板载设置. 首先点击最下方的启用,让软件设置鼠标各项设定 启用软件的设定 ...

  4. VUE中的next({ ...to, replace: true })

    beforeEach((to, from, next) => { next('/logon') } 上面这串代码我们可以看成为 beforeEach((to, from, next) => ...

  5. Mysql 局域网远程连接设置——Windows

    工作中,遇到mysql数据库存储于我的电脑上,而其他电脑需要共同进行读写数据(类似redis并发),所以我的电脑就必须开启mysql远程连接. 一. 授权 1. 连接数据库 mysql -uroot ...

  6. 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(13)-Charles如何进行Mock和接口测试

    1.简介 Charles最大的优势在于抓包分析,而且我们大部分使用的功能也在抓包的功能上,但是不要忘记了,Charles也可以做接口测试.至于Mock,其实在修改请求和响应数据哪里就已经介绍了,宏哥就 ...

  7. w11 U盘启动进PE看不到硬盘解决方法

    w11 U盘启动进PE看不到硬盘解决方法 今天,因为要配系统,所以需要进pe,改配置文件,进去之后发现看不到系统盘,大吃一惊,然后各种找资料,最后,还是被我搞定了. 这里以戴尔为例,方法都差不多,先看 ...

  8. [数据库]Ubuntu Linux/Kylin: 安装MySQL

    1 文由 由于安装环境较为特殊,实在折煞人也.而此环境的网络博客/教程偏少,觉得有必要记录一下. 2 环境 安装主机不支持联网 即 不支持APT/APT-GET等傻瓜式的在线安装方式. 硬件架构: A ...

  9. Redis 源码解析之通用双向链表(adlist)

    Redis 源码解析之通用双向链表(adlist) 概述 Redis源码中广泛使用 adlist(A generic doubly linked list),作为一种通用的双向链表,用于简单的数据集合 ...

  10. Python常见面试题017: Python中是否可以获取类的所有实例

    017. Python中是否可以获取类的所有实例 转载请注明出处,https://www.cnblogs.com/wuxianfeng023 出处 https://docs.python.org/zh ...