Odoo开源模块学习:web_action_conditionable

说明

  • Odoo版本:16
  • 模块源码
  • 下文中的本模块指代web_action_conditionable

介绍

本模块来自于OCA社区。当o2m字段使用tree视图来展示关联记录时,可以通过<tree delete="false" create="false">来对tree视图中记录的操作进行限制。本模块对限制功能进行了扩展,可以使用记录的其他字段作为条件来限制tree视图的createdelete操作。

使用方式

使用state字段对tree视图的createdelete操作进行限制,限制条件为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的取值:listkanbanlist,kanban参考源码

  • this.activeActions.type,字段的具体类型。当viewModelist时,this.activeActions.typemany2manymany2one中取值。

    • 如果要更深入了解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语句限制了viewModelist,字段类型为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,则createdelete都不可以进行操作
  • 还有一种情况,x2m字段设置属性options="{'create': False, 'delete': False}"

上述两种情况对字段的操作限制优先级都高于tree中的属性限制,因此本模块使用if语句做了限制,当createdelete不可操作时,扩展不生效,防止越权出现错误。

evaluateExpr方法对createdelete对应的python表达式进行计算

相关推荐
databook21 小时前
数据会说谎?三大推断方法帮你“审问”数据真相
后端·python·数据分析
xw521 小时前
npm几个实用命令
前端·npm
!win !21 小时前
npm几个实用命令
前端·npm
代码狂想家21 小时前
使用openEuler从零构建用户管理系统Web应用平台
前端
代码栈上的思考21 小时前
深入解析Spring IoC核心与关键注解
java·后端·spring
dorisrv1 天前
优雅的React表单状态管理
前端
expect7g1 天前
Paimon源码解读 -- Compaction-2.KeyValueFileWriterFactory
大数据·后端·flink
小灰灰搞电子1 天前
Rust 动态分发(dyn Trait)详解
开发语言·后端·rust
码事漫谈1 天前
深入剖析进程、线程与虚拟内存
后端
码事漫谈1 天前
MFC核心架构深度解析
后端