Correction Bug - Pondération des Critères et Normalisation
Problème Résolu
Description du Bug
Lors de la modification d’un projet avec l’ajout de nouvelles pondérations de critères, une erreur HTTP 500 se produisait côté serveur. Le problème était double :
-
Erreur de conversion de type : Le code backend tentait d’appeler
.dict()
sur des objets qui pouvaient déjà être des dictionnaires -
Dépassement de poids : La somme des poids pouvait dépasser 1.0 (ex: 0.4 + 0.4 + 0.2 + 0.4 = 1.4)
Solution Implémentée
Gestion Intelligente des Types
Le code dans service-selection/app/main.py
a été corrigé pour gérer différents types de données :
# Gestion robuste des critères
if 'criteria' in update_data and update_data['criteria']:
criteria = update_data['criteria']
if hasattr(criteria, 'dict'):
# C'est un objet Pydantic
update_data['criteria'] = criteria.dict()
elif isinstance(criteria, dict):
# C'est déjà un dictionnaire
update_data['criteria'] = criteria
else:
# Autre cas, essayer la conversion
update_data['criteria'] = dict(criteria)
# Gestion robuste des poids
if 'weights' in update_data and update_data['weights']:
weights = update_data['weights']
converted_weights = []
for weight in weights:
if hasattr(weight, 'dict'):
converted_weights.append(weight.dict())
elif isinstance(weight, dict):
converted_weights.append(weight)
else:
converted_weights.append(dict(weight))
Normalisation Automatique des Poids
Un système de normalisation automatique a été ajouté :
# Normaliser les poids si leur somme dépasse 1.0
total_weight = sum(w.get('weight', 0) for w in converted_weights)
if total_weight > 1.0:
logger.warning(f"Normalisation des poids: somme {total_weight} > 1.0")
for weight in converted_weights:
weight['weight'] = weight.get('weight', 0) / total_weight
Comportement Après Correction
Scénarios Gérés
-
Objets Pydantic : Conversion avec
.dict()
-
Dictionnaires existants : Utilisation directe
-
Autres types : Tentative de conversion avec
dict()
-
Somme > 1.0 : Normalisation automatique proportionnelle
Exemple de Normalisation
Si l’utilisateur définit les poids suivants :
- ethical_score: 0.4 (40%) - technical_score: 0.4 (40%) - popularity_score: 0.2 (20%) - documentation: 0.4 (40%) Total: 1.4 (140%)
Le système normalise automatiquement :
- ethical_score: 0.286 (28.6%) - technical_score: 0.286 (28.6%) - popularity_score: 0.143 (14.3%) - documentation: 0.286 (28.6%) Total: 1.0 (100%)