22 KiB
📋 Préparation du Conseil de Classe
La Préparation du Conseil de Classe est une fonctionnalité avancée de Notytex qui permet aux enseignants de préparer efficacement leurs conseils de classe en centralisant les données d'évaluation et en rédigeant les appréciations individuelles.
🎯 Vue d'ensemble
Objectifs principaux
- Centraliser les résultats de tous les élèves pour un trimestre donné
- Rédiger les appréciations individuelles avec auto-sauvegarde
- Analyser les performances de classe avec statistiques automatiques
- Optimiser le workflow avec deux modes de visualisation
Accès à la fonctionnalité
Navigation : Classes → [Nom de la classe] → Dashboard → Conseil de classe T[X]
URL : /classes/{id}/council?trimestre={1|2|3}
📊 Architecture des Données
Services principaux
CouncilPreparationService
# Orchestrateur principal
class CouncilPreparationService:
def prepare_council_data(class_id, trimester) -> CouncilPreparationData
StudentEvaluationService
# Calculs et analyse des performances
class StudentEvaluationService:
def get_students_summaries(class_id, trimester) -> List[StudentTrimesterSummary]
def calculate_student_trimester_average(student_id, trimester) -> float
# Nouvelles méthodes 2025
def get_student_special_values_summary(student_id, trimester) -> Dict[str, Any]
def get_student_competence_domain_breakdown(student_id, trimester) -> Dict[str, List[Dict]]
GradeRepository (Nouvelles méthodes 2025)
# Repository étendu pour valeurs spéciales et commentaires
class GradeRepository:
# Méthodes existantes...
# Nouvelles méthodes pour valeurs spéciales
def get_special_values_counts_by_student_trimester(student_id, trimester) -> Dict[str, int]
def get_special_values_counts_by_student_assessment(student_id, assessment_id) -> Dict[str, int]
def get_special_values_details_by_student_trimester(student_id, trimester) -> Dict[str, List[Dict]]
def get_special_values_details_by_student_assessment(student_id, assessment_id) -> Dict[str, List[Dict]]
# Nouvelle méthode pour commentaires organisés
def get_all_comments_by_student_trimester(student_id, trimester) -> Dict[str, Any]
AppreciationService
# Gestion des appréciations
class AppreciationService:
def save_appreciation(data) -> CouncilAppreciation
def auto_save_appreciation(data) -> CouncilAppreciation
Modèles de données
StudentTrimesterSummary
@dataclass
class StudentTrimesterSummary:
student: Student
overall_average: Optional[float]
assessment_count: int
grades_by_assessment: Dict[int, Dict] # {assessment_id: {score, max, title}}
appreciation: Optional[CouncilAppreciation]
performance_status: str # 'excellent', 'good', 'average', 'struggling'
competence_domain_breakdown: Optional[Dict] = None # Données compétences/domaines
special_values_summary: Optional[Dict] = None # Nouvelle: résumé valeurs spéciales et commentaires
Structure special_values_summary (Nouveau 2025)
special_values_summary = {
# Résumé global des valeurs spéciales pour le trimestre
"global": {
".": {"count": 2, "label": "Pas de réponse", "color": "#ef4444", "details": [...]},
"d": {"count": 1, "label": "Dispensé", "color": "#6b7280", "details": [...]},
"a": {"count": 1, "label": "Absent", "color": "#f59e0b", "details": [...]}
},
# Détail par évaluation
"by_assessment": {
1: {
"title": "Contrôle Chapitre 1",
"date": "2025-08-10",
"special_values": {
".": {"count": 1, "label": "Pas de réponse", "details": [...]}
}
}
},
# Commentaires organisés par évaluations (Nouveau)
"comments_by_assessments": {
"assessments": [
{
"id": 1,
"title": "Contrôle Chapitre 1 - Nombres entiers",
"date": "2025-08-10",
"comments": [
{
"element_label": "Additions",
"element_description": "Calculs simples",
"value": ".",
"comment": "Élève absent lors de cette question"
}
]
}
],
"total_comments": 3,
"has_comments": true
},
# Métadonnées
"total_special_values": 4,
"has_special_values": true
}
CouncilPreparationData
@dataclass
class CouncilPreparationData:
class_group_id: int
trimester: int
student_summaries: List[StudentTrimesterSummary]
class_statistics: Dict
appreciation_stats: Dict
total_students: int
completed_appreciations: int
🎨 Interface Utilisateur
Page principale
Section Hero
- Informations contextuelles : Classe, trimestre, nombre d'élèves
- Sélecteur de trimestre : Navigation rapide entre T1, T2, T3
- Actions principales : Export PDF, Synthèse de classe, Mode Focus
Statistiques de classe
{
"mean": 14.2, // Moyenne générale
"median": 14.5, // Médiane
"min": 8.5, // Note minimum
"max": 18.5, // Note maximum
"std_dev": 2.1, // Écart-type
"performance_distribution": {
"excellent": 3, // ≥ 16/20
"good": 8, // ≥ 14/20
"average": 12, // ≥ 10/20
"struggling": 2, // < 10/20
"no_data": 0
}
}
Filtres et recherche
- Recherche par nom : Filtre instantané (300ms debounce)
- Tri : Alphabétique, par moyenne, par statut de performance
- Filtre par statut : Toutes, Appréciations terminées, En attente, En difficulté
Cartes élèves individuelles
Informations affichées
<!-- En-tête de carte -->
<div class="student-card-header">
<h3>NOM Prénom</h3>
<div class="performance-badge">[excellent|good|average|struggling]</div>
<div class="appreciation-status">[Rédigée|À rédiger]</div>
</div>
<!-- Résumé compact des valeurs spéciales -->
<div class="special-values-summary">
<span class="text-gray-500">Valeurs spéciales:</span>
<span class="badge-absent">. 2</span> <!-- Absent/Pas de réponse -->
<span class="badge-excused">d 1</span> <!-- Dispensé -->
<span class="badge-away">a 1</span> <!-- Absent justifié -->
</div>
<!-- Résultats par évaluation -->
<div class="assessment-results">
<div class="assessment-item">
<span>Évaluation Title</span>
<span>15.5/20</span>
</div>
</div>
<!-- Zone d'appréciation (expansible) -->
<div class="appreciation-area">
<textarea placeholder="Rédiger l'appréciation..."></textarea>
<div class="appreciation-controls">
<button>Sauvegarder</button>
<div class="save-indicator">Auto-sauvegarde...</div>
</div>
</div>
Vue détaillée expandable
Chaque carte élève peut être étendue pour révéler des informations complémentaires essentielles à la préparation du conseil de classe.
Valeurs spéciales par évaluation
<!-- Section des valeurs spéciales détaillées -->
<div class="special-values-detail">
<h6>Valeurs spéciales</h6>
<div class="assessment-special-values">
<div class="assessment-row">
<span>Contrôle Chapitre 1</span>
<div class="special-badges">
<span class="badge" title="Pas de réponse (2)">. 2</span>
<span class="badge" title="Dispensé (1)">d 1</span>
</div>
</div>
</div>
</div>
Commentaires enseignant organisés 📝
Nouvelle fonctionnalité 2025 : Affichage compact et structuré de tous les commentaires saisis par l'enseignant.
<!-- Section des commentaires par évaluation -->
<div class="comments-section">
<h6>Commentaires (3)</h6>
<!-- Regroupement par évaluation -->
<div class="assessment-comments">
<div class="assessment-group">
<div class="assessment-header">
<span class="assessment-title">Contrôle Chapitre 1 - Nombres entiers</span>
<span class="comment-count">3 commentaire(s)</span>
</div>
<!-- Commentaires compacts sur 2 lignes -->
<div class="comments-list">
<div class="comment-item">
<!-- Ligne 1: Label • Description -->
<div class="element-info">Additions • Calculs simples</div>
<!-- Ligne 2: [Valeur] Commentaire -->
<div class="comment-content">
<span class="value-badge">.</span>
<span class="comment-text">Élève absent lors de cette question</span>
</div>
</div>
<div class="comment-item">
<div class="element-info">Multiplications • Tables et calculs</div>
<div class="comment-content">
<span class="value-badge">d</span>
<span class="comment-text">Dispensé par décision médicale</span>
</div>
</div>
</div>
</div>
</div>
</div>
Structure des données commentaires
# Nouvelle structure pour les commentaires
comments_by_assessments = {
"assessments": [
{
"id": 1,
"title": "Contrôle Chapitre 1 - Nombres entiers",
"date": "2025-08-10",
"comments": [
{
"element_label": "Additions",
"element_description": "Calculs simples",
"value": ".", # Valeur optionnelle (peut être None)
"comment": "Élève absent lors de cette question",
"exercise_title": "Exercice 1"
}
]
}
],
"total_comments": 3,
"has_comments": true
}
Avantages de l'affichage compact
- Gain d'espace : 2 lignes par commentaire maximum
- Contexte complet : Label, description, valeur et commentaire visibles
- Organisation logique : Regroupement par évaluation chronologique
- Lecture rapide : Information hiérarchisée et codes couleur cohérents
- Positionnement optimal : Après résultats et valeurs spéciales, avant compétences
🎛️ Modes de Visualisation
Mode Liste (par défaut)
- Vue d'ensemble : Toutes les cartes élèves simultanément
- Filtres actifs : Recherche, tri et filtres disponibles
- Actions globales : Export PDF, synthèse de classe
- Navigation : Scroll vertical traditionnel
Mode Focus 🎯
- Vue unitaire : Un seul élève à la fois
- Interface minimale : Hero, filtres et actions masqués
- Navigation dédiée : Boutons Précédent/Suivant + raccourcis clavier
- Focus automatique : Curseur positionné dans le textarea
- Optimisation : Pas de scroll, interface pleine hauteur
Activation du Mode Focus
// Bouton ou raccourci
document.querySelector('[data-toggle-focus-mode]').click();
// Raccourcis clavier en mode focus
// ← : Élève précédent
// → : Élève suivant
// Échap : Retour mode liste
💾 Système de Sauvegarde
Auto-sauvegarde intelligente
- Délai : 2 secondes après arrêt de frappe (debounce)
- Événements :
input(auto),blur(immédiat) - Visual feedback : Indicateurs colorés temps réel
États visuels
// États des indicateurs de sauvegarde
{
"modified": "bg-yellow-100 text-yellow-800", // Modifié
"saving": "bg-blue-100 text-blue-800", // Sauvegarde...
"saved": "bg-green-100 text-green-800", // Sauvegardé ✓
"error": "bg-red-100 text-red-800" // Erreur ✗
}
Synchronisation bidirectionnelle
- Focus → Liste : Modifications synchronisées automatiquement
- Statut partagé : Indicateur "Rédigée/À rédiger" mis à jour
- Données persistantes : Dernière modification horodatée
🔄 API et Endpoints
Routes principales
Page de préparation
@bp.route('/<int:id>/council')
def council_preparation(id):
# GET /classes/5/council?trimestre=2
# Affiche la page complète de préparation
Sauvegarde d'appréciation
@bp.route('/<int:class_id>/council/appreciation/<int:student_id>', methods=['POST'])
def save_appreciation_api(class_id, student_id):
# POST /classes/5/council/appreciation/123
# Body: {"appreciation": "text", "trimester": 2}
# Response: {"success": true, "appreciation_id": 456}
Données par trimestre
@bp.route('/<int:class_id>/council/api')
def council_data_api(class_id):
# GET /classes/5/council/api?trimestre=2
# Response: JSON avec tous les données élèves
Format des requêtes AJAX
Sauvegarde d'appréciation
const response = await fetch(`/classes/${classId}/council/appreciation/${studentId}`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
},
body: JSON.stringify({
appreciation: "Élève sérieux et appliqué...",
trimester: 2,
strengths: "Participation active",
areas_for_improvement: "Organisation des révisions"
})
});
Réponse type
{
"success": true,
"appreciation_id": 789,
"last_modified": "2025-08-10T14:30:00.000Z",
"status": "draft",
"has_content": true
}
⚡ Architecture JavaScript
Classe principale
class CouncilPreparation {
constructor(classId, options = {})
// Modules spécialisés
stateManager: StateManager // Gestion d'état et persistance URL
filterManager: FilterManager // Filtres, tri, recherche
autoSaveManager: AutoSaveManager // Auto-sauvegarde intelligente
uiManager: UIManager // Animation des cartes
focusManager: FocusManager // Mode focus complet
}
Gestionnaires spécialisés
FocusManager
class FocusManager {
toggleFocusMode(forcedState = null) // Basculer entre modes
showCurrentStudent() // Afficher élève courant
navigatePrevious() / navigateNext() // Navigation
focusAppreciationTextarea() // Focus automatique
bindFocusStudentEvents() // Événements élément cloné
syncAppreciationToOriginal() // Sync bidirectionnelle
}
AutoSaveManager
class AutoSaveManager {
queueSave(studentId, appreciation, immediate) // File de sauvegarde
executeSave(saveTask) // Exécution HTTP
showSavingState() / showSavedState() // États visuels
updateAppreciationStatus() // Sync statuts
}
État centralisé
this.state = {
currentTrimester: 2,
expandedStudents: new Set(), // Cartes ouvertes
searchTerm: '',
sortBy: 'alphabetical',
filterStatus: 'all',
savingStates: new Map(), // États de sauvegarde
modifiedAppreciations: new Set(), // Appréciations modifiées
// Mode Focus
isFocusMode: false,
focusCurrentIndex: 0,
filteredStudents: [] // Liste filtrée pour navigation
}
🎯 Fonctionnalités Avancées
Analyse des valeurs spéciales et commentaires 📊
Nouveauté 2025 : Système complet d'analyse des valeurs spéciales (absences, dispenses) et des commentaires enseignant pour faciliter la préparation des conseils de classe.
Valeurs spéciales configurables
- Configuration dynamique : Valeurs et couleurs modifiables via interface d'administration
- Valeurs par défaut :
.(Pas de réponse),d(Dispensé),a(Absent) - Comptage automatique : Calcul global et par évaluation en temps réel
- Tooltips informatifs : Détail des éléments concernés au survol
Commentaires structurés
- Regroupement intelligent : Organisation automatique par évaluation
- Affichage compact : 2 lignes par commentaire (contexte + contenu)
- Métadonnées complètes : Label, description, valeur associée
- Tri chronologique : Évaluations les plus récentes en premier
Bénéfices pédagogiques
- Vue d'ensemble rapide : Identification immédiate des difficultés
- Contexte enrichi : Commentaires précédents accessibles lors des discussions
- Suivi longitudinal : Évolution des problématiques par trimestre
- Préparation optimisée : Toutes les informations centralisées
Raccourcis clavier globaux
// Raccourcis disponibles
Ctrl/Cmd + S : Sauvegarder toutes les appréciations pending
Ctrl/Cmd + F : Focus sur champ de recherche
// En mode Focus uniquement
← : Élève précédent
→ : Élève suivant
Échap : Retour au mode liste
Animations et transitions
- Cartes : Animation d'expansion/contraction fluide (300ms)
- Filtres : Apparition staggered des résultats (50ms par élément)
- Mode Focus : Transition interface sans saut visuel
- Sauvegarde : Indicateurs animés (spinner, fade)
Gestion d'erreurs
- Validation côté client : Champs obligatoires, longueur
- Retry automatique : En cas d'erreur réseau temporaire
- États dégradés : Fonctionnement offline partiel
- Messages contextuels : Toasts informatifs
📱 Responsive Design
Breakpoints
- Mobile (
< 768px) : Navigation tactile, cartes stack - Tablette (
768-1024px) : Interface hybride - Desktop (
> 1024px) : Interface complète
Optimisations mobile
- Touch gestures : Swipe pour navigation en mode focus
- Keyboard friendly : Focus automatique sans clavier virtuel gênant
- Performance : Lazy loading, virtual scrolling pour grandes classes
🔧 Configuration et Paramétrage
Options par défaut
const defaultOptions = {
debounceTime: 2000, // Auto-sauvegarde (ms)
searchDebounceTime: 300, // Recherche instantanée (ms)
cacheTimeout: 10 * 60 * 1000, // Cache données (10min)
animationDuration: 300, // Durée animations (ms)
enableTouchGestures: true // Gestes tactiles
}
Variables d'environnement
# Configuration spécifique conseil de classe
COUNCIL_AUTO_SAVE_INTERVAL=2000
COUNCIL_CACHE_TIMEOUT=600000
COUNCIL_MAX_APPRECIATION_LENGTH=2000
🧪 Tests et Débogage
Tests automatisés
# Tests complets du module conseil
uv run pytest tests/test_council_services.py -v
# Tests JavaScript (si configuré)
npm run test:council-preparation
Debugging JavaScript
// Console logs disponibles par défaut
console.log('🎯 Mode Focus activé');
console.log('💾 Sauvegarde en cours pour élève 123');
console.log('✅ Synchronisation bidirectionnelle OK');
console.log('⬅️ Navigation vers élève précédent');
Monitoring
- Performance : Temps de chargement, auto-sauvegarde
- Erreurs : Taux d'échec sauvegarde, problèmes réseau
- Usage : Mode préféré, temps passé par appréciation
📋 Guide d'Utilisation Enseignant
Workflow recommandé
1. Préparation (avant le conseil)
- Naviguer vers la classe concernée
- Sélectionner le trimestre approprié
- Analyser les statistiques de classe
- Identifier les élèves prioritaires (filtrer par "struggling")
2. Rédaction des appréciations
- Activer le mode Focus pour une meilleure concentration
- Naviguer élève par élève avec ←/→
- Rédiger directement dans le textarea (focus automatique)
- Valider la sauvegarde automatique (indicateur vert)
3. Finalisation
- Revenir en mode Liste pour vue d'ensemble
- Vérifier que toutes les appréciations sont "Rédigées"
- Exporter en PDF pour impression/archivage
- Générer la synthèse de classe
Bonnes pratiques
- Sauvegarde régulière : Laisser l'auto-sauvegarde opérer
- Navigation efficace : Utiliser les raccourcis clavier
- Structuration : Commencer par les cas prioritaires
- Révision : Mode Liste final pour cohérence globale
🔄 Évolutions Récentes et Futures
Version 2.0.1 (Août 2025) ✅
- Valeurs spéciales : Comptage et affichage automatiques (
.,d,a) - Commentaires structurés : Organisation par évaluation avec affichage compact
- Repository étendu : Nouvelles méthodes optimisées pour l'analyse
- Interface enrichie : Vue détaillée expandable avec toutes les données contextuelles
Version 2.1 (Roadmap)
- Collaboration : Plusieurs enseignants simultanément
- Templates : Appréciations pré-rédigées personnalisables
- IA Assistant : Suggestions d'amélioration automatiques
- Analytics : Tendances longitudinales élèves
- Export enrichi : PDF avec valeurs spéciales et commentaires
Version 2.2
- Mobile App : Application native iOS/Android
- Voice-to-text : Dictée vocale des appréciations
- Integration ENT : Synchronisation avec Pronote/Scolinfo
- PDF Avancé : Mise en page personnalisée
🎓 Conclusion
La Préparation du Conseil de Classe de Notytex révolutionne le workflow traditionnel des enseignants en offrant :
- ✅ Interface moderne avec Mode Focus innovant
- ✅ Auto-sauvegarde intelligente et synchronisation temps réel
- ✅ Analyse statistique automatique des performances
- ✅ Navigation optimisée avec raccourcis clavier
- ✅ Architecture robuste avec gestion d'erreurs complète
- 🆕 Valeurs spéciales : Comptage automatique des absences et dispenses
- 🆕 Commentaires structurés : Historique organisé par évaluation
- 🆕 Vue contextuelle : Toutes les données pédagogiques centralisées
Cette fonctionnalité transforme une tâche chronophage en un processus fluide et efficace, permettant aux enseignants de se concentrer sur l'essentiel : l'analyse pédagogique et la rédaction d'appréciations personnalisées.
Développé avec ❤️ par l'équipe Notytex