本章主要介绍肖odoo实例添加用户自定义的模块。你可以从多个路径载入模块。但是建议你将自己的模块儿放在特定的目录当中,避免与odoo的核心模块混淆。

在这一章节,中我们主要涉及以下内容:

  • 配置插件路径。
  • 标准化实例目录结构。
  • 安装和更新本地模块。
  • 从github安装模块。
  • 生效模块的改变。
  • 应用和尝试拉起最新请求。

术语

我们使用的add-on(插件)或者module(模块)或者app(应用)或者add-on module(插件模块)指的是安装在odoo中,由odoo调用并完成特定业务的单元。类似于python中的包。

配置add-ons路径

在odoo.conf中,我们很方便的配置模块路径,当数据库初始化的时候,odoo将查找这些路径下的模块。

准备

  • odoo.conf
  • odoo实例

步骤

  1. 编辑配置文件,odoo.conf
  2. 定位配置文件中的路径参数

addons_path=默认路径

  1. 修改路径

addons_path=路径1, 路径2

  1. 重启应用实例
$ ./odoo-bin -c odoo.conf

原理

重启Odoo时,读取配置文件。addons_path变量的值应该是用逗号分隔的目录列表。可以接受相对路径,但它们是相对于当前工作目录的,因此应该避免在配置文件中使用。

小贴士

若odoo的实例启动后,添加了新的模块,那么需要点击UI上的 更新 。参见“更新模块列表”那一章节的内容

更多

当您第一次调用odoo-bin脚本来初始化一个新的数据库时,您可以传递——addons-path命令行参数,并用逗号分隔目录列表。这将初始化可用的附加组件模块列表以及在提供的附加组件路径中找到的所有附加组件。当你这样做的时候,你必须显式包含基本的附加组件目录(odoo/odoo/addons),以及核心的附加组件目录(odoo/addons)。与前面的配方稍有不同的是,本地add-ons不能为空;它们必须包含至少一个子目录,该目录具有附加模块的最小结构。


规范化实例目录布局

在开发中,最好保持生产及开发环境相同。绝对可以让你少踩坑。

步骤

  1. 创建新目录
$ mkdir ~/odoo-dev/projectname
$ cd ~/odoo-dev/projectname
  1. 创建python的虚拟环境
$ python3 -m venv env
  1. 创建一些子目录
$ mkdir src local bin filestore logs
  • src/: 这个目录包含odoo以及其他第三方的代码。
  • local/:这里包含我们开发的模块。
  • bin/: 这里包含一些执行脚本。
  • fielstore/: 这是用于文件存储的。
  • logs:/这是用于存储服务日志的。
  1. clone odoo及安装必要的包
$ git clone -b 14.0 --single-branch --depth 1 https:// github.com/odoo/odoo.git src/odoo
$ env/bin/pip3 install -r src/odoo/requirements.txt
  1. 将如下代码写入 bin/odoo文件:
#!/bin/sh ROOT=$(dirname $0)/..
PYTHON=$ROOT/env/bin/python3 ODOO=$ROOT/src/odoo/odoo-bin
$PYTHON $ODOO -c $ROOT/projectname.cfg "$@" exit $?
  1. 授予可执行权限:
$ chmod +x bin/odoo
  1. 创建空的本地模块:
$ mkdir -p local/dummy
$ touch local/dummy/ init .py
$ echo '{"name": "dummy", "installable": False}' >\ local/dummy/ manifest .py
  1. 生成配置文件:
$ bin/odoo --stop-after-init --save \
--addons-path src/odoo/odoo/addons,src/odoo/addons,local \
--data-dir filestore
  1. 添加.gitignore文件
# dotfiles, with exceptions:
.*
!.gitignore
# python compiled files
*.py[co]
# emacs backup files
*~
# not tracked subdirectories
/env/
/src/
/filestore/
/logs/
  1. 初始化git库
$ git init
$ git add .
$ git commit -m "initial version of projectname"

原理

我们组织了一个干净的目录,并为其分配给不同的角色。

  • 其他人的代码(src/)
  • 本地模块代码(local/)
  • 实例的存储的文件(filestore/)

    为每一个项目创建虚拟环境可避免项目依赖间的干扰。

    我们为每一个项目创建单独的odoo的副本及第三方的模块,可有效避免很多坑。

    bin/odoo脚本可以方便我们,省的记住各种路径及激活虚拟环境。脚本可以根据自己的实际情况自行调整。以上可以生成odoo的配置文件。

