Odoo 开发规范指南
Odoo 开发规范指南
修订记录:
时间 | 修订内容 | 修订人 |
---|---|---|
初稿 | ||
1. 目录结构规范
/module_name/
├── controllers/ # 控制器
│ ├── __init__.py
│ └── main.py
├── data/ # 数据文件
├── demo/ # 演示数据
├── models/ # 模型
│ ├── __init__.py
│ └── model_name.py
├── report/ # 报表
├── security/ # 权限
│ ├── ir.model.access.csv
│ └── module_name_groups.xml
│ └── module_name_security.xml
├── static/ # 静态文件
│ ├── description/ # 模块描述图片
│ ├── img/ # 图片资源
│ ├── lib/ # 第三方库
│ └── src/ # CSS/JS等
│ ├── css/
│ ├── js/
│ └── scss/
├── views/ # 视图
│ ├── templates.xml # QWeb模板
│ ├── model_name_views.xml
│ └── module_name_menus.xml
├── wizard/ # 向导
│ ├── __init__.py
│ └── wizard_name.py
├── __init__.py
├── __manifest__.py
└── README.md # 模块说明文档
2. 命名规范
2.1 模块命名
- 全部小写,使用下划线分隔单词
- 示例:
hx_andon
,hxdcs_cnc
- 跟车间有关的模块部署在192.168.1.80上,统一以hx_ 或者hxdcs_ 开头。
- 第三方集成的模块部署在192.168.1.83上,以patch_ 开头,如patch_hr(朗新hr的补丁程序)
2.2 模型命名
- 单数形式,使用点号表示层级关系
- 示例:
hx.andon.point
,hx.andon.request
2.3 字段命名
-
小写字母,下划线分隔
-
避免使用驼峰命名
-
关系字段后缀:
_id
表示 many2one_ids
表示 one2many 或 many2many
-
示例:
name = fields.Char(string="Name") partner_id = fields.Many2one("res.partner", string="Partner") line_ids = fields.One2many("sale.order.line", "order_id", string="Order Lines")
2.4 XML ID 命名
-
格式:
module_name.object_type_name
-
示例:
<record id="view_order_form" model="ir.ui.view"> <menuitem id="menu_sales_root" name="Sales"/>
2.5 视图命名
- 树视图:
model_name_view_list
- 表单视图:
model_name_view_form
- 搜索视图:
model_name_view_search
- 看板视图:
model_name_view_kanban
- 如果一个模型有多个同类视图,比如list视图有2个,则在后面加上说明,比如 model_name_view_list_desc1,model_name_view_list_desc2,
2.6 Python文件/类/方法命名
-
类名:驼峰命名法
-
方法名,变量名:小写字母,下划线分隔
-
私有方法,私有变量用前缀:
_
-
示例:
class SaleOrder(models.Model): _name = "sale.order" def action_confirm(self): pass def _check_something(self): pass
3. 代码风格
3.1 Python代码
- 遵循PEP 8规范
- 每行不超过80个字符
- 使用4个空格缩进
- 导入顺序:
- Python标准库
- 第三方库
- Odoo模块
- 当前模块
3.2 XML文件
-
每个标签单独一行
-
属性按字母顺序排列
-
字符串使用双引号
-
示例:
<record id="hx_andon_types_view_tree" model="ir.ui.view"> <field name="name">hx.andon.types.tree</field> <field name="model">hx.andon.types</field> <field name="arch" type="xml"> <list editable="bottom"> <field name="name"/> <field name="company_id"/> <field name="user_ids" widget="many2many_tags"/> <field name="user3"/> <field name="time3"/> <field name="time33"/> <field name="sequence"/> </list> </field> </record>
4. 安全规范
4.1 访问权限
- 每个模型必须有对应的
ir.model.access.csv
文件 - 遵循最小权限原则
4.2 安全组
-
使用
security/module_name_groups.xml
定义组 -
命名规范:
group_role
-
示例:
<?xml version="1.0" encoding="UTF-8" ?> <odoo> <record id="hx_chp.module_category" model="ir.module.category"> <field name="name">浩信变化点系统</field> <field name="description">浩信变化点系统</field> </record> <!--初级权限--> <record id="group_base" model="res.groups"> <field name="category_id" ref="hx_chp.module_category"/> <field name="name">变化点系统普通权限</field> <field name="implied_ids" eval="[(4,ref('base.group_user'))]"/> <field name="comment">可以录入信息,查看数据</field> </record> <!--管理员--> <record id="group_manager" model="res.groups"> <field name="category_id" ref="hx_chp.module_category"></field> <field name="name">变化点系统管理员</field> <field name="implied_ids" eval="[(4,ref('hx_chp.group_base'))]"></field> <field name="comment">管理员可以设置后台数据</field> </record> </odoo>
4.3 记录规则
-
使用
security/module_name_security.xml
定义组 -
命名规范:
model_name_rule
-
示例: 多公司限制, 考虑将这一句去掉
<?xml version="1.0" encoding="UTF-8" ?> <odoo> <record id="hx_base_production_line_rule" model="ir.rule"> <field name="name">production_line: multi-company</field> <field name="model_id" ref="model_hx_base_production_line"/> <field name="domain_force"> ['|', ('company_id', '=', False), ('company_id', 'in', company_ids)] </field> </record> </odoo>
5. 版本控制
5.1 提交信息
- 格式:
[模块名] 简短描述
- 示例:
[sale] 修复订单确认时的价格计算问题
6. 文档规范
6.1 模块文档
- 每个模块根目录包含README.md
- 内容:
- 模块目的
- 主要功能
- 安装说明
- 配置说明
- 使用示例
- 升级记录, 时间,内容,修订人
6.2 代码注释
-
公共方法必须有docstring
-
复杂逻辑必须有注释
-
示例:
def action_confirm(self): """ Confirm the sale order and generate related procurement :return: True :rtype: bool :raises: UserError if order cannot be confirmed """ if not self.order_line: raise UserError(_("You cannot confirm a sale order with no lines.")) ...
7. 最佳实践
- 避免在XML中使用硬编码ID,优先使用
ref()
方法 - 使用
@api.model
装饰器标记类方法 - 批量操作时使用
@api.multi
并考虑性能 - 重写方法时调用
super()
- 多公司环境下使用
company_dependent
字段 - 翻译字符串使用
_()
函数 - 测试覆盖率不低于80%希望这份规范能帮助您的团队统一开发标准,提高代码质量和可维护性。建议定期回顾并根据项目实际情况进行调整。
8.学习方法
-
官方代码就是最好的学习材料。 odoo内置了很多模块,在addons目录下。
-
官方文档https://www.odoo.com/documentation/18.0/developer/tutorials.html
-
OCA