feat(phase1): top-level menu consolidation + landing-page resolver
Phase 1 collapses the Plating app's 17 top-level menus down to 6
domains (Sales, Operations, Receiving & Shipping, Quality,
Compliance, Configuration) so users no longer scroll a 17-item
sidebar to find one thing.
Re-parented (no XML id changes — bookmarks still work):
- fusion_plating_compliance.menu_fp_compliance_root
→ menu_fp_compliance_hub (renamed 'General')
- fusion_plating_safety.menu_fp_safety_root
→ menu_fp_compliance_hub (renamed 'Safety / WHMIS')
- fusion_plating_aerospace.menu_fp_aerospace
→ menu_fp_compliance_hub (renamed 'Aerospace (AS9100 / Nadcap)')
- fusion_plating_nuclear.menu_fp_nuclear
→ menu_fp_compliance_hub (renamed 'Nuclear (CSA N299 / CNSC)')
- fusion_plating_cgp.menu_fp_cgp
→ menu_fp_compliance_hub (renamed 'Controlled Goods (CGP)')
- fusion_plating_certificates.menu_fp_certificates
→ menu_fp_quality (Certs are a Quality output, not a separate
top-level concern)
- fusion_plating_bridge_maintenance.menu_fp_maintenance
→ menu_fp_operations
- fusion_plating.menu_fp_job_step_move (Move Log)
→ menu_fp_operations
- fusion_plating.menu_fp_job_step_timelog (Labor History)
→ menu_fp_operations
The new menu_fp_compliance_hub is supervisor-gated; underlying
verticals retain their own group locks (CGP officer, etc.).
Settings menu remains manager-gated through inheritance from
menu_fp_config (already in place).
NEW — Plating landing-page resolver:
- ir.actions.act_window.x_fc_pickable_landing (Boolean tag for
curated picklist; flagged on Sale Orders, Quotations, Process
Recipes for Phase 1; more in Phase 2)
- res.company.x_fc_default_landing_action_id (admin sets fallback)
- res.users.x_fc_plating_landing_action_id (per-user override)
- ir.actions.server action_fp_resolve_plating_landing — picks
user → company → Sale Orders fallback at click time
- menu_fp_root rewired to call the resolver
- User profile + Settings tabs surface the dropdowns
Configurator's earlier menu_fp_root override (action_fp_sale_orders
direct) removed — core's resolver now owns the routing.
Versions bumped: fusion_plating 19.0.11.0.0, configurator
19.0.17.16.0, plus 7 dependent modules patched.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -41,3 +41,6 @@ from . import fp_step_template_transition_input
|
||||
# Sub 12b — Rack-aware moves + persistent labor reconciliation
|
||||
from . import fp_rack_tag
|
||||
from . import fp_job_step_move
|
||||
|
||||
# Phase 1 — Plating landing-page resolver
|
||||
from . import fp_landing
|
||||
|
||||
61
fusion_plating/fusion_plating/models/fp_landing.py
Normal file
61
fusion_plating/fusion_plating/models/fp_landing.py
Normal file
@@ -0,0 +1,61 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# Copyright 2026 Nexa Systems Inc.
|
||||
# License OPL-1 (Odoo Proprietary License v1.0)
|
||||
# Part of the Fusion Plating product family.
|
||||
"""Phase 1 — Plating landing-page resolver fields.
|
||||
|
||||
Three pieces:
|
||||
1. `ir.actions.act_window.x_fc_pickable_landing` — Boolean tag. Mark a
|
||||
curated set of plating actions (Sale Orders, Plant Overview,
|
||||
Quotations, Quality Dashboard, Manager Dashboard, Tablet Station,
|
||||
Labor History) so the landing-page dropdown only offers sensible
|
||||
options, not all 200 act_window records in the DB.
|
||||
|
||||
2. `res.company.x_fc_default_landing_action_id` — admin sets the
|
||||
fallback for users who don't pick a preference.
|
||||
|
||||
3. `res.users.x_fc_plating_landing_action_id` — each user's own
|
||||
override.
|
||||
|
||||
The resolver server action (data/fp_landing_data.xml) reads these.
|
||||
"""
|
||||
|
||||
from odoo import fields, models
|
||||
|
||||
|
||||
class IrActionsActWindow(models.Model):
|
||||
_inherit = 'ir.actions.act_window'
|
||||
|
||||
x_fc_pickable_landing = fields.Boolean(
|
||||
string='Pickable as Plating Landing',
|
||||
default=False,
|
||||
help='When True, this action appears in the Plating landing-'
|
||||
'page dropdown on res.users and res.company. Tag a small '
|
||||
'curated list (Sale Orders, Plant Overview, etc.) to keep '
|
||||
'the picker manageable.',
|
||||
)
|
||||
|
||||
|
||||
class ResCompany(models.Model):
|
||||
_inherit = 'res.company'
|
||||
|
||||
x_fc_default_landing_action_id = fields.Many2one(
|
||||
'ir.actions.act_window',
|
||||
string='Default Plating Landing Page',
|
||||
domain=[('x_fc_pickable_landing', '=', True)],
|
||||
help='Page that opens when a user clicks the Plating app, '
|
||||
'unless the user has chosen their own override on their '
|
||||
'preferences. Falls back to Sale Orders when blank.',
|
||||
)
|
||||
|
||||
|
||||
class ResUsers(models.Model):
|
||||
_inherit = 'res.users'
|
||||
|
||||
x_fc_plating_landing_action_id = fields.Many2one(
|
||||
'ir.actions.act_window',
|
||||
string='My Plating Landing Page',
|
||||
domain=[('x_fc_pickable_landing', '=', True)],
|
||||
help='Personal override for the page that opens when you click '
|
||||
'the Plating app. When blank, follows the company default.',
|
||||
)
|
||||
@@ -62,3 +62,11 @@ class ResConfigSettings(models.TransientModel):
|
||||
readonly=False,
|
||||
string='Default Recipe Editor',
|
||||
)
|
||||
|
||||
# ----- Phase 1 — Plating landing page default -----------------------
|
||||
x_fc_default_landing_action_id = fields.Many2one(
|
||||
'ir.actions.act_window',
|
||||
related='company_id.x_fc_default_landing_action_id',
|
||||
readonly=False,
|
||||
string='Default Plating Landing Page',
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user