112 lines
3.5 KiB
Python
Executable File
112 lines
3.5 KiB
Python
Executable File
#!/usr/bin/env python3
|
|
"""Generate baseline snapshots for portal no-iframe migration."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
from pathlib import Path
|
|
|
|
from mes_dashboard.services.navigation_contract import (
|
|
compute_drawer_visibility,
|
|
validate_drawer_page_contract,
|
|
)
|
|
|
|
|
|
ROOT = Path(__file__).resolve().parent.parent
|
|
PAGE_STATUS_FILE = ROOT / "data" / "page_status.json"
|
|
OUT_DIR = ROOT / "docs" / "migration" / "portal-no-iframe"
|
|
|
|
|
|
ROUTE_QUERY_CONTRACTS = {
|
|
"/wip-overview": {
|
|
"query_keys": ["workorder", "lotid", "package", "type", "status"],
|
|
"notes": "filters + status URL state must remain compatible",
|
|
},
|
|
"/wip-detail": {
|
|
"query_keys": ["workcenter", "workorder", "lotid", "package", "type", "status"],
|
|
"notes": "workcenter deep-link and back-link query continuity",
|
|
},
|
|
"/hold-detail": {
|
|
"query_keys": ["reason"],
|
|
"notes": "reason required for normal access flow",
|
|
},
|
|
"/resource-history": {
|
|
"query_keys": [
|
|
"start_date",
|
|
"end_date",
|
|
"granularity",
|
|
"workcenter_groups",
|
|
"families",
|
|
"resource_ids",
|
|
"is_production",
|
|
"is_key",
|
|
"is_monitor",
|
|
],
|
|
"notes": "query/export params must remain compatible",
|
|
},
|
|
}
|
|
|
|
|
|
CRITICAL_API_PAYLOAD_CONTRACTS = {
|
|
"/api/wip/overview/summary": {
|
|
"required_keys": ["dataUpdateDate", "runLots", "queueLots", "holdLots"],
|
|
"notes": "summary header and cards depend on these fields",
|
|
},
|
|
"/api/wip/overview/matrix": {
|
|
"required_keys": ["workcenters", "packages", "matrix", "workcenter_totals"],
|
|
"notes": "matrix table rendering contract",
|
|
},
|
|
"/api/wip/hold-detail/summary": {
|
|
"required_keys": ["workcenterCount", "packageCount", "lotCount"],
|
|
"notes": "hold detail summary cards contract",
|
|
},
|
|
"/api/resource/history/summary": {
|
|
"required_keys": ["kpi", "trend", "heatmap", "workcenter_comparison"],
|
|
"notes": "resource history chart summary contract",
|
|
},
|
|
"/api/resource/history/detail": {
|
|
"required_keys": ["data"],
|
|
"notes": "detail table contract (plus truncated/max_records metadata when present)",
|
|
},
|
|
}
|
|
|
|
|
|
def write_json(path: Path, payload: dict) -> None:
|
|
path.write_text(json.dumps(payload, ensure_ascii=False, indent=2) + "\n", encoding="utf-8")
|
|
|
|
|
|
def main() -> None:
|
|
OUT_DIR.mkdir(parents=True, exist_ok=True)
|
|
raw = json.loads(PAGE_STATUS_FILE.read_text(encoding="utf-8"))
|
|
|
|
visibility = {
|
|
"source": str(PAGE_STATUS_FILE.relative_to(ROOT)),
|
|
"admin": compute_drawer_visibility(raw, is_admin=True),
|
|
"non_admin": compute_drawer_visibility(raw, is_admin=False),
|
|
}
|
|
write_json(OUT_DIR / "baseline_drawer_visibility.json", visibility)
|
|
|
|
route_contracts = {
|
|
"source": "frontend route parsing and current parity matrix",
|
|
"routes": ROUTE_QUERY_CONTRACTS,
|
|
}
|
|
write_json(OUT_DIR / "baseline_route_query_contracts.json", route_contracts)
|
|
|
|
payload_contracts = {
|
|
"source": "current frontend API consumption contracts",
|
|
"apis": CRITICAL_API_PAYLOAD_CONTRACTS,
|
|
}
|
|
write_json(OUT_DIR / "baseline_api_payload_contracts.json", payload_contracts)
|
|
|
|
validation = {
|
|
"source": str(PAGE_STATUS_FILE.relative_to(ROOT)),
|
|
"errors": validate_drawer_page_contract(raw),
|
|
}
|
|
write_json(OUT_DIR / "baseline_drawer_contract_validation.json", validation)
|
|
|
|
print("Generated baseline snapshots under", OUT_DIR)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|