规则
自动化规则
规则是一直自动化脚本运行环境。
通过规则,可以在站点设置一些“钩子”脚本,当站点发送事件,满足条件时,会自动调用这些脚本,从而改变系统的默认行为。
.. contents:: .. sectnum::
为什么需要规则
使用规则,可将一些特殊的逻辑,附加到系统中。比如:
- 文件夹上传文件,自动生成编号
- 图片上传,自动进行文字识别
- 某个文件夹上传图片后,需要自动进行OCR扫描识别
- 某个文件夹不能上传.exe的文件
- 某个文件夹的总容量不能超过1G
- 某个文件夹上传文件,自动变成保密
- 上传文件,需要自动通知相关人员
- 上传图片后,需要自动进行OCR文字识别
这些需求,不是有用户主动发起的,而是需要改变平台内在的一些运行逻辑。
诸如此类的逻辑,可采用系统规则功能实现。
开发人员在扩展应用中预先定义好规则; 网站各栏目的管理人,将规则绑定到网站某个位置,激活规则的使用。
规则的定义
- 某个对象发生某种事件
- 满足一定条件时
- 执行一些脚本操作
规则脚本
规则脚本可以使用如下内置变量:
- root:所在站点
- context: 发生事件的对象
- container: 规则分配的位置,如果有关联的扩展属性设置,也是扩展属性设置的地方
- request: 请求对象
- event: 事件, 详细见下面,不同的事件有不同的参数
规则事件
不同的事件,会有不同的参数,供脚本使用。
created: 容器中添加新对象
包括移入和创建 :
- event.object: 添加的内容
removed:容器中去除对象
包括删除和移出
- event.object: 删除的内容
modified: 修改,
- event.object: 修改的内容
movein: 移入的事件
- event.object : 移入的内容
moveout:移出的事件
- event.object:移出的内容
comment-added: 添加评注
-
event.object: 评注对象
-
event.comment: 当前的评注对象::
{''body':body, 'author':author, 'attachments':attachments, 'time':time}
login: 登入,
登录系统
file-downloaded 文件下载,
teamgroup-added: 组添加
teamgroup-removed': 组删除
teamgroup-modified': 组修改,
tag-added': 添加标签,
'tag-removed': 去除标签,
relation-added': 添加关系,
relation-removed': 删除关系,
new-revision': 新版本,
version-fixed': 定版
status-added: 对象新增某个状态
- event.item: 新增的状态
- event.old_stati: 之前的状态
status-removed: 对象去除某个状态
- event.item: 去除的状态
- event.old_stati: 之前的状态
clock: 站点定时事件
这个事件每小时触发一次。为方便调试,可以主动访问这个页面来触发::
/@zopen.debug:notify_hour_clock
workflow-executed 工作流执行某步骤
工作流规则中,可以利用下面的变量编写脚本:
- event.workitem 当时的工作项
- event.workitem.md['step'] 步骤
- event.workitem.actions[-1]['action_name'] 操作名
- event.object : 流程单
授权权限: acl-changed
发生授权的时候,会触发次规则。
event有如下属性:
- event.context: 授权的内容
- event.roles: 授权的角色
- event.pids: 用户
- event.action: 操作:grant/deny/unset
规则的分配管理
查看已经分配的规则::
context.rules.list_assignments()
分配规则::
context.rules.assign(rule_ids, enabled=True, bubbles=False)
注:
- rule_id 为 应用名:规则文件名 如zopen.outlook:remove_files
- enabed表示这个规则是否启用生效
- bubbles表示子文件夹的内容,也使用这个规则,否则仅仅单层内容生效。
变更规则::
context.rules.update(rule_id, enabled=True, bubbles=False)
去除一个规则::
context.rules.remove(rule_id)