UI fixes
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user