Files
Odoo-Modules/fusion_plating/fusion_plating_jobs/migrations/19.0.10.24.0/post-migrate.py
gsinghpal 63d692b322 feat(plating): Phase 1 — plant-view kanban data model foundation
PV-T1: fp.work.centre.area_kind Selection (9 floor columns)
PV-T2: fp.job.step.area_kind compute + _STEP_KIND_TO_AREA fallback
       (covers all 30+ step kinds in the project library, plus the
       spec D4 rule that de_mask folds into de_racking)
PV-T3: fp.job.step.last_activity_at + write hook + message_post
       override + fp.job.step.move.create() hook + _fp_is_idle helper
PV-T4: res.users.paired_work_centre_ids M2M (single-station for MVP,
       forward-compatible for Phase 2 multi-station picker)
PV-T5: res.config.settings.x_fc_shopfloor_layout feature flag backed
       by ir.config_parameter for the landing-action resolver

Migrations:
  fusion_plating 19.0.21.0.0      — backfill area_kind from kind
  fusion_plating_jobs 19.0.10.24.0 — backfill last_activity_at

Deployed + verified on entech:
  - 9/9 fp.work.centre rows have area_kind set
  - 400/400 fp.job.step rows have area_kind + last_activity_at
  - paired_work_centre_ids M2M relation table created
  - All 271 modules loaded cleanly, registry rebuilt in 27s

Part of the 2026-05-23 Shop Floor plant-view kanban redesign.
Plan: docs/superpowers/plans/2026-05-23-shopfloor-plant-view-plan.md
Spec: docs/superpowers/specs/2026-05-23-shopfloor-plant-view-design.md

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-23 20:43:15 -04:00

29 lines
1.0 KiB
Python

# -*- coding: utf-8 -*-
# Copyright 2026 Nexa Systems Inc.
# License OPL-1 (Odoo Proprietary License v1.0)
#
# 19.0.10.24.0 — Plant-view Shop Floor kanban redesign.
# Backfill fp.job.step.last_activity_at from write_date so existing
# in-progress steps don't immediately trip the S16 idle-warning gate
# (8 hours since last activity) on first compute after deploy.
import logging
_logger = logging.getLogger(__name__)
def migrate(cr, version):
cr.execute("""
UPDATE fp_job_step
SET last_activity_at = write_date
WHERE last_activity_at IS NULL
""")
cr.execute("SELECT count(*) FROM fp_job_step WHERE last_activity_at IS NULL")
remaining = cr.fetchone()[0]
if remaining:
_logger.warning(
"%d fp.job.step rows still have NULL last_activity_at after "
"backfill (no write_date?). These will trip the idle gate "
"on first compute.", remaining,
)
_logger.info("Backfilled last_activity_at on fp.job.step from write_date")