简化OpenERP开发的实用工具
项目描述
openerp-sane 是一组小工具集合,使 OpenERP 开发看起来不再像充满血腥和肉搏的古代战争,更像 Python。
目前,有两个工具: @oemeth 和 s2d/d2s(日期转换)。@oemeth 方法装饰器可以简化我们对模型方法中著名的 ids 参数的管理。示例
def myaction(self, cr, uid, ids, context=None): pass
通常,ids 应该是一个整数列表,但 有时,仅仅是,有时,我们得到一个裸露的 int,然后我们的方法崩溃。我们必须添加代码像
if isinstance(ids, (int, long)):
ids = [ids]
此外,还有一个令人烦恼的问题:为什么,哦 为什么 我所有的方法都必须处理多个 ids 的情况?当我有一个用于表单中某个按钮的操作时,我知道它每次只会处理一个 id。我可以很容易地做到 ids[0],但如果我真的想确保安全,我会确保 ids 是一个列表。你不厌倦这种荒谬的舞蹈吗?这就是为什么我们有 @oemeth
安装
你迫不及待想在模块中使用它,对吧?openerp-sane 可以从 PyPI 安装
$ pip install openerp-sane
当你在模块中使用它时,你可以在你的 __openerp__.py 中记录对其的依赖
{
# [...]
'external_dependencies': {
'python': ['openerp_sane'],
},
# [...]
}
@oemeth
@oemeth 是一个方法装饰器,它接受2个(可选,默认为 False)参数: single 和 browse。默认情况下,它仅仅确保 ids 是一个列表
from openerp_sane import oemeth
# [...]
@oemeth
def myaction(self, cr, uid, ids, context=None):
# Write code that assumes ids is a list
当 single 设置为 True 时,我们将强制使用单个 int id
@oemeth(single=True)
def myaction(self, cr, uid, objid, context=None):
# objid is an ``int``.
# WARNING: Use this only when you're sure that you'll only ever have single arguments.
# If the input is a list with a len() != 1, an exception is raised.
当 browse 设置为 True 时,我们将使用 self.browse() 调用来包装我们的 id(s)
@oemeth(browse=True)
def myaction(self, cr, uid, objs, context=None):
# objs is a list of browse records
s2d/d2s
s2d() 和 d2s() (意为“字符串转日期”和“日期转字符串”)的存在是为了缓解我们在实际处理和比较日期时遇到的糟糕问题。如果没有这些辅助工具,我们必须手动转换正确的日期格式,这可能会很快变得很繁重。
s2d(string_date) 从日期字段中获取字符串值并返回一个 datetime.date。如果它无法解析它,它将返回 False。
d2s(date) 接受一个 datetime.date 并返回一个可以写入日期字段的字符串。如果 date 不是一个日期,我们返回 False(也可以写入日期字段)。
在这两个函数中,我们使用 OE 的 DEFAULT_SERVER_DATE_FORMAT 常量。
一些经验之谈
不要在 on_change 方法中使用 single(这要求始终恰好有一个 id)。当然,大多数情况下你只会得到一个 id,但如果你在一个尚未提交的记录上调用它,你将得到零个 id,这将引发异常。未来,single 模式可能会支持零个 id 的情况。
项目详情
openerp-sane-0.2.1.tar.gz 的散列
算法 | 散列摘要 | |
---|---|---|
SHA256 | 8be0b1bab45b2aa32c3d79c40c3eb150490462688a38922b006327ec0e480b5b |
|
MD5 | d7ae812147d14df9981091dfadaecca7 |
|
BLAKE2b-256 | 324c5fb4a171204d9d623e43879ef32295e8b2ab093281c68fb4a7e86d39d9d8 |