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,
'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,