From 5b399fbdda4992ff0a1b34af7eb3b0f8a618cba4 Mon Sep 17 00:00:00 2001 From: gsinghpal Date: Tue, 12 May 2026 17:58:11 -0400 Subject: [PATCH] fix(configurator): copy operator-input prompts when cloning recipe to part MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit _clone_subtree() in fp_part_composer_controller built node vals manually and never copied source.input_ids — so 'Load Template' copied the recipe tree structure but dropped every custom prompt, leaving operators with empty data-capture screens. The fix iterates input_ids and calls .copy({'node_id': new_node.id}) so kind, target_min/max/unit, compliance_tag, hint, selection_options, sequence — every field on the input model — flows through. Verified on entech: ENP-ALUM-BASIC clone now shows all 105 prompts. Co-Authored-By: Claude Opus 4.7 (1M context) --- .../fusion_plating_configurator/__manifest__.py | 2 +- .../controllers/fp_part_composer_controller.py | 9 +++++++++ 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/fusion_plating/fusion_plating_configurator/__manifest__.py b/fusion_plating/fusion_plating_configurator/__manifest__.py index 2472a0ab..48c40aab 100644 --- a/fusion_plating/fusion_plating_configurator/__manifest__.py +++ b/fusion_plating/fusion_plating_configurator/__manifest__.py @@ -5,7 +5,7 @@ { 'name': 'Fusion Plating — Configurator', - 'version': '19.0.18.10.3', + 'version': '19.0.18.10.4', 'category': 'Manufacturing/Plating', 'summary': 'Quotation configurator with part catalog, coating configs, and formula-based pricing engine.', 'description': """ diff --git a/fusion_plating/fusion_plating_configurator/controllers/fp_part_composer_controller.py b/fusion_plating/fusion_plating_configurator/controllers/fp_part_composer_controller.py index cd7373ef..44306e38 100644 --- a/fusion_plating/fusion_plating_configurator/controllers/fp_part_composer_controller.py +++ b/fusion_plating/fusion_plating_configurator/controllers/fp_part_composer_controller.py @@ -124,6 +124,15 @@ def _clone_subtree(env, source, part, parent): new_node = Node.create(vals) + # Copy operator-input prompts (temperature reading, visual inspection, + # etc.) onto the cloned node. Without this, "Load Template" copies the + # step structure but loses every custom prompt the recipe author set up + # — operators end up with empty data-capture screens. .copy() handles + # every field on the input model (kind, target_min/max/unit, + # compliance_tag, sequence, hint, …) and rebinds node_id via override. + for src_input in source.input_ids: + src_input.copy({'node_id': new_node.id}) + # Recurse into children in deterministic sequence order. for child in source.child_ids.sorted('sequence'): _clone_subtree(env, child, part, new_node)