feat(step-kinds): curate to 11 + mandatory + admin-only creation
Operator-reported foot-gun: Step Kind dropdown had 24 options, most
of which were visual-only (cleaning, electroclean, etch, rinse,
strike, dry, wbf_test, hardness_test, adhesion_test, salt_spray,
packaging, etc.) and didn't drive any gate or milestone. Picking the
wrong one meant nothing happened; picking Generic (left default)
meant nothing happened. Authors couldn't tell which choice mattered.
Curation: 24 → 11 active kinds. Each remaining kind has a concrete
downstream behaviour (gate, portal milestone, hardware tie-in, or
"explicitly no behaviour" for Other):
other Other (catch-all, default — no special behaviour)
receiving Received portal milestone
contract_review QA-005 form gate + button_finish lock
racking Rack-assignment dialog + button_finish lock
mask Visual mask kind (covers Masking + De-Masking)
wet_process Visual wet kind (NEW, covers cleaning, rinse,
etch, strike, dry, electroclean, wbf_test)
plate Plated portal milestone (last plate step closes)
bake Bake-window state machine + Baked milestone
inspect Intermediate inspection milestone
final_inspect Inspected (terminal) portal milestone
ship Shipped milestone (back-compat; delivery-state
driven is preferred)
Retired kinds (active=False, hidden from dropdown): cleaning,
electroclean, etch, rinse, strike, dry, wbf_test, demask, derack,
replenishment, hardness_test, adhesion_test, salt_spray, packaging,
gating. Kept in DB for audit / history but not selectable.
Mandatory enforcement:
- fp.step.kind_id on fusion.plating.process.node and fp.step.template
is now required=True with ondelete='restrict' and a default that
resolves to the 'other' kind. Existing NULL rows are backfilled by
the pre-migrate before the NOT NULL constraint hits the schema.
- Dropdown no longer offers a blank / "Generic" option. New steps
land on 'other' instead of NULL.
Admin-only catalog:
- /fp/simple_recipe/kinds/create endpoint now refuses requests from
non-managers (group_fusion_plating_manager). Returns a clear
message explaining why ("each kind drives gates / milestones /
routing — pick Other if none fits, or ask a manager to wire up a
new kind").
- "+ Add a new kind…" sentinel option in the library form is hidden
unless state.recipe.user_is_manager. Backend gate is the authority;
the UI hide is just to stop showing a button that will error.
- The Step Type dropdown in the inline step-edit panel switched from
a 24-line hard-coded XML option list to a t-foreach over
state.kindOptions (the same kinds/list endpoint payload). One
source of truth — retire / add a kind in the catalog and every
picker reflects the change.
Migration impact (entech): 5 templates + 579 nodes backfilled via
name-match heuristic. 15 kinds flipped to active=False. Distribution
of the 579 backfilled nodes:
racking 105, other 97, bake 91, wet_process 90, mask 74,
inspect 44, plate 32, final_inspect 25, receiving 10,
contract_review 9, ship 2.
Drive-by:
- Migration uses _ensure_kind() that also registers ir.model.data
for the new xmlids so the subsequent data XML load doesn't create
duplicate kind records.
- Stored related default_kind on fusion.plating.process.node /
fp.step.template is written alongside kind_id in every SQL UPDATE
so legacy `node.default_kind == 'foo'` comparisons stay accurate
(the ORM doesn't recompute stored related fields after direct
SQL writes).
Module: fusion_plating 19.0.20.5.0 → 19.0.20.6.0.
15 existing tests still green.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -1,11 +1,42 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<odoo>
|
||||
<data noupdate="1">
|
||||
<!-- 24 seeded Step Kinds — XML IDs use the original Selection
|
||||
keys so post-migrate can map old default_kind = 'cleaning'
|
||||
to env.ref('fusion_plating.step_kind_cleaning').
|
||||
<!-- Step Kind catalog.
|
||||
|
||||
noupdate=1 so user edits to defaults survive `-u`. -->
|
||||
noupdate=1 so user edits to defaults survive `-u`.
|
||||
|
||||
2026-05-20 curation (19.0.20.6.0):
|
||||
- Cut from 24 → 12 active kinds. The dropped ones
|
||||
(cleaning, electroclean, etch, rinse, strike, dry,
|
||||
wbf_test, demask, derack, replenishment, hardness_test,
|
||||
adhesion_test, salt_spray, packaging, gating) are kept
|
||||
in this XML for history but flipped active=False by the
|
||||
migration script so they no longer appear in the
|
||||
dropdown — and bulk-remapped onto the new `other` /
|
||||
`wet_process` kinds.
|
||||
- New: `other` (catch-all, default) and `wet_process`
|
||||
(covers all bath-based steps).
|
||||
- `mask` covers Masking + De-Masking, `racking` covers
|
||||
Racking + De-Racking — operators differentiate by the
|
||||
step name. -->
|
||||
|
||||
<!-- ============================================================ -->
|
||||
<!-- ACTIVE KINDS — visible in dropdown -->
|
||||
<!-- ============================================================ -->
|
||||
|
||||
<record id="step_kind_other" model="fp.step.kind">
|
||||
<field name="code">other</field>
|
||||
<field name="name">Other</field>
|
||||
<field name="sequence">5</field>
|
||||
<field name="icon">fa-circle-o</field>
|
||||
</record>
|
||||
|
||||
<record id="step_kind_wet_process" model="fp.step.kind">
|
||||
<field name="code">wet_process</field>
|
||||
<field name="name">Wet Process (Clean / Rinse / Etch / Dry / etc.)</field>
|
||||
<field name="sequence">55</field>
|
||||
<field name="icon">fa-tint</field>
|
||||
</record>
|
||||
|
||||
<record id="step_kind_receiving" model="fp.step.kind">
|
||||
<field name="code">receiving</field>
|
||||
|
||||
Reference in New Issue
Block a user