你的第一个模块

概览

本章节将帮助您创建第一个Odoo模块并在您的Odoo.sh项目中部署它。

本教程需要 你在Odoo.sh上创建了一个项目,并且你知道你的Github仓库的URL。

解释了Git和Github的基本使用。

以下假设已经做出:

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

  • odoo 是 Github 用户,

  • odoo-addons 是 Github 仓库,

  • feature-1 是一个开发分支的名称,

  • master 是生产分支的名称,

  • my_module 是模块的名称。

将这些替换为您选择的值。

创建开发分支

来自Odoo.sh

在分支视图中:

  • 点击开发阶段旁边的 + 按钮,

  • Fork 选项中选择分支 master

  • To 输入框中输入 feature-1

    |图片1| |图片2|

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

../../../_images/firstmodule-development-editor.png ../../../_images/firstmodule-development-editor-interface.png

从您的电脑

在您的计算机上克隆您的 Github 存储库:

$ mkdir ~/src
$ cd ~/src
$ git clone https://github.com/odoo/odoo-addons.git
$ cd ~/src/odoo-addons

创建一个新分支:

$ git checkout -b feature-1 master

创建模块结构

搭建模块

虽然不是必需的,但脚手架可以避免设置基本的Odoo模块结构的乏味过程。您可以使用可执行文件 odoo-bin 来搭建一个新的模块。

从Odoo.sh编辑器中的终端:

$ odoo-bin scaffold my_module ~/src/user/

Or, from your computer, if you have an installation of Odoo:

$ ./odoo-bin scaffold my_module ~/src/odoo-addons/

如果您不想在计算机上安装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
└── views
    ├── templates.xml
    └── views.xml

警告

模块名称不要使用除了下划线(_)以外的特殊字符,甚至不要使用连字符(-)。这个名称用于您的模块的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',
    

手动

如果您想手动创建模块结构,您可以按照 开始 教程来了解模块的结构和每个文件的内容。

推送开发分支

暂存要提交的更改

$ git add my_module

提交您的更改

$ git commit -m "My first module"

将您的更改推送到远程存储库

从 Odoo.sh 编辑器终端:

$ git push https HEAD:feature-1

上述命令在 提交和推送您的更改 章节中有解释。该章节位于 在线编辑器 一章中。它包括了关于您将被提示输入用户名和密码的解释,以及如果您使用双因素身份验证应该怎么做。

或者,从您的计算机终端:

$ git push -u origin feature-1

你只需要在第一次推送时指定 -u origin feature-1 。从那时起,你可以简单地使用该命令从你的电脑推送未来的更改。

$ git push

测试你的模块

你的分支应该出现在你的项目的开发分支中。

../../../_images/firstmodule-test-branch.png

在您的项目的分支视图中,您可以单击左侧导航面板中的分支名称以访问其历史记录。

../../../_images/firstmodule-test-branch-history.png

您可以在这里看到您刚刚推送的更改,包括您设置的注释。 一旦数据库准备好,您可以通过点击 连接 按钮来访问它。

../../../_images/firstmodule-test-database.png

如果您的Odoo.sh项目已配置为自动安装您的模块,则您将直接在数据库应用程序中看到它。否则,它将在可安装的应用程序中提供。

您可以随意操作您的模块,创建新记录并测试您的功能和按钮。

使用生产数据进行测试

在此步骤中,您需要拥有一个生产数据库。如果您还没有,可以创建一个。

一旦您在开发环境中使用演示数据测试了您的模块并认为它已准备就绪,您可以使用暂存分支测试生产数据。

你可以选择:

  • 将您的开发分支变为暂存分支,通过将其拖放到 暂存 部分标题上。

    ../../../_images/firstmodule-test-devtostaging.png
  • 将其合并到现有的暂存分支中,通过将其拖放到指定的暂存分支上。

    ../../../_images/firstmodule-test-devinstaging.png

您还可以使用 git merge 命令来合并您的分支。

这将创建一个新的暂存构建,它将复制生产数据库并使用更新了您分支的最新更改的服务器运行。

../../../_images/firstmodule-test-mergedinstaging.png

一旦数据库准备好,您可以使用 Connect 按钮访问它。

安装您的模块

您的模块不会自动安装,您需要从应用程序菜单中安装它。事实上,暂存构建的目的是测试您的更改行为,就像在生产环境中一样,您不希望您的模块自动安装,而是按需安装。

