I want to hide the action reports of stock.picking based on the picking_type_code. Specifically, if picking_type_code = "outgoing", I want to hide stock.action_report_delivery; if picking_type_code = "incoming", I want to hide stock.stock_reception_report_action. All other reports should remain visible. How can I achieve this? Here is what I have tried so far:
class StockPicking(models.Model):
_inherit = "stock.picking"
def _get_action_ids(self, xml_ids):
action_ids = []
for xml_id in xml_ids:
try:
action_ids.append(self.env.ref(xml_id).id)
except ValueError:
_logger.warning("XML ID not found: %s", xml_id)
return action_ids
def _filter_toolbar_actions(self, view, allowed_ids=None, hidden_ids=None):
if not view or not view.get("toolbar"):
return
print_actions = view["toolbar"].get("print", [])
if allowed_ids is not None:
view["toolbar"]["print"] = [
a for a in print_actions if a.get("id") in allowed_ids
]
elif hidden_ids is not None:
view["toolbar"]["print"] = [
a for a in print_actions if a.get("id") not in hidden_ids
]
@api.model
def get_views(self, views, options=None):
res = super().get_views(views, options)
picking_type_code = self.env.context.get("restricted_picking_type_code")
if picking_type_code == "outgoing":
hidden_xml_ids = [
"stock.action_report_delivery",
]
hidden_ids = self._get_action_ids(hidden_xml_ids)
form_view = res["views"].get("form")
self._filter_toolbar_actions(form_view, hidden_ids=hidden_ids)
if picking_type_code == "incoming":
hidden_xml_ids = [
"stock.stock_reception_report_action",
]
hidden_ids = self._get_action_ids(hidden_xml_ids)
form_view = res["views"].get("form")
self._filter_toolbar_actions(form_view, hidden_ids=hidden_ids)
return res