PY.JS
不知道你是否知道,在早些版本的odoo,在树形列表视图中,有一种可以根据值来改变字体颜色的方法。
<tree string="Languages" colors="gray:not active">
...
</tree>
这种方式可以让我根据字段的值来定义想要显示的字体颜色,一旦满足条件后,整条记录的字体都会变成定义的颜色。但是从9.0版本起,不知道官方出于什么考虑,这个方法被弃用了,转而推出了decoration-*系列属性,然后如果我们想要再使用这种简单的特性就只有从第三方模块那里实现了。
PY.JS 是什么
不知道你是否思考过,上面所提到的属性,是怎样实现的?要回答这个问题,就需要本章的主角登场了:PY.JS。PY.JS不是一个独立的框架,它只是odoo用来使用Python的方式来处理前端Python式逻辑表达式的工具。
例如,我们有一个decorator系列的属性:
<tree decoration-muted="scrapped == True" string="Stock Moves">
PY.JS的工作就是负责解析scrapped == True的表达式,找到相关的字段,并进行表达式的布尔判断,然后将解析后的结果交给具体的业务逻辑代码进行处理,从而实现页面元素的样式的变化。
PY.JS的功能
从PY.JS的说明文档可知,当前模块并不完善,并没有完全实现Python相关的所有特性。仅支持下面的内置类型或方法:
- type: 仅支持创建类型,不支持获取类型属性
- None
- True
- False
- NotImplemented: 运算符没有实现或不受支持时返回(Rich Comparisions)。
- issubclass
- object
- bool: 不能从int转换,因为int没有实现
- float
- str
- tuple: 不支持构造和强制转换,仅支持字面
- list: 目前只是tuple的别称
- dict: 仅支持getter、setter和len
数据模型协议
受支持的协议列表:
- 富比较协议 : 支持大多数的协议,但是_hash_返回的是一个javascript的string
- 布尔转换: _nonzero_
- 自定义属性访问: getter ,setter 但是_delatrr_不支持
- 描述符协议: 不支持_delete_
- 可调用对象
- 抽象基类集合
- 数学类型仿真: abs,divmod和pow尚未实现
API 列表
py.eval
py.eval(expr[,context])
解析expr表达式,并使用传入的上下文对象context,其内部实际调用了tokenize、parse和evaluate方法。
py.tokenize
py.tokenize(expr)
接收一个表达式参数
py.parse
py.parse(tokens)
接收一个由py.tokenize()方法返回的对象,返回一个抽象的语法树
py.evaluate
py.evaluate(ast[, context])
接收两个参数,ast是py.parse方法的返回值,context是Python表达式的上下文变量