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