创建模块

在创建您的第一个模块之前,您必须 创建 Odoo.sh 项目,并了解您的 GitHub 仓库的 URL。

术语表

  • ~/src 是与您的 Odoo 项目相关的 Git 存储库所在的目录。

  • odoo 是 GitHub 用户名。

  • odoo-addons 是 GitHub 仓库。

  • feature-1 是开发分支的名称。

  • main 是生产分支的名称。

  • my_module 是模块的名称。

如有必要,请替换这些内容。

创建开发分支

从 分支视图 中:

  • 在分支导航面板中,点击 Development 旁边的 +(新建开发分支)按钮。

  • 在 Fork 下,选择 main 分支。

  • 在 To 下,输入 feature-1。

在 Odoo.sh 上通过 Fork 生产分支创建开发分支

构建完成后,您可以通过 编辑器 以及 ~/src/user 文件夹访问您的开发分支代码。

创建模块结构

脚手架

虽然脚手架并非必需,但它可以避免设置 Odoo 模块基本结构的繁琐过程。您可以使用 odoo-bin 可执行文件来脚手架生成一个新模块。

从 编辑器 终端运行:

odoo-bin scaffold my_module ~/src/user/

小技巧

如果您不想在计算机上安装 Odoo,您也可以 下载此模块结构模板。请将每一处 my_module 替换为您选择的名称。

将生成以下结构:

my_module
├── __init__.py
├── __manifest__.py
├── controllers
│   ├── __init__.py
│   └── controllers.py
├── demo
│   └── demo.xml
├── models
│   ├── __init__.py
│   └── models.py
├── security
│   ├── ir.model.access.csv
│   └── models.py
└── views
    ├── templates.xml
    └── views.xml

警告

在为模块命名时,只能使用字母数字字符(a-z、0-9)或下划线(_),因为其名称会被用作 Python 类名,而包含下划线以外的特殊字符的类名在 Python 中是无效的。

请取消注释以下文件:

  • models/models.py 一个包含字段的模型示例

  • views/views.xml 一个树视图和表单视图,以及用于打开它们的菜单

  • demo/demo.xml 示例模型的演示记录

  • controllers/controllers.py 一个实现了部分路由的控制器示例

  • views/templates.xml 两个由控制器路由使用的 qweb 视图示例

  • __manifest__.py 您模块的清单文件,包含其标题、描述以及要加载的数据文件。请取消注释访问控制列表数据文件:

    # 'security/ir.model.access.csv',
    

手动

若要手动创建模块结构,请遵循 服务器框架入门 教程,以了解模块的结构以及每个文件的内容。

推送到开发分支

  1. 通过运行以下命令暂存要提交的更改:

    git add my_module
    
  2. 通过运行以下命令提交您的更改:

    git commit -m "My first module"
    
  3. 通过运行以下命令将您的更改推送到远程仓库:

    从 编辑器 终端运行:

    git push https HEAD:feature-1
    

测试模块

该分支应显示在 分支视图 导航面板的 Development 区域下。

开发分支示例

点击分支名称以查看其历史记录,包括您刚刚推送的更改。数据库准备好后,点击 连接 以访问它。

访问数据库的连接按钮

如果您的 Odoo.sh 项目已配置为自动安装模块,它将直接出现在数据库仪表板上。否则,您可以在 Apps 应用下对其进行安装。

数据库仪表板上的新模块

使用生产数据进行测试

注解

此步骤需要生产数据库。如果您还没有生产数据库,请创建一个。

在开发版本中使用演示数据测试模块并认为它已准备就绪后,可以使用过渡分支使用生产数据对其进行测试。

您可以:

  • 通过拖放将您的开发分支转换到 Staging 区域,将其转换为预发布分支。

  • 通过拖放将其合并到现有的预发布分支上。

  • 使用 git merge 命令合并您的分支。

这会创建一个新的预发布构建,它复制了生产数据库,并在一个已用您分支最新更改更新的服务器上运行。

数据库准备好后,点击 连接 以访问它。

安装模块

从 Apps 应用安装模块。由于该模块可能不会直接出现在应用列表中,请先激活 开发者模式 并点击 更新应用列表 ‣ 更新 来更新应用列表。

