今天在做项目管理的二开,碰到一个比较复杂的domain
domain="[('user_ids', 'in', uid),('state', 'in', ('已发布','进行中','待审核'))]"
domain="['&','|',('user_ids', 'in', uid),('last_task_user_ids', 'in', uid),('state', '=', '待审核')]"
需要把这两个domain用逻辑或合并成一个, 因为odoo的domain属于前缀表达式,也叫波兰表达式,而我们习惯的是中缀表达式。
所谓前缀表达式就是把操作符放在前面,操作数放在后面
比如我们常见的a+b 就是中缀表达式,用前缀表达式表示的话应该写成 +ab,看着有点怪
不过前缀表达式有个好处,就是计算机处理起来比较容易,而且没有小括号,也能准确表达执行的顺序。
基本的原理就一条:
碰到 操作符,操作数,操作数 ,就会先对这个表达式做运算,将运算的结果替换原来的表达式。
但是平时写的都是比较简单的,还问题不大,这次搞了一个有点难度的,把我给难住了。。
最后想想,思路也就清晰了,既然要用或连接这两个表达式,那就分三步走:
1、先把或写在前面
2、然后跟上那个比较复杂的表达式
3、跟上那个简单的表达式,之前的&省略了,现在合起来写就不能省略了,注意在xml中 &要做转义
最后的结果是这样:
domain="['|','&','|',('user_ids', 'in', uid),('last_task_user_ids', 'in', uid),('state', '=', '待审核'),
'&', ('user_ids', 'in', uid),('state', 'in', ('已发布','进行中','待审核'))]"
这样就写完了,本以为要结束了,后面有出现一个需求,要根据这个条件控制一个按钮是否可见,
可是按钮的属性,只有invisible,那就要对上面这个表达式取反, 按照正常的理解,是不是感觉又要搞出个很复杂的东西出来,可事实上很简单, 在最开头的位置加一个逻辑非就ok。
domain="['!','|','&','|',('user_ids', 'in', uid),('last_task_user_ids', 'in', uid),('state', '=', '待审核'),
'&', ('user_ids', 'in', uid),('state', 'in', ('已发布','进行中','待审核'))]"
加了一个!,完活。
前缀表达式,真要搞明白了,也挺简单的。关键的一句话:
碰到 操作符,操作数,操作数 ,就会先对这个表达式做运算,将运算的结果替换成原来的表达式。然后继续运算