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

View File

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