Odoo 14 CE 中的可选依赖项
Posted
技术标签:
【中文标题】Odoo 14 CE 中的可选依赖项【英文标题】:Optional Dependencies in Odoo 14 CE 【发布时间】:2021-11-30 17:08:53 【问题描述】:有什么方法可以在 Odoo 14 CE 中创建可选依赖项?
我知道清单文件中有一个依赖属性需要我们指定,是的,我一直在尽我所能使用它。
但是,有时我需要仅在安装模块时编写一些代码,但即使没有,其余代码也应该在没有此类模块的情况下正常运行。
例如,我的自定义模块将在sale
和account
中添加一个字段,但如果此数据库安装了purchase
,那么它也会在其中添加一个字段。很简单的概念,对,但我找不到在单个模块中实现它的方法。
【问题讨论】:
有趣的问题!有时我们使用类似基本模块的概念(基本功能,并且尽可能减少对其他模块的依赖)并为 odoo 应用程序(如销售、帐户等)集成模块。在那些集成模块上,您可以设置正确的依赖项并将auto_install
设置为 True
,这将告诉 Odoo,如果每个依赖项都已安装,则安装该模块。
@CZoellner 所以这必须是一个不同的模块。我希望只有一个模块。
是的,这就是为什么我没有把我的想法写成答案,而是写成评论;-)
@holydragon 你可以使用钩子和自定义字段来做到这一点。
@Kenly 你能详细说明一下吗?我以前从未使用过钩子,或者我可能使用过它但我不知道但钩子是。
【参考方案1】:
您可以使用模块安装后立即执行的post_init_hook 来检查purchase
(purchase.order
在注册表中)模块是否已安装并添加自定义字段。您甚至可以使用转换和导入 XML 文件的convert_xml_import 函数通过继承加载 XML 文件以添加自定义字段。
类似于手动将字段添加到相应的模型和视图中。
当您卸载模块时,自定义字段不会被删除,为此您需要使用uninstall_hook
,由于以下用户错误,您还需要手动删除视图:
用户错误 无法重命名/删除仍存在于视图中的字段 字段:purchase.order.x_reference 查看:purchase.order.form
首先在__manifest__.py
文件中设置post_init_hook
、uninstall_hook
函数:
'post_init_hook': '_module_post_init',
'uninstall_hook': '_module_uninstall_hook',
然后在__init__.py
文件中定义这些函数:
import os
from odoo import fields, api, SUPERUSER_ID, tools, modules
from odoo.tools.misc import file_open
def _module_uninstall_hook(cr, registry):
if 'purchase.order' in registry:
env = api.Environment(cr, SUPERUSER_ID, )
env.ref('***_14.purchase_order_form').unlink()
env['ir.model.fields'].search([('name', '=', 'x_reference')]).unlink()
def _module_post_init(cr, registry):
if 'purchase.order' in registry:
env = api.Environment(cr, SUPERUSER_ID, )
mp = env['ir.model'].search([('model', '=', 'purchase.order')], limit=1)
mp.write('field_id': [(0, 0,
'name': 'x_reference',
'field_description': "Reference",
'ttype': 'char',
)])
pathname = os.path.join(modules.get_module_path('***_14'), 'views', 'purchase_order.xml')
with file_open(pathname, 'rb') as fp:
tools.convert.convert_xml_import(cr, '***_14', fp)
views
内部定义的purchase_order.xml
文件使用视图继承将自定义字段添加到purchase_order_form
表单视图:
<?xml version="1.0" encoding="utf-8" ?>
<odoo>
<data>
<record id="purchase_order_form" model="ir.ui.view">
<field name="name">purchase.order.form</field>
<field name="model">purchase.order</field>
<field name="inherit_id" ref="purchase.purchase_order_form"/>
<field name="arch" type="xml">
<field name="partner_ref" position="after">
<field name="x_reference"/>
</field>
</field>
</record>
</data>
</odoo>
【讨论】:
非常好的概念和实现!以上是关于Odoo 14 CE 中的可选依赖项的主要内容,如果未能解决你的问题,请参考以下文章
Maven中的可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)