非常简单的问题。在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
模块依赖于sale
和account
以及其他关键模块。
我还看到了一些答案,建议使用相同的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方法来过滤工具栏操作
添加组可能需要在模块卸载后恢复更改