你的模块可能不会直接出现在应用程序中,你需要先更新应用程序列表:

  • 激活 开发者模式

  • 在应用菜单中,点击 更新应用列表 按钮,

  • 在弹出的对话框中,点击 更新 按钮。

    ../../../_images/firstmodule-test-updateappslist.png

然后您的模块将出现在可用应用程序列表中。

../../../_images/firstmodule-test-mymoduleinapps.png

部署到生产环境

一旦您在带有生产数据的暂存分支中测试了您的模块,并且认为它已经准备好投入生产,您可以将您的分支合并到生产分支中。

将您的暂存分支拖放到生产分支上。

../../../_images/firstmodule-test-mergeinproduction.png

您还可以使用 git merge 命令来合并您的分支。

这将合并您的暂存分支中的最新更改到生产分支中,并使用这些最新更改更新您的生产服务器。

../../../_images/firstmodule-test-mergedinproduction.png

一旦数据库准备好,您可以使用 Connect 按钮访问它。

安装您的模块

您的模块不会自动安装,您需要按照 上面关于在暂存数据库中安装您的模块的部分 的说明手动安装。

添加一个变更

本节将介绍如何通过在模型中添加新字段并部署来在您的模块中添加更改。

从Odoo.sh编辑器中,
  • 浏览到您的模块文件夹 ~/src/user/my_module

  • 然后,打开文件 models/models.py

或者,从您的电脑中,
  • 使用您选择的文件浏览器浏览到您的模块文件夹 ~/src/odoo-addons/my_module,

  • 然后,使用您选择的编辑器打开文件 models/models.py ,例如 AtomSublime TextPyCharmvim ,…

然后,在描述字段之后

description = fields.Text()

添加日期时间字段

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

然后,打开文件 views/views.xml

之后

<field name="value2"/>

添加

<field name="start_datetime"/>

这些更改通过在表中添加列和修改存储在数据库中的视图来改变数据库结构。

为了应用于现有数据库,例如您的生产数据库,这些更改需要更新模块。

如果您希望在推送更改时,Odoo.sh 平台自动执行更新,请在模块清单中增加模块版本。

打开模块清单文件 __manifest__.py.

替换

'version': '0.1',

'version': '0.2',

平台将检测版本变化并在新版本部署时触发模块的更新。

浏览到您的 Git 文件夹。

然后,在 Odoo.sh 终端中执行以下命令:

$ cd ~/src/user/

或者,从您的计算机终端:

$ cd ~/src/odoo-addons/

然后,将您的更改暂存以进行提交

$ git add my_module

提交您的更改

$ git commit -m "[ADD] my_module: add the start_datetime field to the model my_module.my_module"

推送您的更改:

从Odoo.sh终端:

$ git push https HEAD:feature-1

或者,从您的计算机终端:

$ git push

平台将为分支 feature-1 创建一个新的构建。

../../../_images/firstmodule-test-addachange-build.png

一旦您测试了您的更改,您可以将更改合并到生产分支中,例如通过在Odoo.sh界面中将分支拖放到生产分支上。由于您在清单中增加了模块版本,平台将自动更新模块,您的新字段将直接可用。否则,您可以在应用程序列表中手动更新模块。

使用外部 Python 库

如果您想使用一个默认未安装的外部Python库,您可以定义一个 requirements.txt 文件,列出您的模块所依赖的外部库。

注解

  • 在Odoo.sh数据库上不可能安装或升级系统包(例如apt包)。然而,在特定条件下,可以考虑安装包。这也适用于 Python模块 需要系统包进行编译以及 第三方Odoo模块

  • PostgreSQL 扩展 在 Odoo.sh 上不受支持。

  • 更多信息,请参阅我们的 FAQ

平台将使用此文件自动安装您的项目所需的Python库。

在本节中,通过在您的模块中使用 Unidecode library 来解释该功能。

在您的存储库的根文件夹中创建一个名为 requirements.txt 的文件

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

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

添加

unidecode

然后在您的模块中使用该库,例如从您模型的名称字段中删除字符的重音符号。

打开文件 models/models.py.

之前

from odoo import models, fields, api

添加

from unidecode import unidecode

之后

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)

添加一个Python依赖项需要增加模块版本,以便平台可以安装它。

编辑模块清单 __manifest__.py

替换

'version': '0.2',

'version': '0.3',

暂存并提交您的更改:

$ git add requirements.txt
$ git add my_module
$ git commit -m "[IMP] my_module: automatically remove special chars in my_module.my_module name field"

然后,推送您的更改:

在 Odoo.sh 终端中:

$ git push https HEAD:feature-1

在您的计算机终端中:

$ git push