安装和更新本地模块

odoo的核心就是各式各样的模块,有odoo官方的,有第三方的。

在这一章节中,我们将学习如何通过web页面或者命令行安装和升级模块。

通过命令行操作的优势在于可以一次性操作多个模块,且在操作的过程中,可实时看到日志信息。

准备

可用的odoo实例

步骤

通过页面

  1. 使用Administrator账户登录并进入Apps菜单

  2. 搜索目标模块

  3. 点击 install 按钮即可。

    注意,有时odoo包需要额外的python包。但是相关依赖还没有安装,那么将会有如下报错。

    通过pip安装即可。

    更新模块方法类似,不详细列了。

    通过命令行

  4. 确定模块的名称,就是写在__manifest__.py文件中的key为name的名称。

  5. 停用实例。

  6. 如下命令

$ odoo/odoo-bin -c instance.cfg -d dbname -i addon1,addon2 \
--stop-after-init
  1. 重启实例。

    更新模块方法类似,通过如下命令
$ odoo/odoo-bin -c instance.cfg -d dbname -u addon1 \
--stop-after-init

原理

安装和更新是非常相近的过程,但是却有一些比较重要的区别。

模块安装

当我们在安装模块时,odoo会检查尚未安装的模块列表。odoo还会检查模块所依赖的模块,如果有的话,odoo会递归的安装这些模块。

安装步骤如下:

  1. 如果有的话,运行preinit hook函数。
  2. 载入模块信息并更新表结构。
  3. 载入数据文件并更新数据库中的内容。
  4. 安装模块的演示数据(如果配置了演示数据)
  5. 如果有的话,运行postinit hook函数。
  6. 运行视图的检查。
  7. 如有激活了演示数据,并且test=enable,那么将运行模块的tests。
  8. 更新模块的状态。
  9. 更新模块的翻译信息。

小贴士

preinit和postinit钩子函数定义在__manifest__.py文件中,使用pre_init_hook和post_init_hook的key。value为函数名。详情见第三章,创建odoo模块章节。

模块更新

当我们更新模块时,odoo将检查已安装的列表。odoo将检查这些模块的反向依赖。如有的话,也将更新这些模块。

更新步骤如下:

  1. 运行模块的pre-migration(详见第六章,管理模型数据)
  2. 载入模块信息并更新表结构。
  3. 载入数据文件并更新数据库中的内容。
  4. 安装模块的演示数据(如果配置了演示数据)
  5. 如果配置了迁移函数,那么将运行模块的post-migration。
  6. 运行视图的检查。
  7. 如有激活了演示数据,并且test=enable,那么将运行模块的tests(第十八章,自动测试)
  8. 更新模块的状态。
  9. 更新模块的翻译信息。

小贴士

更新未安装的模块将会忽略。但是安装已安装过的模块,将可能导致潜在的坑。比如,有些数据在使用中进行了调整,但是在再次安装的时候,可能就会被还原。但是通过web页面就没有这个风险了。

更多

小心处理依赖关系的模块。A依赖于B,若B更新,则A也会更新。但是若A更新,B是不会更新的。

从github安装模块

  1. git clone 下来
  2. 配置odoo.cnf中的addons-path
  3. 执行安装即可

更新模块的修改

准备

假设我们已经安装了github的partner_contact_gender,我们收到该模块在odoo14.0版本下的问题修复。

步骤

为了应用来自github的更新,操作如下

  1. 使用使用该模块的实例
  2. 备份实例(详见第一章中的管理数据库章节)
  3. 进入partner-contact模块所在目录
  4. 添加本地tag,以方便进行回退
$ git checkout 14.0
$ git tag 14.0-before-update-$(date --iso)
  1. 拉取最新的代码
$ git pull --ff-only
  1. 更新模块
  2. 重启实例

原理

通常模块开发者发布最新版的模块,包含bug修复及新功能。在这,我们获取到一个新版本并更新。

如果git pull --ff-only失败,则可以回退到上一个版本。

$ git reset --hard 14.0-before-update-$(date --iso)

然后,你可以通过git pull(去掉--ff-only),如果有合并冲突,说明你本地修改了部门内容。

Applying and trying proposed pull requests

