feat: add commentary in concil prep
This commit is contained in:
		| @@ -3,7 +3,7 @@ Services pour la préparation du conseil de classe. | ||||
| Comprend CouncilPreparationService, StudentEvaluationService, AppreciationService. | ||||
| """ | ||||
| from dataclasses import dataclass | ||||
| from typing import Dict, List, Optional, Tuple | ||||
| from typing import Dict, List, Optional, Tuple, Any | ||||
| from datetime import datetime | ||||
| from repositories.appreciation_repository import AppreciationRepository | ||||
| from repositories.grade_repository import GradeRepository | ||||
| @@ -22,6 +22,7 @@ class StudentTrimesterSummary: | ||||
|     appreciation: Optional[CouncilAppreciation] | ||||
|     performance_status: str  # 'excellent', 'good', 'average', 'struggling' | ||||
|     competence_domain_breakdown: Optional[Dict] = None  # Données des compétences et domaines | ||||
|     special_values_summary: Optional[Dict] = None  # Résumé des valeurs spéciales | ||||
|      | ||||
|     @property | ||||
|     def has_appreciation(self) -> bool: | ||||
| @@ -101,6 +102,13 @@ class StudentEvaluationService: | ||||
|         # Calculer les données de compétences et domaines | ||||
|         competence_domain_breakdown = self.get_student_competence_domain_breakdown(student_id, trimester) | ||||
|          | ||||
|         # Calculer le résumé des valeurs spéciales | ||||
|         special_values_summary = self.get_student_special_values_summary(student_id, trimester) | ||||
|          | ||||
|         # Ajouter tous les commentaires organisés par évaluations | ||||
|         all_comments_data = self.grade_repo.get_all_comments_by_student_trimester(student_id, trimester) | ||||
|         special_values_summary['comments_by_assessments'] = all_comments_data | ||||
|          | ||||
|         return StudentTrimesterSummary( | ||||
|             student=student, | ||||
|             overall_average=overall_average, | ||||
| @@ -108,7 +116,8 @@ class StudentEvaluationService: | ||||
|             grades_by_assessment=grades_by_assessment, | ||||
|             appreciation=appreciation, | ||||
|             performance_status=performance_status, | ||||
|             competence_domain_breakdown=competence_domain_breakdown | ||||
|             competence_domain_breakdown=competence_domain_breakdown, | ||||
|             special_values_summary=special_values_summary | ||||
|         ) | ||||
|      | ||||
|     def get_students_summaries(self, class_group_id: int, trimester: int) -> List[StudentTrimesterSummary]: | ||||
| @@ -349,6 +358,80 @@ class StudentEvaluationService: | ||||
|             'domains': domains | ||||
|         } | ||||
|      | ||||
|     def get_student_special_values_summary(self, student_id: int, trimester: int) -> Dict[str, Any]: | ||||
|         """ | ||||
|         Calcule le résumé des valeurs spéciales pour un élève sur un trimestre. | ||||
|          | ||||
|         Returns: | ||||
|             Dict avec 'global' (total par trimestre) et 'by_assessment' (détail par évaluation) | ||||
|         """ | ||||
|         from app_config import config_manager | ||||
|          | ||||
|         # Récupérer les valeurs spéciales configurées | ||||
|         special_values_config = config_manager.get_special_values() | ||||
|          | ||||
|         # 1. Comptes globaux par trimestre | ||||
|         global_counts = self.grade_repo.get_special_values_counts_by_student_trimester(student_id, trimester) | ||||
|         global_details = self.grade_repo.get_special_values_details_by_student_trimester(student_id, trimester) | ||||
|          | ||||
|         # 2. Comptes par évaluation | ||||
|         assessments = self.assessment_repo.find_by_class_trimester_with_details( | ||||
|             Student.query.get(student_id).class_group_id, trimester | ||||
|         ) | ||||
|          | ||||
|         by_assessment = {} | ||||
|         for assessment in assessments: | ||||
|             assessment_counts = self.grade_repo.get_special_values_counts_by_student_assessment( | ||||
|                 student_id, assessment.id | ||||
|             ) | ||||
|             assessment_details = self.grade_repo.get_special_values_details_by_student_assessment( | ||||
|                 student_id, assessment.id | ||||
|             ) | ||||
|              | ||||
|             # Ajouter seulement si l'élève a des valeurs spéciales dans cette évaluation | ||||
|             if any(count > 0 for count in assessment_counts.values()): | ||||
|                 by_assessment[assessment.id] = { | ||||
|                     'title': assessment.title, | ||||
|                     'date': assessment.date, | ||||
|                     'counts': assessment_counts, | ||||
|                     'details': assessment_details | ||||
|                 } | ||||
|          | ||||
|         # 3. Enrichir avec les métadonnées de configuration | ||||
|         enriched_global = {} | ||||
|         enriched_by_assessment = {} | ||||
|          | ||||
|         for special_value, config in special_values_config.items(): | ||||
|             enriched_global[special_value] = { | ||||
|                 'count': global_counts.get(special_value, 0), | ||||
|                 'label': config['label'], | ||||
|                 'color': config['color'], | ||||
|                 'counts_in_total': config['counts'], | ||||
|                 'details': global_details.get(special_value, []) | ||||
|             } | ||||
|          | ||||
|         for assessment_id, assessment_data in by_assessment.items(): | ||||
|             enriched_by_assessment[assessment_id] = { | ||||
|                 'title': assessment_data['title'], | ||||
|                 'date': assessment_data['date'], | ||||
|                 'special_values': {} | ||||
|             } | ||||
|              | ||||
|             for special_value, config in special_values_config.items(): | ||||
|                 enriched_by_assessment[assessment_id]['special_values'][special_value] = { | ||||
|                     'count': assessment_data['counts'].get(special_value, 0), | ||||
|                     'label': config['label'], | ||||
|                     'color': config['color'], | ||||
|                     'details': assessment_data['details'].get(special_value, []) | ||||
|                 } | ||||
|          | ||||
|         return { | ||||
|             'global': enriched_global, | ||||
|             'by_assessment': enriched_by_assessment, | ||||
|             'total_special_values': sum(global_counts.values()), | ||||
|             'has_special_values': sum(global_counts.values()) > 0 | ||||
|         } | ||||
|      | ||||
|     def _calculate_assessment_score_for_student(self, assessment: Assessment, student_id: int) -> Optional[float]: | ||||
|         """Calcule le score d'un élève pour une évaluation.""" | ||||
|         grades = self.grade_repo.get_student_grades_by_assessment(student_id, assessment.id) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user