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>
13 KiB
13 KiB
| 1 | id | name | model_id:id | group_id:id | perm_read | perm_write | perm_create | perm_unlink |
|---|---|---|---|---|---|---|---|---|
| 2 | access_fp_process_category_operator | fp.process.category.operator | model_fusion_plating_process_category | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 3 | access_fp_process_category_manager | fp.process.category.manager | model_fusion_plating_process_category | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 4 | access_fp_process_type_operator | fp.process.type.operator | model_fusion_plating_process_type | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 5 | access_fp_process_type_manager | fp.process.type.manager | model_fusion_plating_process_type | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 6 | access_fp_bath_parameter_operator | fp.bath.parameter.operator | model_fusion_plating_bath_parameter | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 7 | access_fp_bath_parameter_manager | fp.bath.parameter.manager | model_fusion_plating_bath_parameter | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 8 | access_fp_facility_operator | fp.facility.operator | model_fusion_plating_facility | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 9 | access_fp_facility_supervisor | fp.facility.supervisor | model_fusion_plating_facility | fusion_plating.group_fp_shop_manager_v2 | 1 | 0 | 0 | 0 |
| 10 | access_fp_facility_manager | fp.facility.manager | model_fusion_plating_facility | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 11 | access_fp_work_center_operator | fp.work.center.operator | model_fusion_plating_work_center | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 12 | access_fp_work_center_supervisor | fp.work.center.supervisor | model_fusion_plating_work_center | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 0 | 0 |
| 13 | access_fp_work_center_manager | fp.work.center.manager | model_fusion_plating_work_center | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 14 | access_fp_tank_operator | fp.tank.operator | model_fusion_plating_tank | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 15 | access_fp_tank_supervisor | fp.tank.supervisor | model_fusion_plating_tank | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 0 | 0 |
| 16 | access_fp_tank_manager | fp.tank.manager | model_fusion_plating_tank | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 17 | access_fp_tank_section_operator | fp.tank.section.operator | model_fusion_plating_tank_section | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 18 | access_fp_tank_section_supervisor | fp.tank.section.supervisor | model_fusion_plating_tank_section | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 0 | 0 |
| 19 | access_fp_tank_section_manager | fp.tank.section.manager | model_fusion_plating_tank_section | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 20 | access_fp_tank_composition_operator | fp.tank.composition.operator | model_fusion_plating_tank_composition | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 21 | access_fp_tank_composition_supervisor | fp.tank.composition.supervisor | model_fusion_plating_tank_composition | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 22 | access_fp_tank_composition_manager | fp.tank.composition.manager | model_fusion_plating_tank_composition | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 23 | access_fp_tank_comp_ing_operator | fp.tank.composition.ingredient.operator | model_fusion_plating_tank_composition_ingredient | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 24 | access_fp_tank_comp_ing_supervisor | fp.tank.composition.ingredient.supervisor | model_fusion_plating_tank_composition_ingredient | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 1 |
| 25 | access_fp_tank_comp_ing_manager | fp.tank.composition.ingredient.manager | model_fusion_plating_tank_composition_ingredient | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 26 | access_fp_bath_operator | fp.bath.operator | model_fusion_plating_bath | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 27 | access_fp_bath_supervisor | fp.bath.supervisor | model_fusion_plating_bath | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 28 | access_fp_bath_manager | fp.bath.manager | model_fusion_plating_bath | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 29 | access_fp_bath_target_operator | fp.bath.target.operator | model_fusion_plating_bath_target | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 30 | access_fp_bath_target_supervisor | fp.bath.target.supervisor | model_fusion_plating_bath_target | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 31 | access_fp_bath_target_manager | fp.bath.target.manager | model_fusion_plating_bath_target | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 32 | access_fp_bath_log_operator | fp.bath.log.operator | model_fusion_plating_bath_log | fusion_plating.group_fp_technician | 1 | 1 | 1 | 0 |
| 33 | access_fp_bath_log_supervisor | fp.bath.log.supervisor | model_fusion_plating_bath_log | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 34 | access_fp_bath_log_manager | fp.bath.log.manager | model_fusion_plating_bath_log | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 35 | access_fp_bath_log_line_operator | fp.bath.log.line.operator | model_fusion_plating_bath_log_line | fusion_plating.group_fp_technician | 1 | 1 | 1 | 0 |
| 36 | access_fp_bath_log_line_supervisor | fp.bath.log.line.supervisor | model_fusion_plating_bath_log_line | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 37 | access_fp_bath_log_line_manager | fp.bath.log.line.manager | model_fusion_plating_bath_log_line | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 38 | access_fp_process_node_operator | fp.process.node.operator | model_fusion_plating_process_node | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 39 | access_fp_process_node_supervisor | fp.process.node.supervisor | model_fusion_plating_process_node | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 40 | access_fp_process_node_manager | fp.process.node.manager | model_fusion_plating_process_node | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 41 | access_fp_process_node_input_operator | fp.process.node.input.operator | model_fusion_plating_process_node_input | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 42 | access_fp_process_node_input_supervisor | fp.process.node.input.supervisor | model_fusion_plating_process_node_input | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 43 | access_fp_process_node_input_manager | fp.process.node.input.manager | model_fusion_plating_process_node_input | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 44 | access_fp_rack_operator | fp.rack.operator | model_fusion_plating_rack | fusion_plating.group_fp_technician | 1 | 1 | 0 | 0 |
| 45 | access_fp_rack_supervisor | fp.rack.supervisor | model_fusion_plating_rack | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 46 | access_fp_rack_manager | fp.rack.manager | model_fusion_plating_rack | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 47 | access_fp_replenishment_rule_operator | fp.replenishment.rule.operator | model_fusion_plating_bath_replenishment_rule | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 48 | access_fp_replenishment_rule_supervisor | fp.replenishment.rule.supervisor | model_fusion_plating_bath_replenishment_rule | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 49 | access_fp_replenishment_rule_manager | fp.replenishment.rule.manager | model_fusion_plating_bath_replenishment_rule | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 50 | access_fp_replenishment_suggestion_operator | fp.replenishment.suggestion.operator | model_fusion_plating_bath_replenishment_suggestion | fusion_plating.group_fp_technician | 1 | 1 | 1 | 0 |
| 51 | access_fp_replenishment_suggestion_supervisor | fp.replenishment.suggestion.supervisor | model_fusion_plating_bath_replenishment_suggestion | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 52 | access_fp_replenishment_suggestion_manager | fp.replenishment.suggestion.manager | model_fusion_plating_bath_replenishment_suggestion | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 53 | access_fp_operator_cert_operator | fp.operator.cert.operator | model_fp_operator_certification | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 54 | access_fp_operator_cert_supervisor | fp.operator.cert.supervisor | model_fp_operator_certification | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 55 | access_fp_operator_cert_manager | fp.operator.cert.manager | model_fp_operator_certification | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 56 | access_fp_work_centre_operator | fp.work.centre.operator | model_fp_work_centre | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 57 | access_fp_work_centre_supervisor | fp.work.centre.supervisor | model_fp_work_centre | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 58 | access_fp_work_centre_manager | fp.work.centre.manager | model_fp_work_centre | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 59 | access_fp_job_operator | fp.job.operator | model_fp_job | fusion_plating.group_fp_technician | 1 | 1 | 0 | 0 |
| 60 | access_fp_job_supervisor | fp.job.supervisor | model_fp_job | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 61 | access_fp_job_manager | fp.job.manager | model_fp_job | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 62 | access_fp_job_step_operator | fp.job.step.operator | model_fp_job_step | fusion_plating.group_fp_technician | 1 | 1 | 0 | 0 |
| 63 | access_fp_job_step_supervisor | fp.job.step.supervisor | model_fp_job_step | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 64 | access_fp_job_step_manager | fp.job.step.manager | model_fp_job_step | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 65 | access_fp_job_step_timelog_operator | fp.job.step.timelog.operator | model_fp_job_step_timelog | fusion_plating.group_fp_technician | 1 | 1 | 1 | 0 |
| 66 | access_fp_job_step_timelog_supervisor | fp.job.step.timelog.supervisor | model_fp_job_step_timelog | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 67 | access_fp_job_step_timelog_manager | fp.job.step.timelog.manager | model_fp_job_step_timelog | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 68 | access_fp_work_role_operator | fp.work.role.operator | model_fp_work_role | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 69 | access_fp_work_role_manager | fp.work.role.manager | model_fp_work_role | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 70 | access_fp_proficiency_operator | fp.operator.proficiency.operator | model_fp_operator_proficiency | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 71 | access_fp_proficiency_supervisor | fp.operator.proficiency.supervisor | model_fp_operator_proficiency | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 72 | access_fp_proficiency_manager | fp.operator.proficiency.manager | model_fp_operator_proficiency | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 73 | access_fp_step_kind_operator | fp.step.kind.operator | model_fp_step_kind | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 74 | access_fp_step_kind_supervisor | fp.step.kind.supervisor | model_fp_step_kind | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 75 | access_fp_step_kind_manager | fp.step.kind.manager | model_fp_step_kind | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 76 | access_fp_step_kind_default_input_operator | fp.step.kind.default.input.operator | model_fp_step_kind_default_input | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 77 | access_fp_step_kind_default_input_supervisor | fp.step.kind.default.input.supervisor | model_fp_step_kind_default_input | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 1 |
| 78 | access_fp_step_kind_default_input_manager | fp.step.kind.default.input.manager | model_fp_step_kind_default_input | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 79 | access_fp_step_template_operator | fp.step.template.operator | model_fp_step_template | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 80 | access_fp_step_template_supervisor | fp.step.template.supervisor | model_fp_step_template | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 81 | access_fp_step_template_manager | fp.step.template.manager | model_fp_step_template | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 82 | access_fp_step_template_input_operator | fp.step.template.input.operator | model_fp_step_template_input | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 83 | access_fp_step_template_input_supervisor | fp.step.template.input.supervisor | model_fp_step_template_input | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 1 |
| 84 | access_fp_step_template_input_manager | fp.step.template.input.manager | model_fp_step_template_input | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 85 | access_fp_step_template_transition_input_operator | fp.step.template.transition.input.operator | model_fp_step_template_transition_input | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 86 | access_fp_step_template_transition_input_supervisor | fp.step.template.transition.input.supervisor | model_fp_step_template_transition_input | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 1 |
| 87 | access_fp_step_template_transition_input_manager | fp.step.template.transition.input.manager | model_fp_step_template_transition_input | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 88 | access_fp_rack_tag_operator | fp.rack.tag.operator | model_fp_rack_tag | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |
| 89 | access_fp_rack_tag_supervisor | fp.rack.tag.supervisor | model_fp_rack_tag | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 1 |
| 90 | access_fp_rack_tag_manager | fp.rack.tag.manager | model_fp_rack_tag | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 91 | access_fp_job_step_move_operator | fp.job.step.move.operator | model_fp_job_step_move | fusion_plating.group_fp_technician | 1 | 1 | 1 | 0 |
| 92 | access_fp_job_step_move_supervisor | fp.job.step.move.supervisor | model_fp_job_step_move | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 93 | access_fp_job_step_move_manager | fp.job.step.move.manager | model_fp_job_step_move | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 94 | access_fp_job_step_move_input_value_operator | fp.job.step.move.input.value.operator | model_fp_job_step_move_input_value | fusion_plating.group_fp_technician | 1 | 1 | 1 | 0 |
| 95 | access_fp_job_step_move_input_value_supervisor | fp.job.step.move.input.value.supervisor | model_fp_job_step_move_input_value | fusion_plating.group_fp_shop_manager_v2 | 1 | 1 | 1 | 0 |
| 96 | access_fp_job_step_move_input_value_manager | fp.job.step.move.input.value.manager | model_fp_job_step_move_input_value | fusion_plating.group_fp_manager | 1 | 1 | 1 | 1 |
| 97 | access_fp_migration_preview_owner | fp.migration.preview.owner | model_fp_migration_preview | fusion_plating.group_fp_owner | 1 | 1 | 1 | 1 |
| 98 | access_fp_migration_preview_line_owner | fp.migration.preview.line.owner | model_fp_migration_preview_line | fusion_plating.group_fp_owner | 1 | 1 | 1 | 1 |
| 99 | access_ir_actions_actions_plating | ir.actions.actions.plating.read | base.model_ir_actions_actions | fusion_plating.group_fp_technician | 1 | 0 | 0 | 0 |