File size: 1,368 Bytes
c794b6b
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
"""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