创建模块

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

术语表

  • ~/src是存放与 Odoo 项目相关的 Git 仓库的目录。

  • odoo是 GitHub 用户。

  • odoo-addons是 GitHub 仓库。

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

  • main是生产分支的名称。

  • my_module是模块的名称。

根据需要替换这些内容。

创建开发分支

分支视图

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

  • 分支下,选择 main 分支。

  • 下,输入 feature-1

分叉生产分支以在 Odoo.sh 上创建开发分支

构建完成后,您可以从 ~/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-z0-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',
    

手动

要手动创建模块结构,请按照Server framework 101教程了解模块的结构和每个文件的内容。

推送到开发分支

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

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

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

    编辑器终端运行:

    git push https HEAD:feature-1
    

测试模块

该分支应显示在分支视图导航面板的开发部分下。

开发分支示例

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

访问数据库的连接按钮

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

数据库仪表板上的新模块

使用生产数据进行测试

注解

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

在开发构建中使用演示数据测试模块并认为已准备就绪后,可以使用预发布分支对生产数据进行测试。

您可以:

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

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

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

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

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

安装模块

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

注解

该模块不会自动安装,因为预发布构建的目的是测试您的更改在生产数据库上的行为,所以您不希望模块自动安装。

在生产环境中部署

在预发布分支中使用生产数据测试模块并认为已准备好用于生产后,您可以通过以下方式将分支合并到生产分支:

  • 将预发布分支拖放到生产分支上。

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

这会将预发布分支的最新更改合并到生产分支中,并使用这些更改更新生产服务器。

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

安装模块

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

添加更改

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

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

    description = fields.Text()
    

    添加日期时间字段:

    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 软件包)。但在特定条件下,`可以考虑安装软件包<https://www.odoo.sh/faq#install_dependencies>`_。这也适用于需要系统软件包进行编译的 Python 模块和第三方 Odoo 模块。

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

例如,要在您的模块中使用`Unidecode 库<https://pypi.org/project/Unidecode>`_

  1. 在存储库的根文件夹中创建文件requirements.txt

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

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

  2. 在文件中添加:

    unidecode
    
  3. 您现在可以在模块中使用该库,例如,从模型的名称字段中删除字符的重音符号。为此,打开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文件。