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表达式进行计算

相关推荐
毕设源码-郭学长5 分钟前
【开题答辩全过程】以 基于SpringBoot框架的民俗文化交流与交易平台的设计与实现为例,包含答辩的问题和答案
java·spring boot·后端
eason_fan13 分钟前
Service Worker 缓存请求:前端性能优化的进阶利器
前端·性能优化
l***217819 分钟前
SpringBoot Maven快速上手
spring boot·后端·maven
光影少年22 分钟前
rn如何和原生进行通信,是单线程还是多线程,通信方式都有哪些
前端·react native·react.js·taro
好大哥呀41 分钟前
Java Web的学习路径
java·前端·学习
f***147743 分钟前
SpringBoot实战:高效实现API限流策略
java·spring boot·后端
计算机毕设VX:Fegn089544 分钟前
计算机毕业设计|基于springboot + vue动物园管理系统(源码+数据库+文档)
数据库·vue.js·spring boot·后端·课程设计
HashTang1 小时前
【AI 编程实战】第 7 篇:登录流程设计 - 多场景、多步骤的优雅实现
前端·uni-app·ai编程
cos1 小时前
Fork 主题如何更新?基于 Ink 构建主题更新 CLI 工具
前端·javascript·git
小满zs1 小时前
Next.js第二十一章(环境变量)
前端·next.js