如何有条件地为部分记录隐藏Odoo动作下拉框中的特定服务器动作
如何在Odoo中按条件隐藏特定服务器动作?
嘿,我明白你想实现的是根据分析请求(olims.analysis_request)记录的特定条件,把动作下拉框里的「Assign AR Number」服务器动作给隐藏掉对吧?我之前也处理过类似的需求,给你几个可行的方案:
方法1:使用binding_domain字段(Odoo 13及以上版本推荐)
Odoo 13之后给ir.actions.server添加了binding_domain字段,专门用来控制这个服务器动作在哪些记录上显示。你只需要在你的服务器动作定义里加上这个字段,填入对应的条件表达式就行。
比如,假设你只想在记录状态为draft的时候显示这个动作,修改后的代码如下:
<record id="ar_change_state_bulk_assign_id" model="ir.actions.server"> <field name="name">Assign AR Number</field> <field name="type">ir.actions.server</field> <field name="model_id" ref="model_olims_analysis_request"/> <field name="state">code</field> <field name="code">self.bulk_assign_ar_number()</field> <!-- 替换成你实际的代码 --> <!-- 新增:设置动作显示的条件 --> <field name="binding_domain">[('state', '=', 'draft')]</field> </record>
这样一来,只有满足binding_domain条件的记录,才会在动作下拉框里看到这个服务器动作。
方法2:通过ir.values记录控制(兼容旧版本Odoo)
如果你的Odoo版本低于13,没有binding_domain字段,可以通过创建ir.values记录来绑定动作并设置显示条件。这种方式是旧版本里控制动作可见性的标准做法:
<!-- 先定义你的服务器动作 --> <record id="ar_change_state_bulk_assign_id" model="ir.actions.server"> <field name="name">Assign AR Number</field> <field name="type">ir.actions.server</field> <field name="model_id" ref="model_olims_analysis_request"/> <field name="state">code</field> <field name="code">self.bulk_assign_ar_number()</field> </record> <!-- 再创建ir.values记录,绑定动作并设置显示条件 --> <record id="action_assign_ar_number_values" model="ir.values"> <field name="name">Assign AR Number</field> <field name="model_id" ref="model_olims_analysis_request"/> <field name="value" eval="'ir.actions.server,' + str(ref('ar_change_state_bulk_assign_id'))"/> <field name="key">action</field> <field name="key2">client_action_multi</field> <!-- 设置动作显示的条件,这里同样以state为draft为例 --> <field name="domain">[('state', '=', 'draft')]</field> </record>
方法3:Python代码动态控制(复杂场景适用)
如果你的显示条件比较复杂,没法用简单的domain表达式表达(比如需要跨模型查询、多条件组合判断等),可以通过继承模型的方法来动态控制动作的可见性。
在olims.analysis_request模型的Python代码里添加以下逻辑:
from odoo import models, api class AnalysisRequest(models.Model): _inherit = 'olims.analysis_request' @api.model def get_actions(self, action_ids=None): actions = super().get_actions(action_ids=action_ids) # 找到你要控制的服务器动作(替换成你的模块名) assign_action = self.env.ref('your_module_name.ar_change_state_bulk_assign_id') if assign_action in actions: # 根据你的自定义条件判断是否移除该动作 # 这里示例:如果记录不是draft状态,就隐藏动作 if not self.filtered(lambda r: r.state == 'draft'): actions.remove(assign_action) return actions
这种方式灵活性最高,能处理各种复杂的业务逻辑判断。
内容的提问来源于stack exchange,提问作者Muhammad Sajid
相关产品推荐
相关产品推荐

