Odoo 14 CE 中的可选依赖项

Posted

技术标签:

【中文标题】Odoo 14 CE 中的可选依赖项【英文标题】:Optional Dependencies in Odoo 14 CE 【发布时间】:2021-11-30 17:08:53 【问题描述】:

有什么方法可以在 Odoo 14 CE 中创建可选依赖项?

我知道清单文件中有一个依赖属性需要我们指定,是的,我一直在尽我所能使用它。

但是,有时我需要仅在安装模块时编写一些代码,但即使没有,其余代码也应该在没有此类模块的情况下正常运行。

例如,我的自定义模块将在saleaccount 中添加一个字段,但如果此数据库安装了purchase,那么它也会在其中添加一个字段。很简单的概念,对,但我找不到在单个模块中实现它的方法。

【问题讨论】:

有趣的问题!有时我们使用类似基本模块的概念(基本功能,并且尽可能减少对其他模块的依赖)并为 odoo 应用程序(如销售、帐户等)集成模块。在那些集成模块上,您可以设置正确的依赖项并将 auto_install 设置为 True,这将告诉 Odoo,如果每个依赖项都已安装,则安装该模块。 @CZoellner 所以这必须是一个不同的模块。我希望只有一个模块。 是的,这就是为什么我没有把我的想法写成答案,而是写成评论;-) @holydragon 你可以使用钩子和自定义字段来做到这一点。 @Kenly 你能详细说明一下吗?我以前从未使用过钩子,或者我可能使用过它但我不知道但钩子是。 【参考方案1】:

您可以使用模块安装后立即执行的post_init_hook 来检查purchasepurchase.order 在注册表中)模块是否已安装并添加自定义字段。您甚至可以使用转换和导入 XML 文件的convert_xml_import 函数通过继承加载 XML 文件以添加自定义字段。

类似于手动将字段添加到相应的模型和视图中。

当您卸载模块时,自定义字段不会被删除,为此您需要使用uninstall_hook,由于以下用户错误,您还需要手动删除视图:

用户错误 无法重命名/删除仍存在于视图中的字段 字段:purchase.order.x_reference 查看:purchase.order.form

首先在__manifest__.py文件中设置post_init_hookuninstall_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 中的可选依赖项的主要内容,如果未能解决你的问题,请参考以下文章

webpack 中的可选依赖项

pip 需求文件中的可选依赖项

Maven中的可选依赖(Optional Dependencies)和依赖排除(Dependency Exclusions)

avro 模式中的可选数组

Python中的类/函数中的可选参数[重复]

proto 3 中的可选(重复)字段