使用场景
- 在odoo中,我们想在安装模块中。或者在卸载模块之后触发一些功能。我们可以使用hook来做。
安装时的基本流程为
1.若有preinit钩子,先运行
2.从模型定义中载入Python源码并根据需要更新数据库结构
3.载入插件数据文件并更新数据库
4.若有demo数据则进行安装
5.若有postinit钩子,则运行
6.对插件的视图定义进行验证
7.若激活了测试数据和测试流程,则对插件进行测试
8.更新数据库中的模块状态
9.根据插件的翻译文件更新数据库
以上preinit钩子和postinit钩子分别通过manifest.py中的pre_init_hook和post_init_hook进行定义,对应值为init.py中的函数名。在更新插件时要注意新增的依赖需要手动进行安装。
此段转载https://alanhou.org/odoo-11-addons/
三种hook
- pre_init_hook
在安装中如果有manifest中有,先执行此对应的钩子函数。 - post_init_hook
在安装好模块之后,会执行对应的函数。
在manifest中添加:
'post_init_hook': 'post_init_hook',
在init.py中写对应的方法。
def post_init_hook(cr, registry):
env = Environment(cr, SUPERUSER_ID, {})
menu_id = env.ref('base.menu_native').id
env.ref('account.menu_finance').write({'parent_id': menu_id})
- uninstall_hook
在卸载模块之后,会执行对应的函数。
在manifest.py中添加:
'uninstall_hook': 'uninstall_hook',
在init.py中写对应的方法
def uninstall_hook(cr, registry):
env = Environment(cr, SUPERUSER_ID, {})
# 卸载之后改变核销分录action动作binding_model_id
account_move_line = env.ref('account.model_account_move_line').id
account_move_line_reconcile = env.ref('account.action_view_account_move_line_reconcile').id
cr.execute("update ir_actions set binding_model_id= %s where id=%s", (account_move_line, account_move_line_reconcile))
此方法意思是在卸载模块之后,回写被删除的动作。