【odoo14】第二章、管理odoo实例的更多相关文章

  1. 【Odoo 8开发教程】第二章:Odoo生产环境部署设置

    转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/10792977.html 一:dbfilter 数据库访问规则设置 一个odoo实例可以连接到不同的数据库实例中 ...

  2. 第二章 Odoo 12开发之开发环境准备

    在更深入了解 Odoo 开发之前,我们应配置好开发环境并学习相关的基础管理任务.本文中,我们将学习创建 Odoo 应用所需用到的工具和环境配置.这里采用 Ubuntu 系统来作为开发服务器实例的主机, ...

  3. HttpClient学习研究---第二章:连接管理

    第二章.Connection management连接管理2.1. 2.1.Connection persistence连接持久性The process of establishing a conne ...

  4. CISA 信息系统审计知识点 [第二章. IT治理和管理 ]

    第二章.  IT治理和管理 1.  IT治理.管理.安全和控制框架及标准.指南和实践 IT治理是董事会和执行管理层的职责. IT治理的关键因素:保持与业务的战略一致,引导业务价值的实现. IT治理关注 ...

  5. Java 线程第三版 第一章Thread导论、 第二章Thread的创建与管理读书笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  6. Java 螺纹第三版 第一章Thread介绍、 第二章Thread创建和管理学习笔记

    第一章 Thread导论 为何要用Thread ? 非堵塞I/O      I/O多路技术      轮询(polling)      信号 警告(Alarm)和定时器(Timer) 独立的任务(Ta ...

  7. 第二章--MYSQL体系结构和管理

    体系结构 MySQL C/S模型 Server : mysqld Client : socket:仅本地连接使用 tcp/ip:应用连接使用(远程和本地) #TCP/IP方式(远程.本地) mysql ...

  8. 《Django By Example》第二章 中文 翻译 (个人学习,渣翻)

    书籍出处:https://www.packtpub.com/web-development/django-example 原作者:Antonio Melé (译者注:翻译完第一章后,发现翻译第二章的速 ...

  9. Jenkins入门系列之——02第二章 Jenkins安装与配置

    2014-12-08:已不再担任SCM和CI的职位,Jenkins的文章如无必要不会再维护. 写的我想吐血,累死了. 网页看着不爽的,自己去下载PDF.有问题请留言! Jenkins入门系列之——03 ...

随机推荐

  1. 命令提示符CMD下切换用户

    工作中遇到需要在windows环境中命令提示符下切换为Guest用户执行程序,类似Linux中的su操作. 操作步骤如下:1.用管理员权限运行cmd.2:执行命令:runas /user:userna ...

  2. leetcode 39 dfs leetcode 40 dfs

    leetcode 39 先排序,然后dfs 注意先整全局变量可以减少空间利用 class Solution { vector<vector<int>>ret; vector&l ...

  3. Leetcode(10)-正则表达式匹配

    给定一个字符串 (s) 和一个字符模式 (p).实现支持 '.' 和 '*' 的正则表达式匹配. '.' 匹配任意单个字符. '*' 匹配零个或多个前面的元素. 匹配应该覆盖整个字符串 (s) ,而不 ...

  4. CodeForces 348D Turtles(LGV定理)题解

    题意:两只乌龟从1 1走到n m,只能走没有'#'的位置,问你两只乌龟走的时候不见面的路径走法有几种 思路:LGV定理模板.但是定理中只能从n个不同起点走向n个不同终点,那么需要转化.显然必有一只从1 ...

  5. for-in循环等

    一.for-in循环 in表示从(字符串.序列等)中一次取值,又称为遍历 其便利对象必须是可迭代对象 语法结构: for 自定义的变量 in 可迭代对象: 循环体 for item in 'Pytho ...

  6. macOS & Catalina vs Big Sur

    macOS & Catalina vs Big Sur 乍一看,macOS的色彩更加丰富,最大的变化就是明亮,略带卡通风格的iOS形状的图标. 一切都变得更加圆润,感觉一切都变得更大了. 这可 ...

  7. WebSocket All In One

    WebSocket All In One WebSocket heartbeat WebSocket 心跳检测 ping pong refs xgqfrms 2012-2020 www.cnblogs ...

  8. Virtual Reality In Action

    Virtual Reality In Action VR WebXR immersive 沉浸式 https://github.com/immersive-web/webxr https://imme ...

  9. shit 牛客网

    shit 牛客网 为什么,只可以 log 一次,什么垃圾逻辑呀! https://www.nowcoder.com/test/question/e46437833ddc4c5bb79f7af7a1b7 ...

  10. Next.js & SSR & CSR & SG

    Next.js & SSR & CSR & SG getStaticPaths, getStaticProps, getServerSideProps getStaticPro ...