注解

该模块不会自动安装,因为预发布构建的目的是在类似生产数据库的环境中测试您的更改行为,因此您不希望模块被自动安装。

在生产环境中部署

当您在预发布分支上使用正式运行数据测试了模块并认为它已准备好上线正式运行时,您可以通过以下方式将您的分支合并到正式运行分支中:

  • 将预发布分支拖放到正式运行分支上。

  • 使用 git merge 命令合并您的分支。

此操作会将预发布分支中的最新更改合并到正式运行分支中,并用这些更改更新正式运行服务器。

数据库就绪后,点击 连接 即可访问。

安装模块

从 Apps 应用安装模块。由于该模块可能不会直接出现在应用列表中,请先激活 开发者模式 并点击 更新应用列表 ‣ 更新 来更新应用列表。

添加更改

本节说明如何通过在模型中添加新字段并在模型中部署它来添加更改。

  1. 从 在线编辑器 或从您的计算机上,打开模块文件夹 ~/src/odoo-addons/my_module,然后打开 models/models.py 文件进行编辑。在 description 字段之后:

    description = fields.Text()
    

    添加一个 datetime 字段:

    start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now())
    
  2. 打开 views/views.xml 文件,在以下位置之后:

    <field name="value2"/>
    

    添加:

    <field name="start_datetime"/>
    
  3. 这些更改通过向表添加列并修改视图来改变数据库结构。要将这些更改应用到现有数据库(如您的正式运行数据库),需要对模块进行更新。如果您希望在推送更改时由 Odoo.sh 平台自动执行此更新,请提高模块在其清单中的版本号:打开 __manifest__.py 并将以下代码替换为:

    'version': '0.1',
    

    替换为:

    'version': '0.2',
    

    平台将检测版本更改,并在新修订版部署时触发模块更新。

  4. 接下来,推送更改。

  5. 当您 测试了更改 后,即可将其合并到正式运行分支中,例如在 Odoo.sh 界面上将分支拖放到正式运行分支上。由于您在清单中提高了模块版本,平台会自动更新模块,您的新字段将立即可用。否则,您可以在应用列表中手动 更新模块。

使用外部 Python 库

如果您希望使用默认未安装的外部 Python 库,可以定义一个 requirements.txt 文件,列出您的模块所依赖的外部库。平台将使用该文件自动安装您的项目所需的 Python 库。

注解

  • 无法在 Odoo.sh 数据库上安装或升级系统包(例如 apt 包)。但在特定条件下,可考虑安装软件包。此规则同样适用于编译时需要系统包的 Python 模块以及第三方 Odoo 模块。

  • Odoo.sh 不支持 PostgreSQL 扩展,因此无法在 Odoo.sh 数据库上安装扩展(例如 PostGIS、ltree 等)。

例如,要在您的模块中使用 Unidecode 库:

  1. 在仓库的根文件夹中创建 requirements.txt 文件:

    • 在 Odoo.sh 编辑器中,创建并打开文件 ~/src/user/requirements.txt。

    • 从您的计算机上创建并打开文件 ~/src/odoo-addons/requirements.txt。

  2. 向文件中添加:

    unidecode
    
  3. 现在您可以在模块中使用该库,例如从模型 name 字段的字符中去除重音。为此,打开 models/models.py 文件,在以下位置之前:

    from odoo import models, fields, api
    

    添加:

    from unidecode import unidecode
    
  4. 在之后:

    start_datetime = fields.Datetime('Start time', default=lambda self: fields.Datetime.now())
    

    添加:

    @api.model
    def create(self, values):
        if 'name' in values:
            values['name'] = unidecode(values['name'])
        return super(my_module, self).create(values)
    
    def write(self, values):
        if 'name' in values:
            values['name'] = unidecode(values['name'])
        return super(my_module, self).write(values)
    
  5. 通过编辑 模块的清单 __manifest__.py 提高模块版本,以安装 Python 依赖项。

  6. 然后,推送更改。

    小技巧

    运行 git add requirements.txt 将 requirements.txt 文件加入暂存。