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个空格缩进
  • 导入顺序:
    1. Python标准库
    2. 第三方库
    3. Odoo模块
    4. 当前模块

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. 最佳实践

  1. 避免在XML中使用硬编码ID,优先使用ref()方法
  2. 使用@api.model装饰器标记类方法
  3. 批量操作时使用@api.multi并考虑性能
  4. 重写方法时调用super()
  5. 多公司环境下使用company_dependent字段
  6. 翻译字符串使用_()函数
  7. 测试覆盖率不低于80%希望这份规范能帮助您的团队统一开发标准,提高代码质量和可维护性。建议定期回顾并根据项目实际情况进行调整。

8.学习方法

  1. 官方代码就是最好的学习材料。 odoo内置了很多模块,在addons目录下。

  2. 官方文档https://www.odoo.com/documentation/18.0/developer/tutorials.html

  3. OCA

posted @ 2025-10-10 10:28  柴郡猫zzz  阅读(6)  评论(0)    收藏  举报