说明
- Odoo版本:16
- 模块源码
- 下文中的本模块指代
web_action_conditionable
介绍
本模块来自于OCA社区。当o2m
字段使用tree
视图来展示关联记录时,可以通过<tree delete="false" create="false">
来对tree
视图中记录的操作进行限制。本模块对限制功能进行了扩展,可以使用记录的其他字段作为条件来限制tree
视图的create
、delete
操作。
使用方式
使用state
字段对tree
视图的create
、delete
操作进行限制,限制条件为python
表达式。
xml
<field name="line_ids">
<tree delete="state=='draft'" create="state!='sent'">
<field name="name"/>
</tree>
</field>
效果展示
记录的state
字段为draft
时,o2m
字段中可以创建、删除关联记录
将state
字段的值变为send
,此时o2m
字段无法创建、删除关联记录
源码解读
js
patch(X2ManyField.prototype, "web_action_conditionable_FieldOne2Many"...
该模块使用patch
方式对X2ManyField
组件进行扩展,关于patch
扩展,可以参考这篇文章。
js
get rendererProps() {
this.updateActiveActions();
return this._super(...arguments);
}
在x2m
字段的模板文件中使用t-props="rendererProps"
向ListRenderer
组件传递动态属性,本模块通过在rendererProps
方法中添加this.updateActiveActions()
来改变传递属性的值,从而达到扩展的目的。
下面是对updateActiveActions
方法的解读
js
if (this.viewMode === "list" && this.activeActions.type === "one2many")
-
this.viewMode
x2m
类型的字段在展示数据时,可以通过mode
指定展示视图,例如<field name="challenge_ids" mode="kanban"...
- 也可以通过下面方式进行展示
xml<field name="challenge_ids"> <tree>...</tree> <kanban>...</kanban> </field>
上述两种展示方式最终都会被解析为
viewMode
,存储在x2m
字段的描述信息中,x2m
字段viewMode
的取值:list
、kanban
、list,kanban
,参考源码 -
this.activeActions.type
,字段的具体类型。当viewMode
为list
时,this.activeActions.type
在many2many
与many2one
中取值。- 如果要更深入了解
activeActions
,可以参考useActiveActions
的源码。
- 如果要更深入了解
这条判断语句的作用就是对本模块的生效范围做了限定,只有使用tree
视图展示o2m
字段时,本模块才会生效。
js
const parser = new XMLParser();
const archInfo = this.activeField.views[this.viewMode];
const xmlDoc = parser.parseXML(archInfo.__rawArch);
this.activeField.views
保存了x2m
字段指定的视图。之前的if
语句限制了viewMode
为list
,字段类型为o2m
,因此archInfo
的值为tree
视图信息。archInfo.__rawArch
为视图对应的xml
定义
js
["create", "delete"].forEach(function (item) {
if (self.activeActions[item] && _.has(xmlDoc.attributes, item)) {
const expr = xmlDoc.getAttribute(item);
try {
self.activeActions[item] = evaluateExpr(
expr,
self.props.record.data
);
}
forEach
的回调感觉可以改进一下,使用箭头函数作为回调,回调函数中可以直接使用this
,无需在回调外额外定义const self = this;
- 箭头函数的
this
默认指向定义它时所处的对象
self.activeActions
包含了字段可以执行的操作,有两种方式会影响该属性的值
- 如果
x2m
字段readonly=True
,则create
与delete
都不可以进行操作 - 还有一种情况,
x2m
字段设置属性options="{'create': False, 'delete': False}"
上述两种情况对字段的操作限制优先级都高于tree
中的属性限制,因此本模块使用if
语句做了限制,当create
与delete
不可操作时,扩展不生效,防止越权出现错误。
evaluateExpr
方法对create
与delete
对应的python
表达式进行计算