问题描述
menifest 文件中有一个选项可以在模块安装过程中调用方法。我们可以提到 pre_init
和 post_init
。
我想在升级模块时调用一种方法,类似于 pre_init。因为安装模块后,pre_init 不会被调用。
对此有什么建议吗?
为什么我需要这个......
我有一个使用 postgresql 存储过程的存储过程来快速生成报告数据,现在当过程中有细微的变化时,我想在模块升级过程中更新它。
在升级模块期间应该有一些选项可用于调用方法,例如pre_init
和post_init
。
我尝试了以下方法来做到这一点。
# Added following code in XML file
<function model="sale.order" name="action_custom_method"/>
@api.model
def action_custom_method(self):
# stored procedure code
return True
但这对我不起作用,我正在使用 odoo 14。
解决方法
在 Odoo 14 中,它变成了 pre_init_hook
和 post_init_hook
。这将在 __manifest__.py
{
'pre_init_hook': pre_init_hook_method,'post_init_hook': post_init_hook_method,}
您还在 __init__.py
中添加方法定义
def pre_init_hook_method(cr):
env = api.Environment(cr,SUPERUSER_ID,{}) # to get env
def post_init_hook_method(cr,registry):
env = api.Environment(cr,{}) # to get env
您也可以使用 migrations
文件夹和模块版本控制,就像那里提到的那样 Data Migration
所以在你的模块文件夹中你会有一个 migration
文件夹。如下结构:
<moduledir>
`-- migrations
|-- 1.0
| |-- pre-update_table_x.py
| |-- pre-update_table_y.py
| |-- post-create_plop_records.py
| |-- end-cleanup.py
| `-- README.txt # not processed
|-- 12.0.1.1 # processed only on a 12.0 server
| |-- pre-delete_table_z.py
| `-- post-clean-data.py
|-- 0.0.0
| `-- end-invariants.py # processed on all version update
因此,如果您的模块之前使用 12.0.1.1
之类的版本定义。您可以增加一个数字,使其类似于 12.0.1.2
中的 __manifest__.py
。稍后在您的 migration
文件夹中添加一个新文件夹 12.0.1.2
。您可以在其中添加 pre-
或 post-
python 文件。这将包括您的存储过程定义。另请注意,文件夹 0.0.0
将始终运行。如果那不起作用,那可能是其他问题。
如果您遇到任何问题,请随时告诉我们。
最后,我得到了解决方案。
我们创建了一个 .sql
文件,并将所有存储过程和其他数据库对象添加到该文件中。
我们在 __manifest__.py
'data': [
'db_function/get_product_sales_history_data.sql','db_function/update_product_sales_history.sql',],
它会在模块安装时以及模块升级时执行这些sql文件。