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:
@@ -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,
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user