Public Access
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.
This commit is contained in:
@@ -28,7 +28,7 @@ class PlannerConfig:
|
||||
|
||||
# Set selection
|
||||
top_k: int = 20 # how many feasible recipes to enumerate over
|
||||
set_size: int = 3 # 3 dinners/week
|
||||
set_size: int = 21 # 21 meals/week (3 per day × 7 days)
|
||||
p_protein: float = 0.15 # diversity penalty per shared-protein pair
|
||||
p_cuisine: float = 0.10 # diversity penalty per shared-cuisine pair
|
||||
|
||||
|
||||
@@ -177,11 +177,14 @@ def generate_meal_plan(
|
||||
db.flush()
|
||||
|
||||
for index, scored_recipe in enumerate(chosen):
|
||||
day = (index % 7) + 1 # 1..7 (Mon..Sun)
|
||||
meal_type_index = index // 7 # 0=breakfast, 1=lunch, 2=dinner
|
||||
meal_type = [MealType.BREAKFAST, MealType.LUNCH, MealType.DINNER][meal_type_index]
|
||||
item = MealPlanItem(
|
||||
meal_plan_id=plan.id,
|
||||
recipe_id=scored_recipe.recipe_id,
|
||||
day_of_week=index + 1, # Mon=1, Tue=2, Wed=3 by default
|
||||
meal_type=MealType.DINNER,
|
||||
day_of_week=day,
|
||||
meal_type=meal_type,
|
||||
approval_status=MealPlanItemStatus.pending,
|
||||
estimated_cost=scored_recipe.cost.total_cost,
|
||||
)
|
||||
|
||||
Reference in New Issue
Block a user