admin
7b5e65087e
feat: 21 meals per week (3/day) + approve/deny + generate single meal
...
Backend:
- Planner config: set_size=21 (was 3), top_k=30 (was 20)
- generate.py: distribute 21 recipes across 7 days × 3 meal types
- meals.py: add POST /items/{id}/approve, /items/{id}/deny
- meals.py: add POST /{plan_id}/generate-item for empty slots
Frontend:
- Dashboard: Approve/Deny buttons on pending meal cards
- Dashboard: Generate button in empty meal slots
- API client: approveItem, denyItem, generateItem methods
Build: TypeScript compiles clean, Python syntax verified.
2026-05-15 11:44:04 -07:00
admin
6323eadc86
fix: test-email actually sends; vote page pre-checks existing votes; lowercase MealPlanItemStatus everywhere
...
- /api/admin/test-email now calls get_email_backend().send() instead of only logging.
- /api/meals/vote/{id} GET now queries MealPlanVote and renders 'already voted' confirmation if found.
- api/meals.py: fix remaining uppercase MealPlanItemStatus enum ref (DENIED, APPROVED, PENDING).
- Fixes the 'all meals show as pending' status regression and the 'Error: Already voted' bug.
2026-05-14 12:17:44 -07:00
admin
3f92e1f641
feat: planner orchestrator - load, filter, score, select, persist
2026-05-06 09:11:53 -07:00
admin
63e292a995
feat: planner top-K set enumeration with protein/cuisine diversity penalty
2026-05-06 06:48:26 -07:00
admin
77813cc7d3
feat: planner per-recipe scoring with 5 weighted signals
2026-05-06 06:44:58 -07:00
admin
95396137c6
feat: planner hard-constraint filter for the 6 spec constraints
2026-05-06 06:42:49 -07:00
admin
bf0a327561
feat: planner cost+savings estimator against ingredient_grocery_match
2026-05-06 06:40:33 -07:00
admin
c86321908c
feat: planner config (weights, thresholds, K) and shared types
2026-05-06 06:38:26 -07:00