转载请注明原文地址: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学习笔记六:工作流、安全机制、向导的更多相关文章

  1. java之jvm学习笔记六-十二(实践写自己的安全管理器)(jar包的代码认证和签名) (实践对jar包的代码签名) (策略文件)(策略和保护域) (访问控制器) (访问控制器的栈校验机制) (jvm基本结构)

    java之jvm学习笔记六(实践写自己的安全管理器) 安全管理器SecurityManager里设计的内容实在是非常的庞大,它的核心方法就是checkPerssiom这个方法里又调用 AccessCo ...

  2. Learning ROS for Robotics Programming Second Edition学习笔记(六) indigo xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS for Robotics Pr ...

  3. Java虚拟机学习笔记——JVM垃圾回收机制

    Java虚拟机学习笔记——JVM垃圾回收机制 Java垃圾回收基于虚拟机的自动内存管理机制,我们不需要为每一个对象进行释放内存,不容易发生内存泄漏和内存溢出问题. 但是自动内存管理机制不是万能药,我们 ...

  4. Typescript 学习笔记六:接口

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  5. python3.4学习笔记(六) 常用快捷键使用技巧,持续更新

    python3.4学习笔记(六) 常用快捷键使用技巧,持续更新 安装IDLE后鼠标右键点击*.py 文件,可以看到Edit with IDLE 选择这个可以直接打开编辑器.IDLE默认不能显示行号,使 ...

  6. Go语言学习笔记六: 循环语句

    Go语言学习笔记六: 循环语句 今天学了一个格式化代码的命令:gofmt -w chapter6.go for循环 for循环有3种形式: for init; condition; increment ...

  7. Android:日常学习笔记(9)———探究广播机制

    Android:日常学习笔记(9)———探究广播机制 引入广播机制 Andorid广播机制 广播是任何应用均可接收的消息.系统将针对系统事件(例如:系统启动或设备开始充电时)传递各种广播.通过将 In ...

  8. 【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  9. Linux学习笔记(六) 进程管理

    1.进程基础 当输入一个命令时,shell 会同时启动一个进程,这种任务与进程分离的方式是 Linux 系统上重要的概念 每个执行的任务都称为进程,在每个进程启动时,系统都会给它指定一个唯一的 ID, ...

随机推荐

  1. [日常] 修复了grub引导问题

    上周遇到的神奇引导问题竟然被鬼使神差的修复好了.因为我的电脑是64位的也就是x86_64架构,并且是UEFI模式下,但是之前装的grub一直是grub-传统,并且一直是i386-pc平台也就是32位的 ...

  2. 2.Python爬虫入门_requests

    #2019-11-23 #requests的api使用非常简单 import requests import time if __name__=='__main__': # get请求 url_get ...

  3. Docker 简单发布dotnet core项目 文本版

    原文:https://www.cnblogs.com/chuankang/p/9474591.html docker发布dotnet core简单流程 照着步骤来基本没错 但是有几个要注意的地方: v ...

  4. vscode配置编译运行调试C/C++文件-windows环境

    在windows环境下,编译运行小文件的C/C++环境 软件准备: vscode mingw64(官网下特别慢,可以在devc++安装软件里中找,放到全局变量中) 插件下载: Run Code C/C ...

  5. Tomca原理分析之责任链

    责任链使用位置:Container处理请求 Container处理请求是使用Pipeline-Valve管道来处理的!(Valve是阀门之意) Pipeline-Valve是责任链模式,责任链模式是指 ...

  6. AOP软件设计

    什么是面向方面的编程? 为什么面向方面的软件设计? 术语 关注 视口 关注点分离 人工制品 横切 方面 编织 零件 形式主义 第二节 案例研究 关注 人工制品 横切 方面 AspectJ 加入点 切入 ...

  7. 解决office365无法登录以及同步的问题

    解决office365无法登录以及同步的问题 You better need to test them one by one. You better need to test them one by ...

  8. LeetCode 739:每日温度 Daily Temperatures

    题目: 根据每日 气温 列表,请重新生成一个列表,对应位置的输入是你需要再等待多久温度才会升高超过该日的天数.如果之后都不会升高,请在该位置用 0 来代替. 例如,给定一个列表 temperature ...

  9. php explode容易犯的错误

    php explode容易犯的错误 <pre> $pos = strpos($v, 'Controller'); if (is_numeric($pos)) { $kongzhiqifeg ...

  10. Allure+pytest 生成测试报告

    简介: python 主流自动化测试报告插件有三个:HTMLTestRunner.BeautifulReport 和 Allure.HTMLTestRunner是一个比较古老的报告模板,界面也不是很好 ...