fix: stat on class when no evalution

This commit is contained in:
2025-08-09 14:04:44 +02:00
parent 859e496152
commit b253033bf4

View File

@@ -410,6 +410,7 @@ class ClassGroup(db.Model):
'assessments_count': 0, 'assessments_count': 0,
'students_count': len(self.students), 'students_count': len(self.students),
'class_averages': [], 'class_averages': [],
'student_averages': [],
'overall_statistics': { 'overall_statistics': {
'count': 0, 'count': 0,
'mean': 0, 'mean': 0,
@@ -418,7 +419,8 @@ class ClassGroup(db.Model):
'max': 0, 'max': 0,
'std_dev': 0 'std_dev': 0
}, },
'distribution': [] 'distribution': [],
'student_averages_distribution': []
} }
# Calculer les moyennes par évaluation et par élève # Calculer les moyennes par évaluation et par élève
@@ -468,7 +470,7 @@ class ClassGroup(db.Model):
avg = statistics.mean(scores) avg = statistics.mean(scores)
student_final_averages.append(round(avg, 2)) 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 = { overall_stats = {
'count': 0, 'count': 0,
'mean': 0, 'mean': 0,
@@ -481,41 +483,21 @@ class ClassGroup(db.Model):
distribution = [] distribution = []
student_averages_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 statistics
import math import math
overall_stats = { overall_stats = {
'count': len(all_individual_scores), 'count': len(student_final_averages),
'mean': round(statistics.mean(all_individual_scores), 2), 'mean': round(statistics.mean(student_final_averages), 2),
'median': round(statistics.median(all_individual_scores), 2), 'median': round(statistics.median(student_final_averages), 2),
'min': round(min(all_individual_scores), 2), 'min': round(min(student_final_averages), 2),
'max': round(max(all_individual_scores), 2), 'max': round(max(student_final_averages), 2),
'std_dev': round(statistics.stdev(all_individual_scores) if len(all_individual_scores) > 1 else 0, 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: if student_final_averages:
# Bins pour les moyennes des élèves (de 0 à 20) # Bins pour les moyennes des élèves (de 0 à 20)
avg_bins = list(range(0, 22)) avg_bins = list(range(0, 22))
@@ -533,10 +515,13 @@ class ClassGroup(db.Model):
else: else:
label = f"{avg_bins[i]}-{avg_bins[i+1]}" label = f"{avg_bins[i]}-{avg_bins[i+1]}"
student_averages_distribution.append({ bin_data = {
'range': label, 'range': label,
'count': avg_bin_counts[i] '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 { return {
'trimester': trimester, 'trimester': trimester,