fix(reports): BoL PDF — t-field needs dotted path, branch on delivery_address_id

The Bill of Lading template assigned a temp variable
`<t t-set="dest" t-value="doc.delivery_address_id or doc.partner_id"/>`
and then tried `<div t-field="dest" .../>`. Odoo 19 QWeb asserts
t-field must be `record.field_name` (have a dot) — the temp variable
form fails compilation and the report renders as a multi-page
"Oops! Something went wrong" PDF stuffed with the traceback.

Fix: branch with `t-if`/`t-else` and call `t-field="doc.delivery_address_id"`
or `t-field="doc.partner_id"` directly. Same pattern in both header
and second-page-header sections (lines 49/235).

Verified: BoL render goes from 39 KB error page to 138 KB clean PDF.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-04-19 07:14:33 -04:00
parent c450bb203e
commit 16a4bdddf3
4 changed files with 53 additions and 7 deletions

View File

@@ -3,7 +3,7 @@
# License OPL-1 (Odoo Proprietary License v1.0) # License OPL-1 (Odoo Proprietary License v1.0)
{ {
'name': 'Fusion Plating — Reports', 'name': 'Fusion Plating — Reports',
'version': '19.0.4.0.0', 'version': '19.0.4.1.0',
'category': 'Manufacturing/Plating', 'category': 'Manufacturing/Plating',
'summary': 'PDF reports for Fusion Plating: quote, SO, WO, packing, BoL, CoC, invoice, receipt, quality + compliance.', 'summary': 'PDF reports for Fusion Plating: quote, SO, WO, packing, BoL, CoC, invoice, receipt, quality + compliance.',
'depends': [ 'depends': [

View File

@@ -46,9 +46,14 @@
</td> </td>
<td style="height: 90px;"> <td style="height: 90px;">
<strong><span t-field="doc.partner_id.name"/></strong><br/> <strong><span t-field="doc.partner_id.name"/></strong><br/>
<t t-set="dest" t-value="doc.delivery_address_id or doc.partner_id"/> <t t-if="doc.delivery_address_id">
<div t-field="dest" <div t-field="doc.delivery_address_id"
t-options="{'widget': 'contact', 'fields': ['address', 'phone'], 'no_marker': True}"/> t-options="{'widget': 'contact', 'fields': ['address', 'phone'], 'no_marker': True}"/>
</t>
<t t-else="">
<div t-field="doc.partner_id"
t-options="{'widget': 'contact', 'fields': ['address', 'phone'], 'no_marker': True}"/>
</t>
<t t-if="doc.contact_name"> <t t-if="doc.contact_name">
<strong>Attn: </strong><span t-field="doc.contact_name"/><br/> <strong>Attn: </strong><span t-field="doc.contact_name"/><br/>
</t> </t>
@@ -232,9 +237,14 @@
</td> </td>
<td style="height: 100px; font-size: 12pt;"> <td style="height: 100px; font-size: 12pt;">
<strong><span t-field="doc.partner_id.name"/></strong><br/> <strong><span t-field="doc.partner_id.name"/></strong><br/>
<t t-set="dest" t-value="doc.delivery_address_id or doc.partner_id"/> <t t-if="doc.delivery_address_id">
<div t-field="dest" <div t-field="doc.delivery_address_id"
t-options="{'widget': 'contact', 'fields': ['address', 'phone'], 'no_marker': True}"/> t-options="{'widget': 'contact', 'fields': ['address', 'phone'], 'no_marker': True}"/>
</t>
<t t-else="">
<div t-field="doc.partner_id"
t-options="{'widget': 'contact', 'fields': ['address', 'phone'], 'no_marker': True}"/>
</t>
<t t-if="doc.contact_name"> <t t-if="doc.contact_name">
<strong>Attn: </strong><span t-field="doc.contact_name"/><br/> <strong>Attn: </strong><span t-field="doc.contact_name"/><br/>
</t> </t>

View File

@@ -0,0 +1,22 @@
# Render BoL HTML body to see the real error
import traceback
env = env # noqa
report = env.ref('fusion_plating_reports.action_report_fp_bol_portrait')
dlv = env['fusion.plating.delivery'].search([], order='id desc', limit=1)
print('rendering HTML for:', dlv.name, 'id=', dlv.id)
try:
html, _ = report.with_context(force_report_rendering=True
)._render_qweb_html(report.report_name, [dlv.id])
out = html.decode() if isinstance(html, bytes) else str(html)
print('HTML length:', len(out))
# Show beginning + look for Traceback markers
if 'Traceback' in out or 'Oops' in out:
idx = max(out.find('Traceback'), out.find('Oops'))
print('--- ERROR SECTION ---')
print(out[idx:idx+3000])
else:
print('--- FIRST 800 CHARS ---')
print(out[:800])
except Exception:
print('--- DIRECT EXCEPTION ---')
traceback.print_exc()

View File

@@ -0,0 +1,14 @@
# Reproduce BoL render error
import traceback
env = env # noqa
report = env.ref('fusion_plating_reports.action_report_fp_bol_portrait')
print('report:', report.report_name, 'model:', report.model)
dlv = env['fusion.plating.delivery'].search([], order='id desc', limit=1)
print('rendering for:', dlv.name, 'id=', dlv.id, 'state=', dlv.state)
try:
pdf, _ = report.with_context(force_report_rendering=True
)._render_qweb_pdf(report.report_name, [dlv.id])
print('OK pdf size:', len(pdf), 'bytes')
except Exception:
print('--- TRACEBACK ---')
traceback.print_exc()