diff --git a/backend/evaluation_helper.py b/backend/evaluation_helper.py index 57cf7ee..2071522 100644 --- a/backend/evaluation_helper.py +++ b/backend/evaluation_helper.py @@ -6,6 +6,7 @@ Issue: #15 Date: 2026-03-23 """ from typing import Dict, Optional, List +from decimal import Decimal import logging from db import get_cursor @@ -14,6 +15,21 @@ from profile_evaluator import TrainingProfileEvaluator logger = logging.getLogger(__name__) +def convert_decimals(obj): + """ + Recursively converts Decimal objects to float for JSON serialization. + + PostgreSQL returns numeric values as Decimal, but psycopg2.Json() can't serialize them. + """ + if isinstance(obj, Decimal): + return float(obj) + elif isinstance(obj, dict): + return {k: convert_decimals(v) for k, v in obj.items()} + elif isinstance(obj, list): + return [convert_decimals(item) for item in obj] + return obj + + def load_parameters_registry(cur) -> Dict[str, Dict]: """ Loads training parameters registry from database. @@ -145,17 +161,24 @@ def evaluate_and_save_activity( lookback_days=30 ) + # Convert Decimal values in activity_data and context + activity_data_clean = convert_decimals(activity_data) + context_clean = convert_decimals(context) + # Evaluate evaluator = TrainingProfileEvaluator(parameters) evaluation_result = evaluator.evaluate_activity( - activity_data, + activity_data_clean, profile, - context + context_clean ) # Save to database from psycopg2.extras import Json + # Convert Decimal to float for JSON serialization + evaluation_result_clean = convert_decimals(evaluation_result) + cur.execute(""" UPDATE activity_log SET evaluation = %s, @@ -163,9 +186,9 @@ def evaluate_and_save_activity( overall_score = %s WHERE id = %s """, ( - Json(evaluation_result), - evaluation_result.get("quality_label"), - evaluation_result.get("overall_score"), + Json(evaluation_result_clean), + evaluation_result_clean.get("quality_label"), + evaluation_result_clean.get("overall_score"), activity_id ))