I'm trying to display my products barcode number for each component and nested components in the BomOverview. And to be clear, not the actual downloadable/printable pdf report Bom Overview, the actual web page. I believe there are nested templates that are being called to get where I need the barcodes to go.
The first would be "mrp.report_bom_structure"
<t t-name="mrp.report_bom_structure">
<t t-set="data_report_landscape" t-value="True"/>
<t t-call="web.basic_layout">
<t t-foreach="docs" t-as="data">
<div class="page">
<t t-call="mrp.report_mrp_bom"/>
</div>
<p style="page-break-before:always;"> </p>
</t>
</t>
</t>
That one calls for "mrp.report_mrp_bom"
And in report_mrp_bom it calls one more named "mrp.report_mrp_bom_pdf_line"
<t t-name="mrp.report_mrp_bom">
<div class="o_mrp_bom_report_page container py-3 py-lg-5 px-0 bg-view">
<div t-if="data.get('lines')">
<div class="px-3 mb-5">
<h1>BoM Overview</h1>
<h3 t-esc="data['name']"/>
<hr t-if="data['bom_code']"/>
<h6 t-if="data['bom_code']">Reference: <t t-esc="data['bom_code']"/></h6>
</div>
...... .... ..... ..
</tr>
<t t-call="mrp.report_mrp_bom_pdf_line"/>
</tbody>
<tfoot>
<tr t-if="data['show_costs']">
<td name="td_mrp_bom_f" class="text-end">
<span t-if="data['byproducts']" t-esc="data['name']"/>
</td>
<td class="text-end"><strong>Unit Cost</strong></td>
<t t-name="mrp.report_mrp_bom_pdf_line">
<t t-set="currency" t-value="data['currency']"/>
<t t-foreach="data['lines']" t-as="l">
<tr t-if="l['visible'] and (l['type'] != 'operation' or data['show_operations'])">
<td name="td_mrp_code">
<span t-attf-style="margin-left: {{ str(l['level'] * 20) }}px"/>
<span t-esc="l['name']"/>
</td>
I have tried and tried and tried, but I always fail. In my custom model I inherit from mrp.bom and I have used various methods that are found from odoo core code such as _get_bom_data, _get_report_data, _get_pdf_line, etc. so that I can pass the barcode in with the data.
For a quick example
class CustomBomStructure(models.Model):
_inherit = "mrp.bom" @api.model
def _get_bom_data(
self, bom,
warehouse,
product=False,
line_qty=False,
bom_line=False,
level=0,
parent_bom=False,
parent_product=False,
index=0,
product_info=False,
ignore_stock=False,
):
# Call the super method to retain the core logic
bom_report_line = super(CustomBomStructure, self)._get_bom_data( bom, warehouse, product, line_qty, bom_line, level, parent_bom, parent_product, index, product_info, ignore_stock, )
# Loop through each product line (component) and add the barcode for component in bom_report_line.get("components", []): product = component["product"] barcode = product.product_tmpl_id.barcode if product else '' component["barcode"] = barcode
return bom_report_line