Phase H of permissions overhaul (LAST subagent phase). New models: - fp.migration.preview (state: pending/approved/cancelled/rolled_back) - fp.migration.preview.line (one per active internal user) On -u, post_init_hook creates a preview in 'pending' state, walks all active non-share users through the 12-rule mapping predicate chain (first match wins, highest precedence first), and schedules a mail.activity on every Owner. Mapping table (per spec Section 5): uid 1/2 / Administrator -> owner CGP DO (existing) -> owner + res.company DO field set CGP Officer -> quality_manager Manager / Shop Mgr (old) -> manager Accounting -> manager Estimator-without-Manager -> sales_rep (flagged: loses confirm) Supervisor / Receiving -> shop_manager Operator -> technician catchall -> 'no' Owner clicks 'Approve & Run' on the preview form -> sudo write removes old plating groups, adds new role's group, posts Markup chatter audit. Optionally sets res.company.x_fc_cgp_designated_official_id for the DO. 30-day rollback window via JSON snapshot of groups_id per line. Daily cron (Fusion Plating: Purge Expired Role Migrations) clears snapshots + unlinks old [DEPRECATED] groups after 30 days. ACL: fp.migration.preview + .line both Owner-only (CRUD). Menu: Plating > Configuration > Role Migrations (Owner-only). Tests cover: only-Owner-can-approve, approve advances state, cancel blocks after approval, rollback restores groups_id, Estimator warning flagged, uid 2 maps to owner, rollback blocked after 30 days. Per CLAUDE.md: ir.cron uses only Odoo-19-valid fields (no numbercall, no doall). Post-init hook is idempotent — won't double-create previews or re-fire if all users already migrated. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
58 lines
1.9 KiB
Python
58 lines
1.9 KiB
Python
# -*- coding: utf-8 -*-
|
|
# Copyright 2026 Nexa Systems Inc.
|
|
# License OPL-1 (Odoo Proprietary License v1.0)
|
|
# Part of the Fusion Plating product family.
|
|
|
|
from . import fp_parent_numbered_mixin
|
|
from . import fp_process_category
|
|
from . import fp_process_type
|
|
from . import fp_facility
|
|
from . import fp_work_center
|
|
from . import fp_work_centre
|
|
from . import fp_tank_section
|
|
from . import fp_tank
|
|
from . import fp_tank_composition
|
|
from . import fp_bath
|
|
from . import fp_bath_log
|
|
from . import fp_bath_log_line
|
|
from . import fp_bath_parameter
|
|
from . import fp_bath_replenishment_rule
|
|
from . import fp_process_node
|
|
from . import fp_rack
|
|
from . import fp_job
|
|
from . import fp_job_step
|
|
from . import fp_job_step_timelog
|
|
from . import fp_operator_certification
|
|
from . import fp_tz
|
|
from . import res_company
|
|
from . import res_users
|
|
from . import res_config_settings
|
|
|
|
# Phase 1 (Sub 11) — relocated from fusion_plating_bridge_mrp via
|
|
# fusion_plating_jobs to core, so other downstream modules
|
|
# (fusion_plating_cgp, etc.) that touch hr.employee can see the
|
|
# shop-roles fields without a transitive dep on jobs.
|
|
from . import fp_work_role
|
|
from . import fp_proficiency
|
|
from . import hr_employee
|
|
from . import fp_process_node_inherit
|
|
|
|
# Sub 12a — Simple Recipe Editor + Step Library
|
|
from . import fp_step_kind # MUST load before fp_step_template (dependency)
|
|
from . import fp_step_template
|
|
from . import fp_step_template_input
|
|
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
|
|
|
|
# Phase H — dry-run + Owner-approval role migration workflow.
|
|
# fp_role_constants MUST be imported before fp_migration (the latter
|
|
# imports the predicate chain + xmlid maps from the former).
|
|
from . import fp_role_constants
|
|
from . import fp_migration
|