Spaces:
Sleeping
Sleeping
Upload 2 files
Browse files- server/db/dbmanager.py +132 -1
- 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:
|
3 |
-
size
|
|
|
1 |
version https://git-lfs.github.com/spec/v1
|
2 |
+
oid sha256:28d00cbc70ce3fb8309dd2ea0f01bb4e50787003bf002684dfdc5f5437dc3856
|
3 |
+
size 4891
|