Spaces:
Runtime error
Runtime error
| import streamlit as st | |
| import pandas as pd | |
| from datetime import datetime, timedelta | |
| from server.db.dbmanager import get_db_manager, load_chatbot_suggestions | |
| db_manager = get_db_manager() | |
| user_id = st.session_state["user_id"] | |
| def get_week_dates(year, week): | |
| """Retourne les dates du Lundi au Dimanche pour une semaine donnée.""" | |
| first_day_of_year = datetime(year, 1, 1) | |
| first_monday = first_day_of_year + timedelta( | |
| days=(7 - first_day_of_year.weekday()) | |
| ) # Trouver le premier lundi | |
| start_date = first_monday + timedelta( | |
| weeks=week - 1 | |
| ) # Trouver le début de la semaine sélectionnée | |
| return [ | |
| (start_date + timedelta(days=i)).strftime("%Y-%m-%d") for i in range(7) | |
| ] # 7 jours (Lundi → Dimanche) | |
| def mealplan(): | |
| # 📆 Sélection de l'année et de la semaine | |
| current_year = datetime.now().year | |
| current_week = datetime.now().isocalendar()[1] | |
| year_options = list( | |
| range(current_year, current_year - 3, -1) | |
| ) # Années en ordre décroissant | |
| col1, col2 = st.columns([0.5, 0.5]) # Réduction de la largeur des sélecteurs | |
| with col1: | |
| selected_year = st.selectbox("📅 Année", year_options, index=0) | |
| with col2: | |
| week_options = [f"Semaine {i}" for i in range(1, 53)] | |
| selected_week_label = st.selectbox( | |
| "📆 Semaine", | |
| week_options, | |
| index=week_options.index(f"Semaine {current_week}"), | |
| ) | |
| selected_week = int(selected_week_label.split(" ")[1]) | |
| # 📌 Génération des 7 jours de la semaine sélectionnée | |
| week_dates = get_week_dates(selected_year, selected_week) | |
| # 📋 Initialisation des repas | |
| if "meal_plan" not in st.session_state: | |
| st.session_state["meal_plan"] = {} | |
| for date in week_dates: | |
| if date not in st.session_state["meal_plan"]: | |
| st.session_state["meal_plan"][date] = { | |
| "Petit-déjeuner": "", | |
| "Déjeuner": "", | |
| "Dîner": "", | |
| } | |
| # 📋 Affichage du planning pour 7 jours | |
| st.subheader(f"📆 Planning des repas - {selected_week_label} ({selected_year})") | |
| df = pd.DataFrame.from_dict( | |
| {date: st.session_state["meal_plan"][date] for date in week_dates}, | |
| orient="index", | |
| ) | |
| df.index = pd.to_datetime(df.index).strftime( | |
| "%A %d %B" | |
| ) # Affichage clair des jours | |
| st.dataframe(df, use_container_width=True) | |
| # ✅ **Message de validation persistant** | |
| if "validation_msg" in st.session_state: | |
| st.success(st.session_state["validation_msg"]) | |
| st.session_state.pop( | |
| "validation_msg" | |
| ) # Supprimer après affichage pour éviter la persistance infinie | |
| # 🍽️ **Modification et Suppression d'un Repas** | |
| st.subheader("✍️ Modifier un repas") | |
| selected_day = st.selectbox("📅 Choisissez un jour", week_dates) | |
| selected_meal = st.selectbox( | |
| "🍽️ Sélectionnez le repas", ["Petit-déjeuner", "Déjeuner", "Dîner"] | |
| ) | |
| # 📌 **Prévisualisation du repas existant** | |
| existing_meal = st.session_state["meal_plan"][selected_day][selected_meal] | |
| if existing_meal: | |
| st.markdown(f"🔹 **Repas actuel pour {selected_meal} :**\n> {existing_meal}") | |
| with st.form("meal_form"): | |
| meal_input = st.text_area( | |
| f"Ajoutez un plat pour {selected_meal} ({selected_day})", | |
| value=existing_meal, | |
| ) # Pré-rempli avec le repas actuel | |
| col1, col2 = st.columns([0.7, 0.3]) | |
| with col1: | |
| submitted = st.form_submit_button("✅ Ajouter / Modifier") | |
| with col2: | |
| deleted = st.form_submit_button("❌ Supprimer le plat") | |
| if submitted: | |
| st.session_state["meal_plan"][selected_day][selected_meal] = meal_input | |
| st.session_state[ | |
| "validation_msg" | |
| ] = f"✅ {selected_meal} ajouté/modifié pour le {selected_day} avec succès !" | |
| st.rerun() | |
| if deleted: | |
| st.session_state["meal_plan"][selected_day][selected_meal] = "" | |
| st.session_state[ | |
| "validation_msg" | |
| ] = f"❌ {selected_meal} supprimé pour le {selected_day} !" | |
| st.rerun() | |
| # 🤖 Ajout des suggestions du chatbot | |
| st.subheader("🤖 Suggestions du Chatbot") | |
| # 🔹 Charger les suggestions enregistrées si elles ne sont pas déjà en mémoire | |
| if "chatbot_suggestions" not in st.session_state: | |
| st.session_state["chatbot_suggestions"] = load_chatbot_suggestions( | |
| db_manager, user_id | |
| ) | |
| if st.session_state["chatbot_suggestions"]: | |
| with st.form("chatbot_form"): | |
| selected_recipe = st.selectbox( | |
| "🔍 Sélectionnez une recette", st.session_state["chatbot_suggestions"] | |
| ) | |
| selected_day_for_recipe = st.selectbox( | |
| "📅 Assigner à quel jour ?", week_dates | |
| ) | |
| selected_meal_for_recipe = st.selectbox( | |
| "🍽️ Assigner à quel repas ?", ["Petit-déjeuner", "Déjeuner", "Dîner"] | |
| ) | |
| add_recipe = st.form_submit_button("➕ Ajouter la recette au planning") | |
| if add_recipe: | |
| st.session_state["meal_plan"][selected_day_for_recipe][ | |
| selected_meal_for_recipe | |
| ] += f"\n- {selected_recipe}" | |
| st.session_state[ | |
| "validation_msg" | |
| ] = f"✅ Recette ajoutée à {selected_meal_for_recipe} ({selected_day_for_recipe}) avec succès !" | |
| st.rerun() | |
| else: | |
| st.write("⚠️ Aucune suggestion du chatbot pour le moment.") | |
| # 📤 Exportation du planning en CSV | |
| if st.button("📥 Exporter en CSV"): | |
| df.to_csv("meal_plan.csv") | |
| st.success("✅ Plan exporté en CSV avec succès !") | |