Sahm269 commited on
Commit
bb832a9
·
verified ·
1 Parent(s): 620ed77

Update client/pages/user__mealplan.py

Browse files
Files changed (1) hide show
  1. client/pages/user__mealplan.py +159 -152
client/pages/user__mealplan.py CHANGED
@@ -1,152 +1,159 @@
1
- import streamlit as st
2
- import pandas as pd
3
- from datetime import datetime, timedelta
4
- from server.db.dbmanager import get_db_manager, load_chatbot_suggestions
5
-
6
- db_manager = get_db_manager()
7
- user_id = st.session_state["user_id"]
8
-
9
-
10
- def get_week_dates(year, week):
11
- """Retourne les dates du Lundi au Dimanche pour une semaine donnée."""
12
- first_day_of_year = datetime(year, 1, 1)
13
- first_monday = first_day_of_year + timedelta(
14
- days=(7 - first_day_of_year.weekday())
15
- ) # Trouver le premier lundi
16
- start_date = first_monday + timedelta(
17
- weeks=week - 1
18
- ) # Trouver le début de la semaine sélectionnée
19
- return [
20
- (start_date + timedelta(days=i)).strftime("%Y-%m-%d") for i in range(7)
21
- ] # 7 jours (Lundi → Dimanche)
22
-
23
-
24
- def mealplan():
25
- # 📆 Sélection de l'année et de la semaine
26
- current_year = datetime.now().year
27
- current_week = datetime.now().isocalendar()[1]
28
-
29
- year_options = list(
30
- range(current_year, current_year - 3, -1)
31
- ) # Années en ordre décroissant
32
- col1, col2 = st.columns([0.5, 0.5]) # Réduction de la largeur des sélecteurs
33
- with col1:
34
- selected_year = st.selectbox("📅 Année", year_options, index=0)
35
- with col2:
36
- week_options = [f"Semaine {i}" for i in range(1, 53)]
37
- selected_week_label = st.selectbox(
38
- "📆 Semaine",
39
- week_options,
40
- index=week_options.index(f"Semaine {current_week}"),
41
- )
42
- selected_week = int(selected_week_label.split(" ")[1])
43
-
44
- # 📌 Génération des 7 jours de la semaine sélectionnée
45
- week_dates = get_week_dates(selected_year, selected_week)
46
-
47
- # 📋 Initialisation des repas
48
- if "meal_plan" not in st.session_state:
49
- st.session_state["meal_plan"] = {}
50
-
51
- for date in week_dates:
52
- if date not in st.session_state["meal_plan"]:
53
- st.session_state["meal_plan"][date] = {
54
- "Petit-déjeuner": "",
55
- "Déjeuner": "",
56
- "Dîner": "",
57
- }
58
-
59
- # 📋 Affichage du planning pour 7 jours
60
- st.subheader(f"📆 Planning des repas - {selected_week_label} ({selected_year})")
61
- df = pd.DataFrame.from_dict(
62
- {date: st.session_state["meal_plan"][date] for date in week_dates},
63
- orient="index",
64
- )
65
- df.index = pd.to_datetime(df.index).strftime(
66
- "%A %d %B"
67
- ) # Affichage clair des jours
68
- st.dataframe(df, use_container_width=True)
69
-
70
- # ✅ **Message de validation persistant**
71
- if "validation_msg" in st.session_state:
72
- st.success(st.session_state["validation_msg"])
73
- st.session_state.pop(
74
- "validation_msg"
75
- ) # Supprimer après affichage pour éviter la persistance infinie
76
-
77
- # 🍽️ **Modification et Suppression d'un Repas**
78
- st.subheader("✍️ Modifier un repas")
79
-
80
- selected_day = st.selectbox("📅 Choisissez un jour", week_dates)
81
- selected_meal = st.selectbox(
82
- "🍽️ Sélectionnez le repas", ["Petit-déjeuner", "Déjeuner", "Dîner"]
83
- )
84
-
85
- # 📌 **Prévisualisation du repas existant**
86
- existing_meal = st.session_state["meal_plan"][selected_day][selected_meal]
87
- if existing_meal:
88
- st.markdown(f"🔹 **Repas actuel pour {selected_meal} :**\n> {existing_meal}")
89
-
90
- with st.form("meal_form"):
91
- meal_input = st.text_area(
92
- f"Ajoutez un plat pour {selected_meal} ({selected_day})",
93
- value=existing_meal,
94
- ) # Pré-rempli avec le repas actuel
95
-
96
- col1, col2 = st.columns([0.7, 0.3])
97
- with col1:
98
- submitted = st.form_submit_button("✅ Ajouter / Modifier")
99
- with col2:
100
- deleted = st.form_submit_button("❌ Supprimer le plat")
101
-
102
- if submitted:
103
- st.session_state["meal_plan"][selected_day][selected_meal] = meal_input
104
- st.session_state[
105
- "validation_msg"
106
- ] = f"✅ {selected_meal} ajouté/modifié pour le {selected_day} avec succès !"
107
- st.rerun()
108
-
109
- if deleted:
110
- st.session_state["meal_plan"][selected_day][selected_meal] = ""
111
- st.session_state[
112
- "validation_msg"
113
- ] = f"❌ {selected_meal} supprimé pour le {selected_day} !"
114
- st.rerun()
115
-
116
- # 🤖 Ajout des suggestions du chatbot
117
- st.subheader("🤖 Suggestions du Chatbot")
118
-
119
- # 🔹 Charger les suggestions enregistrées si elles ne sont pas déjà en mémoire
120
- if "chatbot_suggestions" not in st.session_state:
121
- st.session_state["chatbot_suggestions"] = load_chatbot_suggestions(
122
- db_manager, user_id
123
- )
124
-
125
- if st.session_state["chatbot_suggestions"]:
126
- with st.form("chatbot_form"):
127
- selected_recipe = st.selectbox(
128
- "🔍 Sélectionnez une recette", st.session_state["chatbot_suggestions"]
129
- )
130
- selected_day_for_recipe = st.selectbox(
131
- "📅 Assigner à quel jour ?", week_dates
132
- )
133
- selected_meal_for_recipe = st.selectbox(
134
- "🍽️ Assigner à quel repas ?", ["Petit-déjeuner", "Déjeuner", "Dîner"]
135
- )
136
-
137
- add_recipe = st.form_submit_button("➕ Ajouter la recette au planning")
138
- if add_recipe:
139
- st.session_state["meal_plan"][selected_day_for_recipe][
140
- selected_meal_for_recipe
141
- ] += f"\n- {selected_recipe}"
142
- st.session_state[
143
- "validation_msg"
144
- ] = f"✅ Recette ajoutée à {selected_meal_for_recipe} ({selected_day_for_recipe}) avec succès !"
145
- st.rerun()
146
- else:
147
- st.write("⚠️ Aucune suggestion du chatbot pour le moment.")
148
-
149
- # 📤 Exportation du planning en CSV
150
- if st.button("📥 Exporter en CSV"):
151
- df.to_csv("meal_plan.csv")
152
- st.success("✅ Plan exporté en CSV avec succès !")
 
 
 
 
 
 
 
 
1
+ import streamlit as st
2
+ import pandas as pd
3
+ from datetime import datetime, timedelta
4
+ from server.db.dbmanager import get_db_manager, load_chatbot_suggestions
5
+
6
+ db_manager = get_db_manager()
7
+ user_id = st.session_state["user_id"]
8
+
9
+
10
+ def get_week_dates(year, week):
11
+ """Retourne les dates du Lundi au Dimanche pour une semaine donnée."""
12
+ first_day_of_year = datetime(year, 1, 1)
13
+ first_monday = first_day_of_year + timedelta(
14
+ days=(7 - first_day_of_year.weekday())
15
+ ) # Trouver le premier lundi
16
+ start_date = first_monday + timedelta(
17
+ weeks=week - 1
18
+ ) # Trouver le début de la semaine sélectionnée
19
+ return [
20
+ (start_date + timedelta(days=i)).strftime("%Y-%m-%d") for i in range(7)
21
+ ] # 7 jours (Lundi → Dimanche)
22
+
23
+
24
+ def mealplan():
25
+ # 📆 Sélection de l'année et de la semaine
26
+ current_year = datetime.now().year
27
+ current_week = datetime.now().isocalendar()[1]
28
+
29
+ year_options = list(
30
+ range(current_year, current_year - 3, -1)
31
+ ) # Années en ordre décroissant
32
+ col1, col2 = st.columns([0.5, 0.5]) # Réduction de la largeur des sélecteurs
33
+ with col1:
34
+ selected_year = st.selectbox("📅 Année", year_options, index=0)
35
+ with col2:
36
+ week_options = [f"Semaine {i}" for i in range(1, 53)]
37
+ selected_week_label = st.selectbox(
38
+ "📆 Semaine",
39
+ week_options,
40
+ index=week_options.index(f"Semaine {current_week}"),
41
+ )
42
+ selected_week = int(selected_week_label.split(" ")[1])
43
+
44
+ # 📌 Génération des 7 jours de la semaine sélectionnée
45
+ week_dates = get_week_dates(selected_year, selected_week)
46
+
47
+ # 📋 Initialisation des repas
48
+ if "meal_plan" not in st.session_state:
49
+ st.session_state["meal_plan"] = {}
50
+
51
+ for date in week_dates:
52
+ if date not in st.session_state["meal_plan"]:
53
+ st.session_state["meal_plan"][date] = {
54
+ "Petit-déjeuner": "",
55
+ "Déjeuner": "",
56
+ "Dîner": "",
57
+ }
58
+
59
+ # 📋 Affichage du planning pour 7 jours
60
+ st.subheader(f"📆 Planning des repas - {selected_week_label} ({selected_year})")
61
+ df = pd.DataFrame.from_dict(
62
+ {date: st.session_state["meal_plan"][date] for date in week_dates},
63
+ orient="index",
64
+ )
65
+ df.index = pd.to_datetime(df.index).strftime(
66
+ "%A %d %B"
67
+ ) # Affichage clair des jours
68
+ st.dataframe(df, use_container_width=True)
69
+
70
+ # ✅ **Message de validation persistant**
71
+ if "validation_msg" in st.session_state:
72
+ st.success(st.session_state["validation_msg"])
73
+ st.session_state.pop(
74
+ "validation_msg"
75
+ ) # Supprimer après affichage pour éviter la persistance infinie
76
+
77
+ # 🍽️ **Modification et Suppression d'un Repas**
78
+ st.subheader("✍️ Modifier un repas")
79
+
80
+ selected_day = st.selectbox("📅 Choisissez un jour", week_dates)
81
+ selected_meal = st.selectbox(
82
+ "🍽️ Sélectionnez le repas", ["Petit-déjeuner", "Déjeuner", "Dîner"]
83
+ )
84
+
85
+ # 📌 **Prévisualisation du repas existant**
86
+ existing_meal = st.session_state["meal_plan"][selected_day][selected_meal]
87
+ if existing_meal:
88
+ st.markdown(f"🔹 **Repas actuel pour {selected_meal} :**\n> {existing_meal}")
89
+
90
+ with st.form("meal_form"):
91
+ meal_input = st.text_area(
92
+ f"Ajoutez un plat pour {selected_meal} ({selected_day})",
93
+ value=existing_meal,
94
+ ) # Pré-rempli avec le repas actuel
95
+
96
+ col1, col2 = st.columns([0.7, 0.3])
97
+ with col1:
98
+ submitted = st.form_submit_button("✅ Ajouter / Modifier")
99
+ with col2:
100
+ deleted = st.form_submit_button("❌ Supprimer le plat")
101
+
102
+ if submitted:
103
+ st.session_state["meal_plan"][selected_day][selected_meal] = meal_input
104
+ st.session_state[
105
+ "validation_msg"
106
+ ] = f"✅ {selected_meal} ajouté/modifié pour le {selected_day} avec succès !"
107
+ st.rerun()
108
+
109
+ if deleted:
110
+ st.session_state["meal_plan"][selected_day][selected_meal] = ""
111
+ st.session_state[
112
+ "validation_msg"
113
+ ] = f"❌ {selected_meal} supprimé pour le {selected_day} !"
114
+ st.rerun()
115
+
116
+ # 🤖 Ajout des suggestions du chatbot
117
+ st.subheader("🤖 Suggestions du Chatbot")
118
+
119
+ # 🔹 Charger les suggestions enregistrées si elles ne sont pas déjà en mémoire
120
+ if "chatbot_suggestions" not in st.session_state:
121
+ st.session_state["chatbot_suggestions"] = load_chatbot_suggestions(
122
+ db_manager, user_id
123
+ )
124
+
125
+ if st.session_state["chatbot_suggestions"]:
126
+ with st.form("chatbot_form"):
127
+ selected_recipe = st.selectbox(
128
+ "🔍 Sélectionnez une recette", st.session_state["chatbot_suggestions"]
129
+ )
130
+ selected_day_for_recipe = st.selectbox(
131
+ "📅 Assigner à quel jour ?", week_dates
132
+ )
133
+ selected_meal_for_recipe = st.selectbox(
134
+ "🍽️ Assigner à quel repas ?", ["Petit-déjeuner", "Déjeuner", "Dîner"]
135
+ )
136
+
137
+ add_recipe = st.form_submit_button("➕ Ajouter la recette au planning")
138
+ if add_recipe:
139
+ st.session_state["meal_plan"][selected_day_for_recipe][
140
+ selected_meal_for_recipe
141
+ ] += f"\n- {selected_recipe}"
142
+ st.session_state[
143
+ "validation_msg"
144
+ ] = f"✅ Recette ajoutée à {selected_meal_for_recipe} ({selected_day_for_recipe}) avec succès !"
145
+ st.rerun()
146
+ else:
147
+ st.write("⚠️ Aucune suggestion du chatbot pour le moment.")
148
+
149
+ # 📤 Exportation du planning en CSV
150
+ if st.download_button(
151
+ label="📥 Exporter en CSV",
152
+ data=df.to_csv(index=False,sep=";").encode('utf-8'),
153
+ file_name="meal_plan.csv",
154
+ mime="text/csv"):
155
+ st.success("✅ Plan exporté en CSV avec succès !")
156
+
157
+ # if st.button("📥 Exporter en CSV"):
158
+ # df.to_csv("meal_plan.csv")
159
+ # st.success("✅ Plan exporté en CSV avec succès !")