如何隐藏在另一个模块中定义的"ir.actions.act_window"



非常简单的问题。在odoo/addons/portal/wizard/portal_wizard_views.xml中有以下操作:

<act_window id="partner_wizard_action"
name="Grant portal access"
binding_model="res.partner"
res_model="portal.wizard"
view_mode="form" target="new"
groups="base.group_partner_manager"/>

我该如何隐藏它??

更多信息

我看到的其他答案建议完全取消链接记录,但我不仅无法找到最好的方法,最重要的是,我希望以这样的方式删除该操作,这样,如果我的模块被卸载,该操作将再次显示,就好像什么都没发生过一样。我不希望我的模块对其他模块做任何需要重新安装的事情。特别是在这种情况下,由于portal模块依赖于saleaccount以及其他关键模块。

我还看到了一些答案,建议使用相同的id重新定义记录,但以其他模块的名称为前缀,以覆盖操作。在这种情况下,我想这看起来像这样:

<act_window id="portal.partner_wizard_action"
name="Grant portal access 2"
binding_model="res.partner"
res_model="portal.wizard"
view_mode="form" target="new"
groups="base.group_partner_manager"/>

然而,我甚至无法让它发挥作用。它不会替换上下文菜单中的现有操作;相反,它只是添加了一个新的操作,导致现在有两个(都是"授予门户访问权限"one_answers"授予门户网站访问权限2"(。我也不确定用这种方法该如何隐藏这个动作。

编辑:我发现由于某种未知的原因,我的Odoo实例中的原始操作不再具有外部ID;被覆盖";当我试图重新定义记录时。我通过卸载自定义模块,删除这两个操作,然后更新门户模块来解决此问题。这导致操作被重新创建,外部ID再次出现,当我重新安装我的自定义模块时,我可以覆盖它。

然而,这并不能解决我在";非破坏性的";方法当我卸载自定义模块时,它对操作所做的更改将一直存在,直到原始portal模块再次升级。这很糟糕,因为卸载自定义模块的人需要知道必须升级portal模块才能恢复一些更改。

我想明白了。。。有点。

首先,由于某种原因,在我的案例中,来自portal模块的原始partner_wizard_action不知何故丢失了它的外部ID/ref/xml_ID。我不知道这是怎么发生的,但为了解决它,我不得不卸载我的自定义模块,删除";授予门户访问权限";动作和";授予入口访问2";动作,然后升级portal模块。这用正确的外部ID重新创建了partner_wizard_action

然后,我可以用以下代码覆盖预期的操作:

<record id="portal.partner_wizard_action" model="ir.actions.act_window">
<field name="binding_model_id" eval="False"/>
</record>

这将解除操作与res.partner模型的绑定,导致操作不再显示在上下文菜单中。然而,它仍然存在。

这个"解决方案";然而,随之而来的是一个巨大的警告当我现在卸载自定义模块时,操作不会恢复到被覆盖之前的状态。因此,除非portal模块再次明确升级,否则它仍将被隐藏。

为了解决这个问题,我正在考虑在模块清单中编写一个uninstall_hook,以将操作的binding_model_id设置回正确的值。然而,似乎没有更好的方法来做到这一点,这太糟糕了。

编辑:在模块卸载时,我使用以下uninstall_hook:成功地恢复了操作

from odoo import api, SUPERUSER_ID
def uninstall_hook(cr, registry):
env = api.Environment(cr, SUPERUSER_ID, {})
env.ref("portal.partner_wizard_action").binding_model_id = env.ref("base.model_res_partner").id

如果您不知道,您可以将此函数放在模块根目录的__init__.py中,然后将"uninstall_hook": "uninstall_hook"添加到__manifest__.py文件中。

要隐藏操作,可以:

1-将绑定模型(binding_model_id(设置为False

2-添加一个没有用户的组,以便将以下表达式计算为True:

action_groups and not action_groups & user_groups

3-添加active字段(默认值=True(以隐藏搜索中的操作,然后更改_get_bindings方法(因为操作是使用SQL查询获取的)并将where子句更改为:

where m.model = %s and active is true

4-也可以更改fieds_view_get方法来过滤工具栏操作

添加组可能需要在模块卸载后恢复更改