odoo10学习笔记六:工作流、安全机制、向导
转载请注明原文地址:https://www.cnblogs.com/ygj0930/p/11189289.html
一:工作流
工作流是与业务流程相关联的模型,可用于跟踪工序的动态演变过程。
工作流、活动(节点或操作)、转换通常在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"/>
odoo10学习笔记六:工作流、安全机制、向导的更多相关文章
- java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)
java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...
- Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live
中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...
- Java虚拟机学习笔记——JVM垃圾回收机制
Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...
- Typescript 学习笔记六:接口
中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...
- python3.4学习笔记(六) 常用快捷键使用技巧,持续更新
python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...
- Go语言学习笔记六: 循环语句
Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...
- Android:日常学习笔记(9)———探究广播机制
Android:日常学习笔记(9)———探究广播机制 引入广播机制 Andorid广播机制 广播是任何应用均可接收的消息.系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播.通过将 In ...
- 【opencv学习笔记六】图像的ROI区域选择与复制
图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...
- Linux学习笔记(六) 进程管理
1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...
随机推荐
- 组装数据--相同的clusterID合并在一起 左边是a接口 右边是B接口如 [{a接口},{b接口}]
组装成这种 var BJData = [ [{"city": "无锡市","clusterID": 1, "y": 3 ...
- public class和class的区别
class A { } class B { } public class 和class的区别: * 一个java源文件当中看看定义多个class *一个java源文件当中public的class不是必 ...
- 6. Vue - 声明周期
一.官方vue生命周期流程图 二.vue声明周期介绍 beforeCreate执行时:data和el均未初始化,值为undefined created执行时:Vue 实例观察的数据对象data已经配置 ...
- str基本语法
基本数据类型(int,bool,str)1.基本数据数据类型: int 整数 str 字符串. 一般不存放大量的数据 bool 布尔值. 用来判断. True, False list 列表.用来存放大 ...
- Requests text乱码
都在推荐用Requests库,而不是Urllib,但是读取网页的时候中文会出现乱码. 分析: r = requests.get(“http://www.baidu.com“) **r.text返回的是 ...
- oracle 数据库下所有表结构、数据量及缺失值统计
表结构 SELECT t1.TABLE_NAME, t1.COLUMN_NAME, t1.DATA_TYPE || '(' || t1.DATA_LENGTH || ')', t2.COMMENTS ...
- luoguP3242 [HNOI2015]接水果
题意 考虑整体二分. 考虑路径\((x,y)\)被路径\((u,v)\)包含需要满足什么条件: 设\(dfn_x\)表示\(x\)的\(dfs\)序,\(low_x=dfn_x+size_x-1\), ...
- 树莓派包含python2.7系统路径
- scss和sass最大的区别
重新接触了一下sass语法,在vscode的用的easysass插件.ctrl+S就可以自动编译成css文件.需要自己配置生成css路径 遇到的一个坑就是sass官网几乎全是写的sass,示例中全部是 ...
- Jenkins安装第一个插件和通过离线安装包进行安装
1.打开左侧Manage Jenkins 选择Manage Plugins菜单 2.搜索Folders插件,该插件用于创建一个目录 3.点击安装进入插件安装状态,Jenkins会自动下载相关联的插件 ...