diff --git a/models.py b/models.py index 8986298..11f8f72 100644 --- a/models.py +++ b/models.py @@ -410,6 +410,7 @@ class ClassGroup(db.Model): 'assessments_count': 0, 'students_count': len(self.students), 'class_averages': [], + 'student_averages': [], 'overall_statistics': { 'count': 0, 'mean': 0, @@ -418,7 +419,8 @@ class ClassGroup(db.Model): 'max': 0, 'std_dev': 0 }, - 'distribution': [] + 'distribution': [], + 'student_averages_distribution': [] } # Calculer les moyennes par évaluation et par élève @@ -468,7 +470,7 @@ class ClassGroup(db.Model): avg = statistics.mean(scores) student_final_averages.append(round(avg, 2)) - # Statistiques globales sur toutes les notes du trimestre + # Statistiques globales basées sur les moyennes des élèves (cohérent avec l'histogramme) overall_stats = { 'count': 0, 'mean': 0, @@ -481,41 +483,21 @@ class ClassGroup(db.Model): distribution = [] student_averages_distribution = [] - if all_individual_scores: + # Utiliser les moyennes des élèves pour les statistiques (cohérent avec l'histogramme) + if student_final_averages: import statistics import math overall_stats = { - 'count': len(all_individual_scores), - 'mean': round(statistics.mean(all_individual_scores), 2), - 'median': round(statistics.median(all_individual_scores), 2), - 'min': round(min(all_individual_scores), 2), - 'max': round(max(all_individual_scores), 2), - 'std_dev': round(statistics.stdev(all_individual_scores) if len(all_individual_scores) > 1 else 0, 2) + 'count': len(student_final_averages), + 'mean': round(statistics.mean(student_final_averages), 2), + 'median': round(statistics.median(student_final_averages), 2), + 'min': round(min(student_final_averages), 2), + 'max': round(max(student_final_averages), 2), + 'std_dev': round(statistics.stdev(student_final_averages) if len(student_final_averages) > 1 else 0, 2) } - - # Créer l'histogramme de distribution (bins de 1 point sur 20) - bins = list(range(0, 22)) # 0-1, 1-2, ..., 19-20, 20+ - bin_counts = [0] * (len(bins) - 1) - - for score in all_individual_scores: - # Trouver le bon bin - bin_index = min(int(score), len(bin_counts) - 1) - bin_counts[bin_index] += 1 - - # Formatage pour Chart.js - for i in range(len(bin_counts)): - if i == len(bin_counts) - 1: - label = f"{bins[i]}+" - else: - label = f"{bins[i]}-{bins[i+1]}" - - distribution.append({ - 'range': label, - 'count': bin_counts[i] - }) - # Créer l'histogramme des moyennes des élèves + # Créer l'histogramme des moyennes des élèves (distribution principale) if student_final_averages: # Bins pour les moyennes des élèves (de 0 à 20) avg_bins = list(range(0, 22)) @@ -533,10 +515,13 @@ class ClassGroup(db.Model): else: label = f"{avg_bins[i]}-{avg_bins[i+1]}" - student_averages_distribution.append({ + bin_data = { 'range': label, 'count': avg_bin_counts[i] - }) + } + student_averages_distribution.append(bin_data) + # Maintenir la compatibilité avec distribution (même données maintenant) + distribution.append(bin_data.copy()) return { 'trimester': trimester,