如何在Odoo16中限制查看move_type为in_invoice的供应商账单报表?
修正后的代码及问题解析
问题分析
原代码存在以下核心错误:
- 判断逻辑偏差:未针对当前单据的
move_type做校验,反而去检查字段的可选值列表,导致条件始终成立,无法精准控制目标单据。 - 报表标识错误:要隐藏的是供应商账单报表(对应标识
report_vendor_bill关联的action),但原代码误写为客户发票报表report_customer_invoice。 - 视图结构路径错误:表单视图的打印按钮配置在
res['toolbar']['print']下,而非res['invoice'],原代码找不到目标操作节点。
修正后的代码
from odoo import models, api class AccountMove(models.Model): _inherit = 'account.move' @api.model def _get_view(self, view_id=None, view_type='form', toolbar=False, submenu=False, **options): res = super()._get_view(view_id, view_type, toolbar, submenu, **options) # 仅处理account.move的表单视图且需要加载工具栏 if view_type == 'form' and self._name == 'account.move' and toolbar: # 获取当前打开的单据记录ID active_id = self.env.context.get('active_id') if active_id: move_record = self.browse(active_id) # 判断当前单据是否为供应商账单 if move_record.move_type == 'in_invoice': # 过滤打印菜单,移除供应商账单报表按钮 if 'print' in res['toolbar']: vendor_report_action = self.env.ref('account.account_print_invoice') res['toolbar']['print'] = [ action for action in res['toolbar']['print'] if action.get('id') != vendor_report_action.id ] return res
补充说明
- 代码中
self.env.ref('account.account_print_invoice')是供应商账单报表对应的系统action引用,若使用自定义报表,需替换为对应action的外部ID。 - 若需更精细化权限控制,可直接给报表action配置权限组,仅允许指定组用户查看该报表。
内容的提问来源于stack exchange,提问作者Ansu Mary Jacob
相关产品推荐
相关产品推荐

