from tools.helpers import serialize_charts def serialize_snapshot(snapshot): if not snapshot: return None def _safe_dump(obj): if obj is None: return None if isinstance(obj, dict): return obj if hasattr(obj, "model_dump"): return obj.model_dump() return str(obj) return { "id": str(snapshot.id) if snapshot.id else None, "week_start": str(snapshot.week_start) if snapshot.week_start else None, "training_state": snapshot.training_state, "health_signal": snapshot.health_signal, "positioning_status": snapshot.positioning_status, "positioning_change": snapshot.positioning_change, "goal_trajectory": snapshot.goal_trajectory, "goal_progress_pct": snapshot.goal_progress_pct, "next_run": snapshot.next_run, "training_focus": snapshot.training_focus, "training_why": snapshot.training_why, "key_insight": snapshot.key_insight, "forward_focus": snapshot.forward_focus, "weekly_distance_km": snapshot.weekly_distance_km, "num_runs": snapshot.num_runs, "run_count": snapshot.run_count, "consistency_score": snapshot.consistency_score, "avg_pace": snapshot.avg_pace, "avg_hr": snapshot.avg_hr, "structure_status": _safe_dump(snapshot.structure_status), "performance_brief": snapshot.performance_brief, "performance_focus": snapshot.performance_focus, "trend": _safe_dump(snapshot.trend), "weekly_trend": _safe_dump(snapshot.weekly_trend), "positioning": _safe_dump(snapshot.positioning), "positioning_view": _safe_dump(snapshot.positioning_view), "goal_trajectory_data": _safe_dump(snapshot.goal_trajectory_data), "insights": _safe_dump(snapshot.insights), "plan": snapshot.plan, "recommendation": _safe_dump(snapshot.recommendation), "charts": serialize_charts(snapshot.charts), "weekly_brief": snapshot.weekly_brief, "weekly_focus": snapshot.weekly_focus, "active_goal": _safe_dump(snapshot.active_goal), "goal_view": _safe_dump(snapshot.goal_view), }