Fix bugs, add auto-refresh, quick-complete tasks, and every-N-day routines

- Fix bot auth: merge duplicate on_ready handlers so session restore runs (#13)
- Fix push notifications: pass Uint8Array directly as applicationServerKey (#6)
- Show specific conflict reason on schedule save instead of generic error (#17)
- Add inline checkmark button to complete tasks on routines timeline (#18)
- Add visibility-change + 60s polling auto-refresh to routines, meds, tasks (#15)
- Add every-N-day routine scheduling: schema, API, scheduler, and UI (#16)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-02-19 19:04:52 -06:00
parent 24a1d18b25
commit ecb79af44e
10 changed files with 288 additions and 96 deletions

View File

@@ -108,6 +108,8 @@ def check_medication_reminders():
def check_routine_reminders():
"""Check for scheduled routines due now and send notifications."""
try:
from datetime import date as date_type
schedules = postgres.select("routine_schedules", where={"remind": True})
for schedule in schedules:
@@ -117,13 +119,30 @@ def check_routine_reminders():
now = _user_now_for(routine["user_uuid"])
current_time = now.strftime("%H:%M")
current_day = now.strftime("%a").lower()
today = now.date()
if current_time != schedule.get("time"):
continue
days = schedule.get("days", [])
if current_day not in days:
continue
frequency = schedule.get("frequency", "weekly")
if frequency == "every_n_days":
start = schedule.get("start_date")
interval = schedule.get("interval_days")
if start and interval:
start_d = (
start
if isinstance(start, date_type)
else datetime.strptime(str(start), "%Y-%m-%d").date()
)
if (today - start_d).days < 0 or (today - start_d).days % interval != 0:
continue
else:
continue
else:
current_day = now.strftime("%a").lower()
days = schedule.get("days", [])
if current_day not in days:
continue
user_settings = notifications.getNotificationSettings(routine["user_uuid"])
if user_settings: