UI web d'admin + garde-fou recettes premium (supplément hors abonnement)
- Refus des recettes payantes (chargeSetting) à la sélection, override allow_premium - Recipe.surcharge_cents/is_premium exposés dans summary(); propose() les exclut - hellofresh/webui.py : page d'admin + API JSON montées sur FastMCP (/, /api/*) édition à chaud des excludes et préférences (liked/disliked)
This commit is contained in:
@@ -38,7 +38,7 @@ def save_excludes(terms: list[str]) -> None:
|
||||
if EXCLUDES_PATH.exists():
|
||||
existing = json.loads(EXCLUDES_PATH.read_text(encoding="utf-8"))
|
||||
existing["exclude"] = terms
|
||||
EXCLUDES_PATH.write_text(json.dumps(existing, indent=2, ensure_ascii=False), encoding="utf-8")
|
||||
EXCLUDES_PATH.write_text(json.dumps(existing, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
|
||||
|
||||
|
||||
def add_exclude(term: str) -> list[str]:
|
||||
@@ -63,6 +63,17 @@ def load_prefs() -> dict:
|
||||
return {"liked": data.get("liked", []), "disliked": data.get("disliked", [])}
|
||||
|
||||
|
||||
def save_prefs(liked: list[str], disliked: list[str]) -> dict:
|
||||
"""Écrit liked/disliked en préservant le commentaire éventuel du fichier."""
|
||||
existing = {}
|
||||
if PREFS_PATH.exists():
|
||||
existing = json.loads(PREFS_PATH.read_text(encoding="utf-8"))
|
||||
existing["liked"] = liked
|
||||
existing["disliked"] = disliked
|
||||
PREFS_PATH.write_text(json.dumps(existing, indent=2, ensure_ascii=False) + "\n", encoding="utf-8")
|
||||
return {"liked": liked, "disliked": disliked}
|
||||
|
||||
|
||||
# --- application aux recettes ----------------------------------------------
|
||||
def _exclusion_haystack(recipe: Recipe) -> str:
|
||||
"""Champs FAISANT FOI pour l'exclusion : ingrédients, allergènes, nom, accroche.
|
||||
@@ -115,9 +126,14 @@ def annotate(recipes: list[Recipe]) -> list[Recipe]:
|
||||
return recipes
|
||||
|
||||
|
||||
def propose(recipes: list[Recipe], count: int | None = None) -> list[Recipe]:
|
||||
"""Retire les recettes exclues (coco…) et classe le reste par score décroissant."""
|
||||
def propose(recipes: list[Recipe], count: int | None = None,
|
||||
allow_premium: bool = False) -> list[Recipe]:
|
||||
"""Retire les recettes exclues (coco…) et payantes, classe le reste par score décroissant.
|
||||
|
||||
`allow_premium=True` conserve les recettes à supplément (hors abonnement) dans la liste.
|
||||
"""
|
||||
annotate(recipes)
|
||||
safe = [r for r in recipes if not r.contains_excluded]
|
||||
safe = [r for r in recipes
|
||||
if not r.contains_excluded and (allow_premium or not r.is_premium)]
|
||||
safe.sort(key=lambda r: r.score, reverse=True)
|
||||
return safe[:count] if count else safe
|
||||
|
||||
Reference in New Issue
Block a user