From 9a484d39c344a9523f6529401522ce89f3f232dc Mon Sep 17 00:00:00 2001 From: Peter Woolery Date: Fri, 8 May 2026 21:29:53 -0700 Subject: [PATCH] feat: wire step_reminder into runner, admin, and scheduler (Fri 16:00 PT) --- backend/app/api/admin.py | 2 +- backend/app/scheduler/__main__.py | 7 +++++++ backend/app/services/orchestrator/runner.py | 3 ++- backend/tests/test_orchestrator.py | 2 +- 4 files changed, 11 insertions(+), 3 deletions(-) diff --git a/backend/app/api/admin.py b/backend/app/api/admin.py index 3e759cb..705b184 100644 --- a/backend/app/api/admin.py +++ b/backend/app/api/admin.py @@ -167,7 +167,7 @@ def get_stats(db: Session = Depends(get_db)): } -_VALID_STEPS = {"scrape", "generate", "email", "deadline", "finalize"} +_VALID_STEPS = {"scrape", "generate", "email", "reminder", "deadline", "finalize"} @router.get("/orchestrate/status") diff --git a/backend/app/scheduler/__main__.py b/backend/app/scheduler/__main__.py index 6fd6bd0..93e0380 100644 --- a/backend/app/scheduler/__main__.py +++ b/backend/app/scheduler/__main__.py @@ -7,6 +7,7 @@ Weekly cadence (America/Los_Angeles): Fri 02:00 — scrape (Lucky weekend prices live by ~midnight) Fri 05:00 — generate (fresh grocery data) Fri 06:00 — email (per-voter approval links) + Fri 16:00 — reminder (nudge non-voters, 1h before deadline) Fri 17:00 — deadline (pending items resolved per family policy) Fri 18:00 — finalize (shopping-list email) """ @@ -45,6 +46,12 @@ scheduler.add_job( id="weekly_email", name="Weekly email (Fri 06:00 PT)", ) +scheduler.add_job( + lambda: run_step("reminder"), + CronTrigger(day_of_week="fri", hour=16, minute=0, timezone=TZ), + id="weekly_reminder", + name="Weekly reminder (Fri 16:00 PT)", +) scheduler.add_job( lambda: run_step("deadline"), CronTrigger(day_of_week="fri", hour=17, minute=0, timezone=TZ), diff --git a/backend/app/services/orchestrator/runner.py b/backend/app/services/orchestrator/runner.py index 758f5ac..da9f398 100644 --- a/backend/app/services/orchestrator/runner.py +++ b/backend/app/services/orchestrator/runner.py @@ -14,7 +14,7 @@ from app.database import SessionLocal logger = logging.getLogger(__name__) -STEPS = ("scrape", "generate", "email", "deadline", "finalize") +STEPS = ("scrape", "generate", "email", "reminder", "deadline", "finalize") def _current_week_start() -> date: @@ -55,6 +55,7 @@ def run_step(step_name: str, week_start_date: Optional[date] = None) -> None: "scrape": s.step_scrape, "generate": s.step_generate, "email": s.step_email, + "reminder": s.step_reminder, "deadline": s.step_deadline, "finalize": s.step_finalize, } diff --git a/backend/tests/test_orchestrator.py b/backend/tests/test_orchestrator.py index c09960a..d4a8c59 100644 --- a/backend/tests/test_orchestrator.py +++ b/backend/tests/test_orchestrator.py @@ -568,7 +568,7 @@ def test_run_week_calls_all_steps(monkeypatch): ) from app.services.orchestrator.runner import run_week run_week(WEEK) - assert called == ["scrape", "generate", "email", "deadline", "finalize"] + assert called == ["scrape", "generate", "email", "reminder", "deadline", "finalize"] # ---------------------------------------------------------------------------