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:
jerem
2026-06-18 18:07:12 +02:00
parent a14ce4664b
commit 61ee7f02a4
6 changed files with 358 additions and 10 deletions

View File

@@ -52,12 +52,20 @@ class Recipe:
image_url: str = ""
prep_time: str = ""
course_index: int | None = None # index du course dans le menu (sert à l'écriture)
# Supplément hors abonnement (rempli depuis le menu) : 0 = inclus, >0 = surcoût en centimes
surcharge_cents: int = 0
surcharge_reason: str = "" # ex. "premium" (motif renvoyé par chargeSetting)
# Champs calculés par le filtre (remplis plus tard)
contains_excluded: bool = False
matched_excludes: list[str] = field(default_factory=list)
score: float = 0.0
is_favorite: bool = False # rempli par api (best-effort) depuis le service favoris
@property
def is_premium(self) -> bool:
"""True si la recette coûte un supplément (non incluse dans l'abonnement)."""
return self.surcharge_cents > 0
@classmethod
def from_api(cls, raw: dict[str, Any]) -> "Recipe":
"""Construit une Recipe depuis un objet recette brut de l'API gateway.
@@ -123,6 +131,9 @@ class Recipe:
"image_url": fix_image_url(self.image_url),
"prep_time": self.prep_time,
"prep_minutes": _iso_duration_to_minutes(self.prep_time),
"is_premium": self.is_premium,
"surcharge_eur": round(self.surcharge_cents / 100, 2) if self.surcharge_cents else 0,
"surcharge_reason": self.surcharge_reason,
"allergens": self.allergens,
"contains_excluded": self.contains_excluded,
"matched_excludes": self.matched_excludes,