1. 模块安装
一、创建新模块
在Odoo的“addons”(存放模块的目录)目录下或者自定义创建一个新的目录来存放你的模块文件。
使用Odoo提供的odoo-bin scaffold命令来快速生成一个模块模板结构。
二、模块声明
在模块的__manifest__.py文件中进行模块声明,包括模块名、版本、描述、依赖等信息。
`'name'`: 模块的名称,这里是 "module_new"。
`'summary'`: 模块的简短摘要,通常是一句话或一行描述模块的用途。
`'description'`: 模块的详细描述,可以是多行的。
`'author'`: 模块的作者或公司,这里是 "My Company"。
`'website'`: 作者或公司的网站链接。
`'category'`: 模块的分类。这有助于在Odoo的模块列表中过滤模块。默认是 "Uncategorized",但你可以选择一个现有的分类或创建一个新的。
`'version'`: 模块的版本号,这里是 "0.1"。
`'depends'`: 一个列表,包含该模块依赖的其他模块。这里只依赖了 "base" 模块,它是Odoo的核心模块。
`'data'`: 一个列表,包含模块的数据文件。这些文件通常包含模型定义、视图定义、数据记录等。当模块被安装或更新时,这些文件会被加载。这里包含了两个XML文件:'views/views.xml' 和 'views/templates.xml'。
`'demo'`: 一个列表,包含模块的演示数据文件。这些文件通常包含用于演示功能的预定义数据。它们只在演示模式下加载。这里只有一个文件 'demo/demo.xml'。
三、模块安装
在配置文件中配置addons_path (查找和加载模块(addons)的目录路径)
1.指定的路径是正确的,并且 Odoo 有权限访问这些路径。
2.目录之间用逗号(,)分隔,不要包含空格或其他特殊字符。
3.如果你的模块依赖于其他模块,确保这些依赖的模块也在 addons_path 指定的目录中,或者它们已经被正确安装到数据库中。
4.当Odoo启动时,它会按照addons_path中指定的顺序扫描和加载模块。因此,如果多个模块有相同的名称和功能,但位于不同的路径中,那么先被加载的模块将覆盖后面的模块。
在命令行中运行 Odoo,可以使用 --addons-path 参数来指定:
python-odoo -d mydb --addons-path="D:\odoo17\odoo17ed\custom"
在Odoo的应用列表中,启用你的自定义模块,或者通过命令行使用odoo-bin update apps list和odoo-bin upgrade -d your_database_name your_module_name命令来更新和升级模块。
在运行配置中,使用--update="module" 设置自动更新模块
初始化数据库-i base -d mydb
四、注意事项
a. 权限问题
在Linux系统上,确保你有足够的权限来安装和运行Odoo及其模块。
b. 版本兼容性
确保你安装的Python版本、PostgreSQL版本和Odoo版本是相互兼容的。
c. 依赖关系
在安装模块之前,确保所有必需的依赖项都已正确安装和配置。
d. 错误处理
在安装和配置过程中,仔细阅读并理解错误信息,根据提示进行相应的修复和调整。
2. 模块结构
初始化文件 (__init__.py)
功能:将文件夹变为一个Python模块,并初始化模块。
内容:可能包含导入模块其他部分的代码。
模块清单文件 (__manifest__.py)
功能:声明一个Python包为Odoo模块,并定义模块的元数据。
内容:
name: 模块名称。
version: 模块版本。
author: 模块作者。
website: 模块网站。
description: 模块描述。
category: 模块分类。
depends: 依赖的模块列表。
模型定义 (models 文件夹)
功能:包含模块的数据模型定义。
内容:通常是Python文件,定义了模型的类、字段、方法和约束。
视图定义 (views 文件夹)
功能:定义模块的界面布局和数据展示方式。
内容:通常是XML文件,定义了表单视图、列表视图、图表视图等。
静态资源 (static 文件夹)
功能:包含模块的静态资源文件。
内容:如JavaScript、CSS、图片等文件,用于定制模块的外观和行为。
安全性配置 (security 文件夹)
功能:定义了用户权限和访问控制规则。
内容:XML文件,用于定义访问权限、记录规则等。
演示数据 (demo 文件夹)
功能:包含模块的演示数据,用于在安装模块时初始化数据库。
内容:XML或CSV文件,包含用于演示的数据记录。
测试文件 (tests 文件夹)
功能:包含模块的测试文件,用于对模块进行单元测试和集成测试。
内容:Python文件,包含测试用例和测试数据。
控制器 (controllers 文件夹)
功能:包含模块的控制器代码,处理用户请求并返回响应。
内容:Python文件,定义了处理HTTP请求的类和函数
。
其他文件和文件夹
controllers_actions: 可能包含与控制器相关的动作定义。
data: 初始化数据文件目录,可能包含XML或CSV文件用于初始化数据。
i18n: 语言文件夹,包含模块的翻译文件。
report: 报表文件夹,包含报表模型和视图文件。
wizard: 向导文件夹,包含与数据库表相关的向导定义。
doc: 模块说明文档目录。
一、物理结构
1.根目录:模块名称命名的文件夹,包含模块的所有文件和子文件夹。
2.核心文件:__init__.py和__manifest__.py文件位于模块根目录下。
3.子文件夹:每个逻辑结构中的主要部分(如models、views、static等)对应一个子文件夹,位于模块根目录下。
4.文件内容:每个子文件夹中包含与其功能相对应的文件,如Python文件、XML文件、CSS文件等。
物理结构强调模块在文件系统中的实际存在和布局,关注如何组织文件以方便管理和维护。
二、逻辑结构
1.初始化与元数据:__init__.py和__manifest__.py文件,用于初始化模块和定义模块的元数据信息。
2.业务逻辑:models文件夹,包含模块的数据模型定义和业务逻辑。
3.用户界面:views文件夹,定义模块的前端界面布局和数据展示方式;static文件夹,包含模块的静态资源文件。
4.安全性与权限:security文件夹,定义用户权限和访问控制规则。
5.演示与测试:demo文件夹包含演示数据文件;tests文件夹包含测试文件。
6.其他:包括controllers、controllers_actions、data、i18n、report、wizard和doc等文件夹,根据模块需求可能有所不同。
逻辑结构强调模块的功能性,关注如何组织代码和资源以实现业务目标。
3.数据加载
一、演示数据加载
演示数据加载主要用于为模块提供示例和测试用的数据集。这些数据通常在模块开发阶段使用,以便开发人员和用户能够直观地了解模块的功能和用法。
1.数据定义:
演示数据通常通过XML文件定义,其中包含了要加载的记录的具体信息。
XML文件中,每个<record>标签代表一个要创建的记录,id属性用于标识该记录(通常是外部标识符),model属性指定记录所属的模型。
在<record>标签内部,<field>标签用于定义记录的字段和对应的值。
2.数据加载:
演示数据在模块的__manifest__.py文件的demo字段中声明。当模块被安装或更新时,Odoo会自动加载这些演示数据。
加载过程涉及解析XML文件,并根据其中的定义在数据库中创建相应的记录。
二、默认数据加载
默认数据加载用于在模块安装时自动创建必要的初始数据。这些数据是模块正常运行所必需的,并且通常不会随着时间的推移而更改。
1.数据定义:
默认数据同样通过XML文件定义,但通常与演示数据分开。
XML文件的结构和内容与演示数据类似,但数据内容通常更为基础和固定。
2.数据加载:
默认数据在模块的__manifest__.py文件的data字段中声明。当模块被安装或更新时,Odoo会自动加载这些默认数据。
加载过程与演示数据类似,但通常只会在模块首次安装时执行一次。
三、注意事项
数据文件的命名和位置:数据文件(XML文件)应放置在模块的相应目录下,并在__manifest__.py文件中正确引用。
外部标识符:在XML文件中,可以使用外部标识符(external identifiers)来唯一标识数据库中的记录。这些标识符可以在Odoo的Web设置中查看和管理。
数据迁移和更新:当模块进行更新时,可能需要添加、修改或删除某些数据。在这种情况下,应谨慎处理数据迁移和更新逻辑,以确保现有数据的完整性和一致性。
安全性:在加载数据时,应始终注意安全性问题。确保只加载受信任的数据源,并避免在XML文件中包含敏感信息(如密码或密钥)。
4.钩子
钩子(Hooks)是一种在特定时间点或特定事件发生时执行自定义代码的机制。它们允许开发者在不修改核心代码的情况下,为Odoo添加自定义功能或扩展现有功能。以下是关于Odoo钩子的一些关键点和常见用法:
一、钩子的类型
pre_init_hook:在安装模块之前触发。这可以用于在模块安装之前执行一些预处理操作,如检查依赖项或准备数据。
post_init_hook:在模块安装之后触发。这可以用于在模块安装后执行一些初始化或配置操作,如创建默认数据或设置权限。
uninstall_hook:在卸载模块时触发。这可以用于在模块卸载前执行一些清理操作,如删除临时文件或回收资源。
_register_hook:在模型注册后触发。这允许开发者在模型加载到Odoo系统中后执行自定义代码,如设置监听器或执行其他初始化任务。
二、钩子的使用
定义钩子:在Odoo模块的__init__.py或models.py文件中定义钩子函数。这些函数应满足特定的命名和参数要求,以便Odoo能够正确识别和调用它们。
注册钩子:在模块的__manifest__.py文件中注册钩子。这通常通过指定一个字符串值(即钩子函数的名称)来完成,该值对应于在__init__.py或models.py中定义的钩子函数。
编写自定义代码:在钩子函数内部编写自定义代码,以在钩子触发时执行所需的操作。这些代码可以执行各种任务,如创建记录、更新字段值、发送通知等。
三、钩子的示例
以post_init_hook为例,以下是一个简单的示例:
在这个示例中,add_book_hook函数将在模块安装后被调用,它创建了两本新书记录。通过这种方式,开发者可以在不修改核心代码的情况下为Odoo添加自定义功能。
四、注意事项
确保钩子函数的命名和参数与Odoo的要求一致,以便正确触发和执行。
在编写钩子代码时,遵循Odoo的开发规范和最佳实践,以确保代码的健壮性和可维护性。
在使用钩子时,要谨慎处理与其他模块或系统的交互,以避免潜在的问题或冲突。
5. 安装/升级/卸载过程
一、模块安装
1.更新模块列表
在安装或更新Odoo模块之前,系统会首先更新模块列表,确保识别到所有可用的模块及其版本。
2.构建模块依赖关系
Odoo会检查每个模块的依赖关系,这通常通过模块的__manifest__.py文件中的depends字段来声明。
3.执行 pre-init hook
Odoo会检查每个模块的依赖关系,这通常通过模块的__manifest__.py文件中的depends字段来声明。
系统会确定模块的加载顺序,确保按照依赖关系的层级和顺序来加载模块。
4.加载/构建model class, 创建相关的数据库结构
加载模块中的Python代码,特别是模型定义(通常位于models.py文件)。
根据模型定义,创建或更新数据库结构,包括表、字段、索引等。
5.加载数据,以及演示数据
如果模块包含XML数据文件(通常位于data目录下),系统会加载这些数据,以创建或更新数据库中的记录。
可能包括默认数据、演示数据或初始化数据。
6.执行 post-init hook
模块安装完成后,如果模块的__manifest__.py文件中定义了post_init_hook,系统会执行这个钩子函数。
post_init_hook常用于执行一些初始化或配置操作,如设置权限、创建默认菜单项等。
7.清理孤儿数据
确保数据库中不存在不再被引用的数据,从而保持数据库的整洁和性能
8.验证每个模型的视图
在模块安装或更新后,Odoo会验证每个模型的视图定义(通常位于views目录下)。
这包括XML视图定义和QWeb模板等,确保它们没有错误,并且与模型定义保持一致。
二、模块升级
1.更新模块列表:
确认需要升级或迁移的模块列表。
检查是否有新的模块需要添加到列表中,或是否有旧的模块不再需要。
2.构建模块依赖关系:
确定模块之间的依赖关系,确保在升级或迁移过程中依赖顺序正确。
如果有循环依赖,需要解决这些依赖问题。
3.执行 pre migration:
运行迁移前的准备工作,例如备份当前数据库状态、检查系统环境等。
这可以确保在迁移过程中出现问题时,可以恢复到之前的状态。
4.加载/构建 model class,创建相关的数据库结构:
根据新的或修改后的模型类(model class)生成或修改数据库结构。
这可能包括创建新表、添加新列、修改现有列或删除不再需要的表或列。
5.加载数据,以及演示数据:
如果模块包含初始数据或演示数据,将其加载到数据库中。
这可以确保在迁移后,系统可以立即使用,并为用户提供一个预配置的环境。
6.执行 post migration <升级的模块>:
在模块迁移后运行必要的操作,例如更新索引、触发器等。
这些操作可能是在模型类或数据库结构更改后必须执行的。
7.验证模块的视图:
确保模块的视图(可能是前端页面或API响应)按预期工作。
这包括检查数据是否正确显示、链接是否有效、表单是否可以正确提交等。
8.执行 end migration <每个模块>:
在每个模块迁移完成后,执行任何必要的清理或优化操作。
这可能包括删除临时文件、更新日志文件等。
9.清理孤儿数据:
查找并删除不再需要的数据,这些数据可能是由于之前的迁移或删除操作而遗留下来的。
这有助于保持数据库的清洁和高效。
10.验证每个模型的视图:
确保数据库中的每个模型都与预期的视图(无论是前端还是后端)相对应,并且它们之间的交互按预期工作。
三、模块卸载
1.更新模块列表
检查当前已安装的Python模块中哪些版本是过时的,以便进行更新。
2.构建模块依赖关系
确定项目中不同模块之间的依赖关系,以确保在更新或安装模块时不会出现依赖冲突。
3.执行 uninstall hook
根据项目的文档或源代码,找到并执行uninstall hook。
这个hook可能包含一些清理工作,如删除临时文件、更新配置文件等。
4.卸载模块
从Python环境中删除不再需要或已过时的模块。
5.刷新注册表
odoo 模块安装深入研究