- Focus screen renders versioned questionnaire items (iq: buttons): section chip, position (adaptive forms without "of N"), recall date, pause / help-now actions, optional skip, sleep-hours input, 0-10 scale anchors, RUS-AUDIT item 2 standard-drink table. - Paused / held-for-review questionnaires get their own screen. - Today: intake and diary tasks, review notice, therapy-day card on days 1/7/14. - Drug card /meds/:ref from data/meds/meds_reference.json (draft built from the Minzdrav guidelines: depression 2024, PTSD 2023) — expected effect, course, side effects, red flags; no doses shown. "Report a side effect" always available (med:side_effects:<ref>). - API: /instruments/catalog, /meds/reference; today gains questionnaire state, reference id, indication and therapy day; demo persona seeds the dashboard dose history. - INTAKE_DEMO=1 (demo clock only) opens the questionnaires on synthetic data without touching the clinical release gate in config/intake_runtime.yaml. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
36 lines
1.5 KiB
Python
36 lines
1.5 KiB
Python
"""Drug reference of the medication module (data/meds/meds_reference.json, built by scripts/build_meds_reference.py).
|
|
|
|
Read-only patient information collected from the Minzdrav clinical guidelines: when to expect the effect, how long
|
|
the course lasts, common side effects, red flags. It never suggests a drug or a dose — the app only follows the
|
|
doctor's prescription. Draft until reviewed by a psychiatrist (`status` in the file).
|
|
"""
|
|
|
|
import json
|
|
from functools import lru_cache
|
|
from typing import Any, Literal
|
|
|
|
from app.config import get_settings
|
|
|
|
Indication = Literal["depression", "ptsd"]
|
|
|
|
|
|
@lru_cache(maxsize=1)
|
|
def load_reference() -> dict[str, Any]:
|
|
path = get_settings().data_dir / "meds" / "meds_reference.json"
|
|
return json.loads(path.read_text(encoding="utf-8"))
|
|
|
|
|
|
def find_drug(name: str) -> dict[str, Any] | None:
|
|
"""Reference entry for a prescription's drug (INN in Russian or the latin id), or None if it is not covered."""
|
|
key = name.strip().split()[0].casefold() if name.strip() else ""
|
|
for drug in load_reference()["drugs"]:
|
|
if key in (drug["id"], drug["name_ru"].casefold()):
|
|
return drug
|
|
return None
|
|
|
|
|
|
def indication_for(modules: list[str], drug: dict[str, Any]) -> Indication | None:
|
|
"""The indication the patient is followed for, among those the drug has in the guidelines."""
|
|
preferred: list[Indication] = ["ptsd", "depression"] if "veteran" in modules else ["depression", "ptsd"]
|
|
return next((i for i in preferred if i in drug["indications"]), None)
|