40 lines
1 KiB
Python
40 lines
1 KiB
Python
"""결과 저장소가 공유하는 순수 값 정규화 도우미."""
|
|
|
|
from __future__ import annotations
|
|
|
|
import hashlib
|
|
import json
|
|
from collections.abc import Mapping
|
|
from typing import Any
|
|
|
|
from ..deps import Principal, Role
|
|
|
|
|
|
def value(row: Mapping[str, Any], key: str, default: Any = None) -> Any:
|
|
try:
|
|
return row[key]
|
|
except (KeyError, TypeError):
|
|
return default
|
|
|
|
|
|
def canonical_hash(payload: Any) -> str:
|
|
serialized = json.dumps(
|
|
payload,
|
|
ensure_ascii=False,
|
|
separators=(",", ":"),
|
|
sort_keys=True,
|
|
default=str,
|
|
)
|
|
return hashlib.sha256(serialized.encode("utf-8")).hexdigest()
|
|
|
|
|
|
def public_row(row: Mapping[str, Any]) -> dict[str, Any]:
|
|
"""API 응답에서 학습자 피드백 정책 판정 전용 열을 제거한다."""
|
|
|
|
payload = dict(row)
|
|
payload.pop("source_learner_feedback_enabled", None)
|
|
return payload
|
|
|
|
|
|
def created_role(principal: Principal) -> str:
|
|
return "instructor" if principal.role == Role.TEACHER else principal.role.value
|