fix(portal): inject sidebar layout values into every FP portal render

Every FP portal route built `values = {...}` from scratch and called
`request.render(...)` directly, bypassing `_prepare_portal_layout_values`.
Our new `fp_sidebar_items` and `fp_partner_display_name` keys live in
that hook, so the sidebar template's `t-foreach` was a no-op on every
custom page (`/my/home`, `/my/jobs`, `/my/account_summary`, etc.) — the
sidebar rendered with the "My Account" fallback header and only the
Sign Out footer link visible.

Fix: each FP render now does
    values = self._prepare_portal_layout_values()
    values.update({...route-specific values...})
This puts the layout values in first (so `fp_sidebar_items` and
`fp_partner_display_name` always present), and the route's own
update wins on `page_name` and other collisions.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
gsinghpal
2026-05-17 14:39:53 -04:00
parent cdc47554ed
commit 04862e8a28
2 changed files with 39 additions and 19 deletions

View File

@@ -551,7 +551,8 @@ class FpCustomerPortal(CustomerPortal):
step=self._FP_ACCOUNT_SUMMARY_PER_PAGE,
)
values = {
values = self._prepare_portal_layout_values()
values.update({
'page_name': 'fp_account_summary',
'records': data['records'],
'tabs': self._FP_ACCOUNT_SUMMARY_TABS,
@@ -564,7 +565,7 @@ class FpCustomerPortal(CustomerPortal):
if commercial.property_account_receivable_id else request.env.company.currency_id,
'pager': pager,
'total': data['total'],
}
})
return request.render('fusion_plating_portal.portal_my_account_summary', values)
# ==========================================================================
@@ -657,7 +658,8 @@ class FpCustomerPortal(CustomerPortal):
('state', '=', 'ready_to_ship'),
])
values = {
values = self._prepare_portal_layout_values()
values.update({
'page_name': 'fp_dashboard',
'partner': partner,
# Quotes
@@ -682,7 +684,7 @@ class FpCustomerPortal(CustomerPortal):
'active_job_count': active_job_count,
'awaiting_review_count': awaiting_review_count,
'ready_to_ship_count': ready_to_ship_count,
}
})
return request.render(
'fusion_plating_portal.fp_portal_home_dashboard',
values,
@@ -745,7 +747,8 @@ class FpCustomerPortal(CustomerPortal):
)
request.session['my_fp_quote_requests_history'] = quote_requests.ids[:100]
values = {
values = self._prepare_portal_layout_values()
values.update({
'quote_requests': quote_requests,
'page_name': 'fp_quote_requests',
'pager': pager,
@@ -754,7 +757,7 @@ class FpCustomerPortal(CustomerPortal):
'sortby': sortby,
'searchbar_filters': searchbar_filters,
'filterby': filterby,
}
})
return request.render(
'fusion_plating_portal.portal_my_quote_requests',
values,
@@ -779,12 +782,14 @@ class FpCustomerPortal(CustomerPortal):
except (AccessError, MissingError):
return request.redirect('/my')
layout_values = self._prepare_portal_layout_values()
values = self._fp_quote_request_get_page_view_values(
quote_sudo, access_token, **kw
)
layout_values.update(values)
return request.render(
'fusion_plating_portal.portal_my_quote_request',
values,
layout_values,
)
# ==========================================================================
@@ -988,14 +993,15 @@ class FpCustomerPortal(CustomerPortal):
)
request.session['my_fp_jobs_history'] = jobs.ids[:100]
values = {
values = self._prepare_portal_layout_values()
values.update({
'jobs': jobs,
'page_name': 'fp_jobs',
'pager': pager,
'default_url': '/my/jobs',
'searchbar_sortings': searchbar_sortings,
'sortby': sortby,
}
})
return request.render(
'fusion_plating_portal.portal_my_jobs',
values,
@@ -1020,6 +1026,7 @@ class FpCustomerPortal(CustomerPortal):
except (AccessError, MissingError):
return request.redirect('/my')
layout_values = self._prepare_portal_layout_values()
values = self._fp_portal_job_get_page_view_values(
job_sudo, access_token, **kw
)
@@ -1031,9 +1038,10 @@ class FpCustomerPortal(CustomerPortal):
done_count = sum(1 for s in values['stage_timeline'] if s['status'] == 'done')
active_count = sum(1 for s in values['stage_timeline'] if s['status'] == 'active')
values['timeline_spine_pct'] = int(((done_count + 0.5 * active_count) / 5) * 100)
layout_values.update(values)
return request.render(
'fusion_plating_portal.portal_my_job',
values,
layout_values,
)
# ==========================================================================
@@ -1266,14 +1274,15 @@ class FpCustomerPortal(CustomerPortal):
offset=pager['offset'],
)
values = {
values = self._prepare_portal_layout_values()
values.update({
'deliveries': deliveries,
'page_name': 'fp_deliveries',
'pager': pager,
'default_url': '/my/deliveries',
'searchbar_sortings': searchbar_sortings,
'sortby': sortby,
}
})
return request.render(
'fusion_plating_portal.portal_my_deliveries',
values,
@@ -1324,14 +1333,15 @@ class FpCustomerPortal(CustomerPortal):
offset=pager['offset'],
)
values = {
values = self._prepare_portal_layout_values()
values.update({
'cert_jobs': cert_jobs,
'page_name': 'fp_certifications',
'pager': pager,
'default_url': '/my/certifications',
'searchbar_sortings': searchbar_sortings,
'sortby': sortby,
}
})
return request.render(
'fusion_plating_portal.portal_my_certifications',
values,

View File

@@ -33,10 +33,12 @@ class FpPortalConfigurator(CustomerPortal):
[('partner_id', 'child_of', partner.commercial_partner_id.id)],
order='create_date desc', limit=10,
)
return request.render('fusion_plating_portal.portal_configurator_landing', {
values = self._prepare_portal_layout_values()
values.update({
'page_name': 'fp_configurator',
'quotes': quotes,
})
return request.render('fusion_plating_portal.portal_configurator_landing', values)
# ======================================================================
# Step 1 — Upload part or enter manual measurements
@@ -118,10 +120,12 @@ class FpPortalConfigurator(CustomerPortal):
('titanium', 'Titanium'),
('other', 'Other'),
]
return request.render('fusion_plating_portal.portal_configurator_step1', {
values = self._prepare_portal_layout_values()
values.update({
'page_name': 'fp_configurator',
'materials': materials,
})
return request.render('fusion_plating_portal.portal_configurator_step1', values)
# ======================================================================
# Step 2 — Select coating configuration
@@ -150,11 +154,13 @@ class FpPortalConfigurator(CustomerPortal):
coatings = request.env['fusion.plating.process.type'].sudo().search(
[('active', '=', True)], order='sequence, name',
)
return request.render('fusion_plating_portal.portal_configurator_step2', {
values = self._prepare_portal_layout_values()
values.update({
'page_name': 'fp_configurator',
'coatings': coatings,
'session_data': session_data,
})
return request.render('fusion_plating_portal.portal_configurator_step2', values)
# ======================================================================
# Step 3 — Estimate & submit
@@ -181,12 +187,14 @@ class FpPortalConfigurator(CustomerPortal):
_logger.info('Skipping price estimate — pricing helper unavailable.', exc_info=True)
estimated_price = {'min': 0, 'max': 0, 'available': False}
return request.render('fusion_plating_portal.portal_configurator_step3', {
values = self._prepare_portal_layout_values()
values.update({
'page_name': 'fp_configurator',
'session_data': session_data,
'coating': coating,
'estimated_price': estimated_price,
})
return request.render('fusion_plating_portal.portal_configurator_step3', values)
# ======================================================================
# Submit — create quote request
@@ -265,10 +273,12 @@ class FpPortalConfigurator(CustomerPortal):
# Clear session
request.session.pop('fp_configurator', None)
return request.render('fusion_plating_portal.portal_configurator_success', {
values = self._prepare_portal_layout_values()
values.update({
'page_name': 'fp_configurator',
'quote': quote,
})
return request.render('fusion_plating_portal.portal_configurator_success', values)
# ======================================================================
# Pricing helper