This commit is contained in:
2026-02-15 22:19:48 -06:00
parent 749f734aff
commit 782b1d2931
9 changed files with 1400 additions and 269 deletions

View File

@@ -4,7 +4,7 @@ Medications API - medication scheduling, logging, and adherence tracking
import os
import uuid
from datetime import datetime, date, timedelta
from datetime import datetime, date, timedelta, timezone
import flask
import jwt
@@ -109,12 +109,25 @@ def _count_expected_doses(med, period_start, days):
return days * times_per_day
def _count_logs_in_period(logs, period_start_str, action):
"""Count logs of a given action where created_at >= period_start."""
def _log_local_date(created_at, user_tz):
"""Convert a DB created_at (naive UTC datetime) to a local date string YYYY-MM-DD."""
if created_at is None:
return ""
if isinstance(created_at, datetime):
# Treat naive datetimes as UTC
if created_at.tzinfo is None:
created_at = created_at.replace(tzinfo=timezone.utc)
return created_at.astimezone(user_tz).date().isoformat()
# Fallback: already a string
return str(created_at)[:10]
def _count_logs_in_period(logs, period_start_str, action, user_tz=None):
"""Count logs of a given action where created_at (local date) >= period_start."""
return sum(
1 for log in logs
if log.get("action") == action
and str(log.get("created_at", ""))[:10] >= period_start_str
and (_log_local_date(log.get("created_at"), user_tz) if user_tz else str(log.get("created_at", ""))[:10]) >= period_start_str
)
@@ -324,6 +337,7 @@ def register(app):
meds = postgres.select("medications", where={"user_uuid": user_uuid, "active": True})
now = tz.user_now()
user_tz = now.tzinfo
today = now.date()
today_str = today.isoformat()
current_day = now.strftime("%a").lower() # "mon","tue", etc.
@@ -345,16 +359,16 @@ def register(app):
where={"medication_id": med["id"]},
)
today_taken = [
log.get("scheduled_time", "")
log.get("scheduled_time") or ""
for log in all_logs
if log.get("action") == "taken"
and str(log.get("created_at", ""))[:10] == today_str
and _log_local_date(log.get("created_at"), user_tz) == today_str
]
today_skipped = [
log.get("scheduled_time", "")
log.get("scheduled_time") or ""
for log in all_logs
if log.get("action") == "skipped"
and str(log.get("created_at", ""))[:10] == today_str
and _log_local_date(log.get("created_at"), user_tz) == today_str
]
result.append({
@@ -389,16 +403,16 @@ def register(app):
where={"medication_id": med["id"]},
)
tomorrow_taken = [
log.get("scheduled_time", "")
log.get("scheduled_time") or ""
for log in all_logs
if log.get("action") == "taken"
and str(log.get("created_at", ""))[:10] == tomorrow_str
and _log_local_date(log.get("created_at"), user_tz) == tomorrow_str
]
tomorrow_skipped = [
log.get("scheduled_time", "")
log.get("scheduled_time") or ""
for log in all_logs
if log.get("action") == "skipped"
and str(log.get("created_at", ""))[:10] == tomorrow_str
and _log_local_date(log.get("created_at"), user_tz) == tomorrow_str
]
result.append({
@@ -434,16 +448,16 @@ def register(app):
where={"medication_id": med["id"]},
)
yesterday_taken = [
log.get("scheduled_time", "")
log.get("scheduled_time") or ""
for log in all_logs
if log.get("action") == "taken"
and str(log.get("created_at", ""))[:10] == yesterday_str
and _log_local_date(log.get("created_at"), user_tz) == yesterday_str
]
yesterday_skipped = [
log.get("scheduled_time", "")
log.get("scheduled_time") or ""
for log in all_logs
if log.get("action") == "skipped"
and str(log.get("created_at", ""))[:10] == yesterday_str
and _log_local_date(log.get("created_at"), user_tz) == yesterday_str
]
result.append({
@@ -468,7 +482,9 @@ def register(app):
return flask.jsonify({"error": "unauthorized"}), 401
num_days = flask.request.args.get("days", 30, type=int)
meds = postgres.select("medications", where={"user_uuid": user_uuid, "active": True})
today = tz.user_today()
now = tz.user_now()
user_tz = now.tzinfo
today = now.date()
period_start = today - timedelta(days=num_days)
period_start_str = period_start.isoformat()
@@ -479,8 +495,8 @@ def register(app):
expected = _count_expected_doses(med, period_start, num_days)
logs = postgres.select("med_logs", where={"medication_id": med["id"]})
taken = _count_logs_in_period(logs, period_start_str, "taken")
skipped = _count_logs_in_period(logs, period_start_str, "skipped")
taken = _count_logs_in_period(logs, period_start_str, "taken", user_tz)
skipped = _count_logs_in_period(logs, period_start_str, "skipped", user_tz)
if is_prn:
adherence_pct = None
@@ -510,7 +526,9 @@ def register(app):
if not med:
return flask.jsonify({"error": "not found"}), 404
num_days = flask.request.args.get("days", 30, type=int)
today = tz.user_today()
now = tz.user_now()
user_tz = now.tzinfo
today = now.date()
period_start = today - timedelta(days=num_days)
period_start_str = period_start.isoformat()
@@ -519,8 +537,8 @@ def register(app):
expected = _count_expected_doses(med, period_start, num_days)
logs = postgres.select("med_logs", where={"medication_id": med_id})
taken = _count_logs_in_period(logs, period_start_str, "taken")
skipped = _count_logs_in_period(logs, period_start_str, "skipped")
taken = _count_logs_in_period(logs, period_start_str, "taken", user_tz)
skipped = _count_logs_in_period(logs, period_start_str, "skipped", user_tz)
if is_prn:
adherence_pct = None