67 lines
2.3 KiB
Python
67 lines
2.3 KiB
Python
"""协议/捐赠样本 · 特殊标记字段工具。"""
|
|
from __future__ import annotations
|
|
|
|
from typing import Any, Dict, Optional
|
|
|
|
|
|
def _truthy_flag(value: Any) -> bool:
|
|
if value is True or value == 1:
|
|
return True
|
|
if isinstance(value, str):
|
|
return value.strip().lower() in ("1", "true", "yes")
|
|
return False
|
|
|
|
|
|
def sample_special_to_dict(sample: Any) -> Dict[str, Any]:
|
|
if sample is None:
|
|
return {"isSpecial": False, "specialRemark": ""}
|
|
return {
|
|
"isSpecial": bool(getattr(sample, "is_special", 0)),
|
|
"specialRemark": (getattr(sample, "special_remark", None) or "").strip(),
|
|
}
|
|
|
|
|
|
def validate_sample_special_raw(raw: dict, *, index: Optional[int] = None) -> None:
|
|
is_special = _truthy_flag(raw.get("is_special"))
|
|
remark = (raw.get("special_remark") or "").strip()
|
|
prefix = f"样本第{index + 1}行:" if index is not None else ""
|
|
if is_special and not remark:
|
|
raise ValueError(f"{prefix}特殊样本须填写特殊说明")
|
|
if len(remark) > 256:
|
|
raise ValueError(f"{prefix}特殊说明不能超过256个字符")
|
|
|
|
|
|
def apply_sample_special_fields(obj: Any, raw: dict) -> None:
|
|
is_special = _truthy_flag(raw.get("is_special"))
|
|
remark = (raw.get("special_remark") or "").strip()
|
|
obj.is_special = 1 if is_special else 0
|
|
obj.special_remark = remark if is_special and remark else None
|
|
|
|
|
|
def apply_inbound_sample_special_mark_fields(obj: Any, raw: dict) -> None:
|
|
"""质检等场景:取消勾选时保留 special_remark,仅清除 is_special 标记。"""
|
|
is_special = _truthy_flag(raw.get("is_special"))
|
|
remark = (raw.get("special_remark") or "").strip()
|
|
obj.is_special = 1 if is_special else 0
|
|
if is_special:
|
|
obj.special_remark = remark if remark else None
|
|
elif remark:
|
|
obj.special_remark = remark
|
|
|
|
|
|
def apply_special_to_item_from_samples(
|
|
item: Dict[str, Any],
|
|
*,
|
|
source: str,
|
|
protocol_sample_id: str,
|
|
donation_sample_id: str,
|
|
protocol_samples: Dict[str, Any],
|
|
donation_samples: Dict[str, Any],
|
|
) -> None:
|
|
sample = None
|
|
if source == "research_donation":
|
|
sample = donation_samples.get(donation_sample_id or "")
|
|
else:
|
|
sample = protocol_samples.get(protocol_sample_id or "")
|
|
item.update(sample_special_to_dict(sample))
|