Sahm269 commited on
Commit
3f892ff
·
verified ·
1 Parent(s): f6c016d

Upload 2 files

Browse files
Files changed (2) hide show
  1. server/db/dbmanager.py +132 -1
  2. server/db/schema.json +2 -2
server/db/dbmanager.py CHANGED
@@ -9,7 +9,7 @@ import pandas as pd
9
  from typing import List, Dict, Tuple
10
  import os
11
  import sys
12
-
13
  # Configuration du logging
14
  logging.basicConfig(level=logging.INFO, handlers=[logging.StreamHandler()])
15
  logger = logging.getLogger(__name__)
@@ -1051,3 +1051,134 @@ def save_chatbot_suggestions(db_manager, user_id, suggestions: List[Tuple]):
1051
  db_manager.connection.commit()
1052
  except sqlite3.Error as err: # Remplacer psycopg2.Error par sqlite3.Error pour SQLite
1053
  logger.error(f"Erreur lors de l'enregistrement des suggestions : {err}")
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
9
  from typing import List, Dict, Tuple
10
  import os
11
  import sys
12
+ import unicodedata
13
  # Configuration du logging
14
  logging.basicConfig(level=logging.INFO, handlers=[logging.StreamHandler()])
15
  logger = logging.getLogger(__name__)
 
1051
  db_manager.connection.commit()
1052
  except sqlite3.Error as err: # Remplacer psycopg2.Error par sqlite3.Error pour SQLite
1053
  logger.error(f"Erreur lors de l'enregistrement des suggestions : {err}")
