fix(plating-perms): Phase I post-deploy fixes (live entech test catches)
8 distinct bugs caught + fixed while testing the live admin DB on entech
after the migration was approved. Each surfaced a real Odoo 19 gotcha
now codified in CLAUDE.md (rules 13b-13l).
Picker architecture:
- res.users.x_fc_plating_landing_action_id and res.company.x_fc_default_landing_action_id
now Many2one('ir.actions.actions') instead of ('ir.actions.act_window'),
so the picker accepts BOTH window actions (Sale Orders / Quotations /
Process Recipes) AND client actions (Manager Desk / Plant Kanban /
Quality Dashboard). Picker went from 3 entries to 6.
- x_fc_pickable_landing field moved from the two subclasses to the
ir.actions.actions base. Single source of truth.
- _render_resolved on the base dispatches to the correct subclass by
action type.
Non-admin Preferences access:
- Added ACL grant: group_fp_technician (and all higher roles via
implication) get read on ir.actions.actions. Without this, opening
Preferences raised AccessError on the picker domain evaluation.
- Removed the accessible_landing_action_ids Many2many compute (failed
for non-admins because field assignment requires write access on
the comodel relation, even with sudo'd search). Picker now shows all
6 entries to all users; resolver falls through gracefully if the
user picks an action they can't reach.
- res.users SELF_WRITEABLE_FIELDS / SELF_READABLE_FIELDS extended via
@property + super() (NOT class attribute — Odoo 19 changed the
pattern). Non-admin users can now save the Preferences dialog with
plating fields without hitting the standard write ACL.
Migration workflow:
- res.groups.users -> .user_ids (Odoo 19 rename; deprecated alias
removed). Was crashing _fp_notify_owners and _cron_purge_expired.
- user.message_post -> user.partner_id.message_post (res.users uses
_inherits delegation which doesn't expose mail.thread methods).
Was crashing the Owner approval click.
Tablet lock screen:
- /fp/tablet/tiles points at group_fp_technician instead of the old
group_fusion_plating_operator. Post-migration nobody holds the old
group directly (only via implication), so res.groups.user_ids on
the old xmlid returned empty — 'No operators configured' shown
even with PIN set.
- PIN pad dots dark mode: empty dot now dark gray (#424245), filled
dot now pure white. Previous version had both at light shades so
user couldn't see PIN entry progress.
- Lock-screen logo frame dark mode: near-opaque white plate
(rgba 0.95) so company logos designed for light backgrounds
render correctly. Previous 0.08 alpha let the dark page bleed
through.
Pre-deploy collision fix (already committed before deploy but
documented here for completeness):
- pre-migrate.py to rename old configurator's 'Shop Manager' group
display name before new fp_security_v2.xml loads the new
group_fp_shop_manager_v2 with the same display name (avoids
res_groups_name_uniq violation).
Module versions bumped:
fusion_plating: 19.0.21.1.0 -> 19.0.21.1.2
fusion_plating_shopfloor: 19.0.32.0.4 -> 19.0.32.0.6
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -44,9 +44,14 @@ $_lock-pulse-dot-border-hex: #ffffff;
|
||||
$_lock-tile-hover-bg-rgba: rgba(240, 165, 0, 0.10) !global;
|
||||
$_lock-tile-hover-border-rgba: rgba(240, 165, 0, 0.40) !global;
|
||||
$_lock-tile-hover-shadow: (0 12px 24px rgba(240, 165, 0, 0.15), 0 0 0 1px rgba(240, 165, 0, 0.2)) !global;
|
||||
$_lock-frame-bg-rgba: rgba(255, 255, 255, 0.08) !global;
|
||||
$_lock-frame-border-rgba: rgba(255, 255, 255, 0.10) !global;
|
||||
$_lock-frame-shadow: (0 8px 24px rgba(0, 0, 0, 0.30), inset 0 1px 0 rgba(255, 255, 255, 0.08)) !global;
|
||||
// Logo frame in dark mode: near-opaque WHITE plate (matches light-mode
|
||||
// intent) so company logos designed for light backgrounds render
|
||||
// correctly. The previous 0.08-alpha glass effect made dark-on-white
|
||||
// logos (and faded-white-on-transparent ones) effectively invisible
|
||||
// because the dark page bled through.
|
||||
$_lock-frame-bg-rgba: rgba(255, 255, 255, 0.95) !global;
|
||||
$_lock-frame-border-rgba: rgba(255, 255, 255, 0.20) !global;
|
||||
$_lock-frame-shadow: (0 8px 24px rgba(0, 0, 0, 0.45), inset 0 1px 0 rgba(255, 255, 255, 0.40)) !global;
|
||||
$_lock-status-clocked-hex: #34c759 !global;
|
||||
$_lock-status-pin-hex: #ff9f0a !global;
|
||||
$_lock-pulse-dot-border-hex: #2d3138 !global;
|
||||
|
||||
@@ -17,7 +17,13 @@ $_pin-dot-fill-hex: #1d1d1f;
|
||||
$_pin-key-bg-hex: #2d3138 !global;
|
||||
$_pin-key-hover-hex: #3a3f48 !global;
|
||||
$_pin-border-hex: #424245 !global;
|
||||
$_pin-dot-fill-hex: #f5f5f7 !global;
|
||||
// Empty dot: dark gray that blends into the panel but is still
|
||||
// visible; Filled dot: bright white for strong contrast. Previous
|
||||
// version left empty at light gray (#d8dadd) and set filled to
|
||||
// off-white (#f5f5f7) — both light colours, indistinguishable from
|
||||
// each other on the dark panel so user couldn't see PIN progress.
|
||||
$_pin-dot-hex: #424245 !global;
|
||||
$_pin-dot-fill-hex: #ffffff !global;
|
||||
}
|
||||
|
||||
.o_fp_pin_pad {
|
||||
|
||||
Reference in New Issue
Block a user