diff --git a/backend/data_layer/activity_metrics.py b/backend/data_layer/activity_metrics.py index 63bad10..4c7718a 100644 --- a/backend/data_layer/activity_metrics.py +++ b/backend/data_layer/activity_metrics.py @@ -597,7 +597,7 @@ def calculate_activity_score(profile_id: str, focus_weights: Optional[Dict] = No Weighted by user's activity-related focus areas """ if focus_weights is None: - from calculations.scores import get_user_focus_weights + from data_layer.scores import get_user_focus_weights focus_weights = get_user_focus_weights(profile_id) # Activity-related focus areas (English keys from DB) diff --git a/backend/data_layer/correlations.py b/backend/data_layer/correlations.py index 4826533..0cc73bf 100644 --- a/backend/data_layer/correlations.py +++ b/backend/data_layer/correlations.py @@ -164,7 +164,7 @@ def calculate_plateau_detected(profile_id: str) -> Optional[Dict]: 'top_factors': [list of potential causes] } """ - from calculations.scores import get_user_focus_weights + from data_layer.scores import get_user_focus_weights focus_weights = get_user_focus_weights(profile_id) @@ -187,8 +187,8 @@ def calculate_plateau_detected(profile_id: str) -> Optional[Dict]: def _detect_weight_plateau(profile_id: str) -> Dict: """Detect weight loss plateau""" - from calculations.body_metrics import calculate_weight_28d_slope - from calculations.nutrition_metrics import calculate_nutrition_score + from data_layer.body_metrics import calculate_weight_28d_slope + from data_layer.nutrition_metrics import calculate_nutrition_score slope = calculate_weight_28d_slope(profile_id) nutrition_score = calculate_nutrition_score(profile_id) @@ -207,13 +207,13 @@ def _detect_weight_plateau(profile_id: str) -> Dict: factors.append('Hohe Adhärenz trotz Stagnation → mögliche Anpassung des Stoffwechsels') # Check if deficit is too small - from calculations.nutrition_metrics import calculate_energy_balance_7d + from data_layer.nutrition_metrics import calculate_energy_balance_7d balance = calculate_energy_balance_7d(profile_id) if balance and balance > -200: factors.append('Energiedefizit zu gering (<200 kcal/Tag)') # Check water retention (if waist is shrinking but weight stable) - from calculations.body_metrics import calculate_waist_28d_delta + from data_layer.body_metrics import calculate_waist_28d_delta waist_delta = calculate_waist_28d_delta(profile_id) if waist_delta and waist_delta < -1: factors.append('Taillenumfang sinkt → mögliche Wasserretention maskiert Fettabbau') @@ -231,9 +231,9 @@ def _detect_weight_plateau(profile_id: str) -> Dict: def _detect_strength_plateau(profile_id: str) -> Dict: """Detect strength training plateau""" - from calculations.body_metrics import calculate_lbm_28d_change - from calculations.activity_metrics import calculate_activity_score - from calculations.recovery_metrics import calculate_recovery_score_v2 + from data_layer.body_metrics import calculate_lbm_28d_change + from data_layer.activity_metrics import calculate_activity_score + from data_layer.recovery_metrics import calculate_recovery_score_v2 lbm_change = calculate_lbm_28d_change(profile_id) activity_score = calculate_activity_score(profile_id) @@ -251,12 +251,12 @@ def _detect_strength_plateau(profile_id: str) -> Dict: if recovery_score and recovery_score < 60: factors.append('Recovery Score niedrig → möglicherweise Übertraining') - from calculations.nutrition_metrics import calculate_protein_adequacy_28d + from data_layer.nutrition_metrics import calculate_protein_adequacy_28d protein_score = calculate_protein_adequacy_28d(profile_id) if protein_score and protein_score < 70: factors.append('Proteinzufuhr unter Zielbereich') - from calculations.activity_metrics import calculate_monotony_score + from data_layer.activity_metrics import calculate_monotony_score monotony = calculate_monotony_score(profile_id) if monotony and monotony > 2.0: factors.append('Hohe Trainingsmonotonie → Stimulus-Anpassung') @@ -274,8 +274,8 @@ def _detect_strength_plateau(profile_id: str) -> Dict: def _detect_endurance_plateau(profile_id: str) -> Dict: """Detect endurance plateau""" - from calculations.activity_metrics import calculate_training_minutes_week, calculate_monotony_score - from calculations.recovery_metrics import calculate_vo2max_trend_28d + from data_layer.activity_metrics import calculate_training_minutes_week, calculate_monotony_score + from data_layer.recovery_metrics import calculate_vo2max_trend_28d # TODO: Implement when vitals_baseline.vo2_max is populated return {'plateau_detected': False, 'reason': 'VO2max tracking not yet implemented'} @@ -303,7 +303,7 @@ def calculate_top_drivers(profile_id: str) -> Optional[List[Dict]]: drivers = [] # 1. Energy balance - from calculations.nutrition_metrics import calculate_energy_balance_7d + from data_layer.nutrition_metrics import calculate_energy_balance_7d balance = calculate_energy_balance_7d(profile_id) if balance is not None: if -500 <= balance <= -200: @@ -327,7 +327,7 @@ def calculate_top_drivers(profile_id: str) -> Optional[List[Dict]]: }) # 2. Protein adequacy - from calculations.nutrition_metrics import calculate_protein_adequacy_28d + from data_layer.nutrition_metrics import calculate_protein_adequacy_28d protein_score = calculate_protein_adequacy_28d(profile_id) if protein_score is not None: if protein_score >= 80: @@ -348,7 +348,7 @@ def calculate_top_drivers(profile_id: str) -> Optional[List[Dict]]: }) # 3. Sleep duration - from calculations.recovery_metrics import calculate_sleep_avg_duration_7d + from data_layer.recovery_metrics import calculate_sleep_avg_duration_7d sleep_hours = calculate_sleep_avg_duration_7d(profile_id) if sleep_hours is not None: if sleep_hours >= 7: @@ -369,7 +369,7 @@ def calculate_top_drivers(profile_id: str) -> Optional[List[Dict]]: }) # 4. Sleep regularity - from calculations.recovery_metrics import calculate_sleep_regularity_proxy + from data_layer.recovery_metrics import calculate_sleep_regularity_proxy regularity = calculate_sleep_regularity_proxy(profile_id) if regularity is not None: if regularity <= 45: @@ -390,7 +390,7 @@ def calculate_top_drivers(profile_id: str) -> Optional[List[Dict]]: }) # 5. Training consistency - from calculations.activity_metrics import calculate_training_frequency_7d + from data_layer.activity_metrics import calculate_training_frequency_7d frequency = calculate_training_frequency_7d(profile_id) if frequency is not None: if 3 <= frequency <= 6: @@ -411,7 +411,7 @@ def calculate_top_drivers(profile_id: str) -> Optional[List[Dict]]: }) # 6. Quality sessions - from calculations.activity_metrics import calculate_quality_sessions_pct + from data_layer.activity_metrics import calculate_quality_sessions_pct quality_pct = calculate_quality_sessions_pct(profile_id) if quality_pct is not None: if quality_pct >= 75: @@ -432,7 +432,7 @@ def calculate_top_drivers(profile_id: str) -> Optional[List[Dict]]: }) # 7. Recovery score - from calculations.recovery_metrics import calculate_recovery_score_v2 + from data_layer.recovery_metrics import calculate_recovery_score_v2 recovery = calculate_recovery_score_v2(profile_id) if recovery is not None: if recovery >= 70: @@ -453,7 +453,7 @@ def calculate_top_drivers(profile_id: str) -> Optional[List[Dict]]: }) # 8. Rest day compliance - from calculations.activity_metrics import calculate_rest_day_compliance + from data_layer.activity_metrics import calculate_rest_day_compliance compliance = calculate_rest_day_compliance(profile_id) if compliance is not None: if compliance >= 80: diff --git a/backend/data_layer/recovery_metrics.py b/backend/data_layer/recovery_metrics.py index 5f727a5..8260f29 100644 --- a/backend/data_layer/recovery_metrics.py +++ b/backend/data_layer/recovery_metrics.py @@ -742,7 +742,7 @@ def calculate_sleep_regularity_proxy(profile_id: str) -> Optional[float]: def calculate_recent_load_balance_3d(profile_id: str) -> Optional[int]: """Calculate proxy internal load last 3 days""" - from calculations.activity_metrics import calculate_proxy_internal_load_7d + from data_layer.activity_metrics import calculate_proxy_internal_load_7d with get_db() as conn: cur = get_cursor(conn) diff --git a/backend/data_layer/scores.py b/backend/data_layer/scores.py index c279f2d..007cf09 100644 --- a/backend/data_layer/scores.py +++ b/backend/data_layer/scores.py @@ -183,10 +183,10 @@ def calculate_goal_progress_score(profile_id: str) -> Optional[int]: return None # No goals/focus areas configured # Calculate sub-scores - from calculations.body_metrics import calculate_body_progress_score - from calculations.nutrition_metrics import calculate_nutrition_score - from calculations.activity_metrics import calculate_activity_score - from calculations.recovery_metrics import calculate_recovery_score_v2 + from data_layer.body_metrics import calculate_body_progress_score + from data_layer.nutrition_metrics import calculate_nutrition_score + from data_layer.activity_metrics import calculate_activity_score + from data_layer.recovery_metrics import calculate_recovery_score_v2 body_score = calculate_body_progress_score(profile_id, focus_weights) nutrition_score = calculate_nutrition_score(profile_id, focus_weights) @@ -404,10 +404,10 @@ def calculate_data_quality_score(profile_id: str) -> int: Overall data quality score (0-100) Combines quality from all modules """ - from calculations.body_metrics import calculate_body_data_quality - from calculations.nutrition_metrics import calculate_nutrition_data_quality - from calculations.activity_metrics import calculate_activity_data_quality - from calculations.recovery_metrics import calculate_recovery_data_quality + from data_layer.body_metrics import calculate_body_data_quality + from data_layer.nutrition_metrics import calculate_nutrition_data_quality + from data_layer.activity_metrics import calculate_activity_data_quality + from data_layer.recovery_metrics import calculate_recovery_data_quality body_quality = calculate_body_data_quality(profile_id) nutrition_quality = calculate_nutrition_data_quality(profile_id) @@ -566,16 +566,16 @@ def calculate_category_progress(profile_id: str, category: str) -> Optional[int] # Call the appropriate score function if score_func_name == 'body_progress_score': - from calculations.body_metrics import calculate_body_progress_score + from data_layer.body_metrics import calculate_body_progress_score return calculate_body_progress_score(profile_id) elif score_func_name == 'nutrition_score': - from calculations.nutrition_metrics import calculate_nutrition_score + from data_layer.nutrition_metrics import calculate_nutrition_score return calculate_nutrition_score(profile_id) elif score_func_name == 'activity_score': - from calculations.activity_metrics import calculate_activity_score + from data_layer.activity_metrics import calculate_activity_score return calculate_activity_score(profile_id) elif score_func_name == 'recovery_score': - from calculations.recovery_metrics import calculate_recovery_score_v2 + from data_layer.recovery_metrics import calculate_recovery_score_v2 return calculate_recovery_score_v2(profile_id) elif score_func_name == 'data_quality_score': return calculate_data_quality_score(profile_id)