1054
+
1055
+ def save_recipes_and_ingredients(db_manager, user_id: int, recipes: List[Dict[str, str]]):
1056
+ """
1057
+ Sauvegarde les recettes et leurs ingrédients en base de données.
1058
+
1059
+ Args:
1060
+ db_manager: Instance de DBManager.
1061
+ user_id (int): ID de l'utilisateur.
1062
+ recipes (List[Dict[str, str]]): Liste des recettes contenant "titre" et "ingredients".
1063
+ """
1064
+ query_recipe = """
1065
+ INSERT INTO suggestions_repas (id_utilisateur, repas_suggestion, motif_suggestion, date_heure)
1066
+ VALUES (?, ?, ?, CURRENT_TIMESTAMP)
1067
+ """
1068
+
1069
+ query_ingredients = """
1070
+ INSERT INTO liste_courses (id_utilisateur, ingredients, date_creation, status)
1071
+ VALUES (?, ?, CURRENT_TIMESTAMP, 'non acheté')
1072
+ """
1073
+
1074
+ try:
1075
+ for recipe in recipes:
1076
+ # Insérer le titre de la recette
1077
+ db_manager.cursor.execute(query_recipe, (user_id, recipe["titre"], "Chatbot"))
1078
+
1079
+ # Insérer les ingrédients associés
1080
+ db_manager.cursor.execute(query_ingredients, (user_id, recipe["ingredients"]))
1081
+
1082
+ db_manager.connection.commit()
1083
+ except sqlite3.Error as err:
1084
+ logger.error(f"❌ Erreur lors de l'enregistrement des recettes : {err}")
1085
+
1086
+
1087
+ def normalize_text(text):
1088
+ """Normalise un texte en supprimant les accents et en le mettant en minuscules"""
1089
+ text = text.lower().strip()
1090
+ text = unicodedata.normalize("NFKD", text).encode("ASCII", "ignore").decode("utf-8")
1091
+ return text
1092
+
1093
+ def save_recipes_with_ingredients(db_manager, user_id, title, ingredients):
1094
+ """
1095
+ Sauvegarde une recette et ses ingrédients en base de données,
1096
+ en évitant les doublons liés aux différences de majuscules ou d'accents.
1097
+ """
1098
+ if not ingredients:
1099
+ print(f"⚠️ La recette '{title}' n'a pas d'ingrédients à enregistrer.")
1100
+ return
1101
+
1102
+ # 🔹 Normaliser le titre pour éviter les doublons
1103
+ normalized_title = normalize_text(title)
1104
+
1105
+ # 🔹 Vérifier si la recette existe déjà (en ignorant les majuscules et accents)
1106
+ query_check = "SELECT id_suggestion FROM suggestions_repas WHERE LOWER(repas_suggestion) = LOWER(?) AND id_utilisateur = ?"
1107
+ result = db_manager.execute_safe(query_check, (normalized_title, user_id), fetch=True)
1108
+
1109
+ if result:
1110
+ recipe_id = result[0][0]
1111
+ # 🔹 Mise à jour des ingrédients si la recette existe déjà
1112
+ query_update = "UPDATE suggestions_repas SET ingredients = ? WHERE id_suggestion = ?"
1113
+ db_manager.execute_safe(query_update, (ingredients, recipe_id))
1114
+ print(f"🔄 Mise à jour des ingrédients pour '{title}'.")
1115
+ else:
1116
+ # 🔹 Insertion d'une nouvelle recette avec son titre et ingrédients
1117
+ query_insert = "INSERT INTO suggestions_repas (id_utilisateur, repas_suggestion, ingredients) VALUES (?, ?, ?)"
1118
+ db_manager.execute_safe(query_insert, (user_id, title, ingredients))
1119
+ print(f"✅ Recette '{title}' enregistrée avec ingrédients.")
1120
+
1121
+
1122
+
1123
+ def get_recipes_and_ingredients(db_manager, user_id: int) -> List[Dict[str, str]]:
1124
+ """
1125
+ Récupère les recettes et leurs ingrédients stockés en base.
1126
+
1127
+ Args:
1128
+ db_manager: Instance de DBManager.
1129
+ user_id (int): ID de l'utilisateur.
1130
+
1131
+ Returns:
1132
+ List[Dict[str, str]]: Liste des recettes avec leurs ingrédients.
1133
+ """
1134
+ query = """
1135
+ SELECT repas_suggestion, ingredients
1136
+ FROM suggestions_repas
1137
+ WHERE id_utilisateur = ?
1138
+ """
1139
+ try:
1140
+ db_manager.cursor.execute(query, (user_id,))
1141
+ recipes = [{"titre": row[0], "ingredients": row[1]} for row in db_manager.cursor.fetchall()]
1142
+ return recipes
1143
+ except sqlite3.Error as err:
1144
+ print(f"❌ Erreur lors de la récupération des recettes : {err}")
1145
+ return []
1146
+
1147
+ def add_ingredients_column_if_not_exists(db_manager):
1148
+ """
1149
+ Vérifie et ajoute la colonne 'ingredients' à la table 'suggestions_repas' si elle n'existe pas.
1150
+ """
1151
+ try:
1152
+ db_manager.cursor.execute("PRAGMA table_info(suggestions_repas);")
1153
+ columns = [row[1] for row in db_manager.cursor.fetchall()]
1154
+
1155
+ if "ingredients" not in columns:
1156
+ db_manager.cursor.execute("ALTER TABLE suggestions_repas ADD COLUMN ingredients TEXT;")
1157
+ db_manager.connection.commit()
1158
+ print("✅ Colonne 'ingredients' ajoutée avec succès.")
1159
+ else:
1160
+ print("✅ La colonne 'ingredients' existe déjà.")
1161
+ except sqlite3.Error as err:
1162
+ print(f"❌ Erreur lors de la mise à jour de la table : {err}")
1163
+
1164
+ def check_recipes_with_ingredients(db_manager, user_id):
1165
+ """
1166
+ Vérifie si les recettes enregistrées ont bien des ingrédients.
1167
+ """
1168
+ query = "SELECT repas_suggestion, ingredients FROM suggestions_repas WHERE id_utilisateur = ?"
1169
+
1170
+ try:
1171
+ db_manager.cursor.execute(query, (user_id,))
1172
+ results = db_manager.cursor.fetchall()
1173
+
1174
+ if results:
1175
+ print("✅ Recettes et ingrédients trouvés en base :")
1176
+ for row in results:
1177
+ print(f"📌 Recette: {row[0]} - Ingrédients: {row[1]}")
1178
+ else:
1179
+ print("⚠️ Aucune recette avec ingrédients trouvée en base.")
1180
+
1181
+ except sqlite3.Error as err:
1182
+ print(f"❌ Erreur lors de la récupération des recettes : {err}")
1183
+
1184
+
server/db/schema.json CHANGED
@@ -1,3 +1,3 @@
1
  version https://git-lfs.github.com/spec/v1
2
- oid sha256:92b0932c8f60048b055922f2022bccf01e3558d75e547e3a0b0a22634328ae4d
3
- size 4830
 
1
  version https://git-lfs.github.com/spec/v1
2
+ oid sha256:28d00cbc70ce3fb8309dd2ea0f01bb4e50787003bf002684dfdc5f5437dc3856
3
+ size 4891