v9d Phase 2d: Vitals Module Refactoring (Baseline + Blood Pressure) #22
|
|
@ -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
|
||||
))
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user