Spaces:
Sleeping
Sleeping
| """Local approval workflow: Draft -> Review -> Approved.""" | |
| from __future__ import annotations | |
| import json | |
| import pathlib | |
| from datetime import datetime | |
| BASE = pathlib.Path(__file__).resolve().parents[1] | |
| INPUT_DIR = BASE / "input" | |
| STATUSES = ["Draft", "Review", "Approved"] | |
| def _path(tender_id: str) -> pathlib.Path: | |
| folder = INPUT_DIR / tender_id | |
| folder.mkdir(parents=True, exist_ok=True) | |
| return folder / "approval.json" | |
| def load_approval(tender_id: str) -> dict: | |
| p = _path(tender_id) | |
| if p.exists(): | |
| return json.loads(p.read_text(encoding="utf-8")) | |
| data = {"tender_id": tender_id, "status": "Draft", "history": []} | |
| save_approval(tender_id, "Draft", "Created") | |
| return data | |
| def save_approval(tender_id: str, status: str, note: str = "") -> dict: | |
| if status not in STATUSES: | |
| raise ValueError(f"Status must be one of: {', '.join(STATUSES)}") | |
| p = _path(tender_id) | |
| data = json.loads(p.read_text(encoding="utf-8")) if p.exists() else {"tender_id": tender_id, "history": []} | |
| data["status"] = status | |
| data.setdefault("history", []).append({"at": datetime.now().isoformat(timespec="seconds"), "status": status, "note": note}) | |
| p.write_text(json.dumps(data, indent=2), encoding="utf-8") | |
| return data | |
| def kanban_board() -> dict: | |
| board = {s: [] for s in STATUSES} | |
| for folder in INPUT_DIR.glob("*"): | |
| if not folder.is_dir(): | |
| continue | |
| data = load_approval(folder.name) | |
| board.setdefault(data["status"], []).append(folder.name) | |
| return board | |