跳转至

低代码定制(Studio 风格)

Odoo Studio 是 Enterprise 专属的可视化编辑器。它所做的定制(字段、视图、 自动化动作)都是保存在数据库中的普通 Odoo 记录。本插件通过 RPC 创建这些 相同的记录,因此你在 Community 版上也能获得 Studio 常见的成果,而无需 许可证。

诚实的适用范围

这覆盖的是小型、低代码的改动:一个字段、一处视图调整、一个简单的 自动化。它不能替代严肃的模块开发(打包的代码、迁移、测试、复杂的业务 逻辑)。若需要这些,请构建一个模块。参见 它像 Odoo Studio 吗?

改动存放在哪里

存放在实例/数据库中,与 Studio 完全一样,而不是像仓库中的模块代码那样。 它们像手动定制一样在升级中保留下来。如果你需要仓库中的代码,那属于模块开发, 不在本插件的范围之内。

1. 添加自定义字段

使用 odoo_add_field 工具。它会创建一个 state='manual' 的字段,并强制加上 必需的名称前缀 x_

odoo_add_field {
  "model": "res.partner",
  "name": "loyalty_points",
  "label": "Puntos de lealtad",
  "field_type": "integer"
}

名称 loyalty_points 会变成 x_loyalty_points

关系型示例:

odoo_add_field { "model": "res.partner", "name": "account_manager",
  "label": "Ejecutivo de cuenta", "field_type": "many2one", "relation": "res.users" }

对于 selection 字段,将 selection 传为 [["a","A"],["b","B"]]。创建字段 之后,把它添加到一个表单视图或列表视图中(步骤 2),用户才能看到它。

2. 调整视图(继承)

没有专门的工具;请对 ir.ui.view 使用 odoo_create,配合一个继承的 arch, 这样就不会覆盖基础视图。先找到要扩展的视图:

odoo_search_read { "model": "ir.ui.view",
  "domain": [["model","=","res.partner"],["type","=","form"]],
  "fields": ["name","xml_id"], "limit": 5 }

然后创建一个继承视图:

odoo_create { "model": "ir.ui.view", "values": {
  "name": "res.partner.form.x_loyalty",
  "model": "res.partner",
  "inherit_id": <id_vista_base>,
  "arch_db": "<xpath expr=\"//field[@name='email']\" position=\"after\"><field name=\"x_loyalty_points\"/></xpath>"
}}

优先使用 xpath ... position="after|before|inside|replace",而不是重写整个视图。

3. 添加自动化

使用 odoo_add_automation。其 Python 代码在 Odoo 的 safe_eval 下运行;工具 会在发送之前对它进行校验,这一点在 Odoo online/SaaS 中尤为重要,因为在 那里,任意 Python 代码会在服务器端被拒绝。

odoo_add_automation {
  "model": "crm.lead",
  "name": "Marcar leads calientes",
  "trigger": "on_create_or_write",
  "code": "for rec in records:\n    if rec.probability and rec.probability > 80:\n        rec.priority = '3'"
}

safe_eval 规则(由工具强制执行)

代码在 Odoo 的 safe_eval 下运行。禁止importdefclassreturnwith,以及访问以下划线或双下划线(__)开头的名称或属性。 工具会在发送之前拒绝这些结构,并给出清晰的修正建议,因此你会在本地 就发现问题,而不是通过服务器错误才知道。

该上下文中可用的名称envmodelrecord/recordsdatetimedateutiltimeUserError。要返回一个动作,请把 action = {...} 作为 最后一条语句进行赋值(绝不要用 return)。

Enterprise 对比 Community

  • 这里创建的字段、视图和自动化在两个版本中都能工作。
  • Enterprise 中,它们不会出现在 Studio 编辑器里(它们没有被标记为 web_studio 定制),但在运行时表现相同。
  • Enterprise 专属的模型(例如 documents.document)在 Community 中仍然 无法使用:兼容层会抛出一个清晰的错误。

验证(完成的定义)

读回记录并确认效果:

  • 字段odoo_fields_get { "model": "<modelo>" } 会显示新的 x_ 字段。
  • 视图:在 Odoo 中打开表单(或读取继承的 ir.ui.view)。
  • 自动化:在一条记录上触发它,并读取被修改的字段。

技能参考:/odoo-tools:odoo-studio-style