"""Per-person metadata stored alongside face_database enrollments.""" from __future__ import annotations import json import os META_FILENAME = "metadata.json" DEFAULT_ROLE = "Staff" def _meta_path(person_dir: str) -> str: return os.path.join(person_dir, META_FILENAME) def read_person_metadata(person_name: str, face_db_root: str) -> dict: person_dir = os.path.join(face_db_root, person_name) path = _meta_path(person_dir) if not os.path.isfile(path): return {"role": DEFAULT_ROLE} try: with open(path, encoding="utf-8") as fh: data = json.load(fh) if isinstance(data, dict): return {"role": data.get("role") or DEFAULT_ROLE, **data} except (OSError, json.JSONDecodeError): pass return {"role": DEFAULT_ROLE} def write_person_metadata(person_name: str, face_db_root: str, *, role: str | None = None, **extra) -> dict: person_dir = os.path.join(face_db_root, person_name) os.makedirs(person_dir, exist_ok=True) current = read_person_metadata(person_name, face_db_root) if role is not None: current["role"] = (role or DEFAULT_ROLE).strip() or DEFAULT_ROLE current.update({k: v for k, v in extra.items() if v is not None}) with open(_meta_path(person_dir), "w", encoding="utf-8") as fh: json.dump(current, fh, indent=2) return current