12 KiB
		
	
	
	
	
	
	
	
			
		
		
	
	📏 Configuration des Échelles - Notytex
Vue d'ensemble
Notytex utilise un système de notation hybride qui distingue trois types de valeurs d'évaluation :
- Notes : Valeurs numériques décimales (ex: 2.5/4, 18/20, 15.5/20)
- Scores : Échelle fixe de 0 à 3 pour l'évaluation par compétences
- Valeurs spéciales : Valeurs configurables comme "." (non évalué), "d" (dispensé), etc.
Architecture Technique
Modèle de Données
# Modèle CompetenceScaleValue
class CompetenceScaleValue(db.Model):
    value: str              # "0", "1", "2", "3", ".", "d", etc.
    label: str              # "Non acquis", "En cours d'acquisition", etc.
    color: str              # "#dc2626", "#059669", etc.
    included_in_total: bool # True/False pour inclusion dans calculs
Configuration Centralisée
La configuration est gérée par app_config.py avec stockage en SQLite :
# Configuration des dégradés de couleurs pour les notes
'grading.notes_gradient.min_color': '#dc2626'  # Rouge pour note 0
'grading.notes_gradient.max_color': '#059669'  # Vert pour note max
'grading.notes_gradient.enabled': True
Types de Notation
1. Notes (Numerical Grading)
Caractéristiques :
- Valeurs numériques décimales : 2.5, 18, 15.5, etc.
- Barème variable selon l'exercice : /4, /20, /10, etc.
- Calcul automatique des pourcentages et moyennes
- Nouveau : Système de dégradé de couleurs automatique
Dégradé de Couleurs (2025) :
- Configuration via interface /config/scale
- Couleur minimum pour note 0 (par défaut : rouge #dc2626)
- Couleur maximum pour note maximale (par défaut : vert #059669)
- Interpolation HSL pour des transitions naturelles (évite le gris)
- Calcul automatique des couleurs intermédiaires selon ratio note/maximum
// Exemple de calcul de couleur
function calculateNoteColor(note, maxPoints, minColor, maxColor) {
    const factor = note / maxPoints;
    return interpolateColorHSL(minColor, maxColor, factor);
}
Interface Utilisateur :
- Sélecteurs de couleurs min/max sur une ligne
- Barre de dégradé visuelle avec interpolation HSL
- Exemples de notes positionnés sur le dégradé (5/20, 10/20, 15/20)
- Sauvegarde intégrée au formulaire principal
2. Scores (Competence Grading)
Caractéristiques :
- Échelle fixe et non configurable : 0, 1, 2, 3
- Signification par défaut :
- 0 : Non acquis (rouge #dc2626)
- 1 : En cours d'acquisition (orange #ea580c)
- 2 : Acquis (vert #059669)
- 3 : Expert (bleu #2563eb)
 
- Chaque niveau peut être personnalisé (libellé, couleur, inclusion)
Configuration :
- Labels modifiables via interface
- Couleurs personnalisables avec sélecteurs
- Option d'inclusion/exclusion du calcul global
- Valeurs 0-3 dans la section "Échelle numérique"
3. Valeurs Spéciales
Valeurs Prédéfinies :
- "." : Non évalué (par défaut gris #6b7280)
- Compte comme 0 dans les notes mais inclus dans le total possible
- Généralement incluse pour maintenir la cohérence des calculs
 
- "d" : Dispensé (configurable)
- Exclu des calculs par défaut
 
Valeurs Personnalisées :
- Ajout via interface : "NA", "ABS", "X", etc.
- Configuration complète : valeur, libellé, couleur, inclusion
- Suppression possible (sauf valeurs de base)
Interface de Configuration
Page /config/scale - "Échelle de réussite"
Structure :
- 
Dégradé de couleurs pour les notes - Sélecteur couleur minimum (gauche)
- Barre de dégradé visuelle (centre, pleine largeur)
- Sélecteur couleur maximum (droite)
- Exemples positionnés sur le dégradé
 
- 
Échelle numérique (0 à 3) - Configuration des 4 niveaux fixes
- Libellé, couleur et inclusion pour chaque niveau
- Interface en grille responsive
 
- 
Valeurs spéciales - Liste des valeurs non-numériques
- Ajout/modification/suppression
- Protection de la valeur "." (non supprimable)
 
Sauvegarde Unifiée :
- Bouton unique : "Enregistrer les paramètres"
- Sauvegarde simultanée : échelle + dégradé + valeurs spéciales
- Messages de succès différenciés selon les modifications
Utilisation dans le Code
Application dans la Page de Notation
Le dégradé HSL est automatiquement appliqué dans la page de notation (/assessments/<id>/grading) pour tous les éléments de type "notes".
Transmission de la Configuration
# routes/grading.py - Route assessment_grading()
notes_gradient = {
    'min_color': config_manager.get('grading.notes_gradient.min_color', '#dc2626'),
    'max_color': config_manager.get('grading.notes_gradient.max_color', '#059669'),
    'enabled': config_manager.get('grading.notes_gradient.enabled', False)
}
return render_template('assessment_grading.html', 
                     notes_gradient=notes_gradient,  # ← Nouvelle transmission
                     # ... autres paramètres
                     )
Calcul Dynamique des Couleurs
// Fonction globale pour calculer la couleur d'une note
window.getNotesGradientColor = function(note, maxPoints) {
    if (!GRADING_CONFIG.notes_gradient.enabled) return '#6b7280';
    
    const factor = Math.min(1, Math.max(0, note / maxPoints));
    return interpolateColorHSL(
        GRADING_CONFIG.notes_gradient.min_color,
        GRADING_CONFIG.notes_gradient.max_color,
        factor
    );
};
Application Automatique
// ColorManager.applyColorToInput() - Logique de colorisation
if (type === 'notes') {
    // Valeurs spéciales (., d, etc.) → couleurs échelle
    if (GRADING_CONFIG.scale_values[value] && isNaN(value)) {
        // Couleur spéciale avec style italique
    }
    
    // Notes numériques (2, 2.0, 15.5, etc.) → dégradé HSL
    const numValue = parseFloat(value);
    if (!isNaN(numValue)) {
        const noteColor = window.getNotesGradientColor(numValue, maxPoints);
        input.style.color = '#374151';              // Texte gris doux
        input.style.backgroundColor = hexToRgba(noteColor, 0.25);  // Fond coloré
        input.style.borderColor = hexToRgba(noteColor, 0.5);       // Bordure accentuée
    }
}
Accès aux Valeurs d'Échelle
# Repository pattern pour l'accès aux données
competence_scale = config_manager.get_competence_scale_values()
# Structure retournée
{
    '0': {'label': 'Non acquis', 'color': '#dc2626', 'included_in_total': True},
    '1': {'label': 'En cours', 'color': '#ea580c', 'included_in_total': True},
    '2': {'label': 'Acquis', 'color': '#059669', 'included_in_total': True},
    '3': {'label': 'Expert', 'color': '#2563eb', 'included_in_total': True},
    '.': {'label': 'Non évalué', 'color': '#6b7280', 'included_in_total': True}
}
Interpolation des Couleurs
Problématique RGB vs HSL
RGB (Ancien système) :
- Interpolation linéaire entre composantes R, G, B
- Problème : transitions via des couleurs "sales" (gris/marron)
- Exemple : Rouge → Vert passe par un gris terne
HSL (Nouveau système) :
- Interpolation dans l'espace teinte-saturation-luminosité
- Transitions naturelles via le cercle chromatique
- Gestion du "chemin le plus court" pour les teintes
- Résultat : dégradés vibrants et naturels
Implementation JavaScript
function interpolateColorHSL(color1, color2, factor) {
    const rgb1 = hexToRgb(color1);
    const rgb2 = hexToRgb(color2);
    
    const hsl1 = rgbToHsl(rgb1.r, rgb1.g, rgb1.b);
    const hsl2 = rgbToHsl(rgb2.r, rgb2.g, rgb2.b);
    
    // Gérer transition teinte (chemin le plus court)
    let deltaH = hsl2.h - hsl1.h;
    if (deltaH > 180) hsl2.h -= 360;
    else if (deltaH < -180) hsl2.h += 360;
    
    // Interpolation HSL
    const h = hsl1.h + (hsl2.h - hsl1.h) * factor;
    const s = hsl1.s + (hsl2.s - hsl1.s) * factor;
    const l = hsl1.l + (hsl2.l - hsl1.l) * factor;
    
    const rgb = hslToRgb(h, s, l);
    return rgbToHex(rgb.r, rgb.g, rgb.b);
}
Routes et Endpoints
Configuration des Échelles
# Routes principales
GET  /config/scale              # Interface de configuration
POST /config/scale/update       # Sauvegarde unifiée (échelle + dégradé)
POST /config/scale/add          # Ajouter valeur spéciale
POST /config/scale/delete/<val> # Supprimer valeur spéciale
POST /config/scale/reset        # Réinitialisation par défaut
# Route dépréciée (fusionnée dans update_scale)
POST /config/scale/notes-gradient  # Ancienne sauvegarde séparée
Validation des Données
# Validation couleurs hexadécimales
if not re.match(r'^#[0-9a-fA-F]{6}$', color):
    flash('Format de couleur invalide', 'error')
# Protection valeurs de base
base_values = ['0', '1', '2', '3', '.']
if value in base_values:
    flash('Valeur de base non supprimable', 'error')
Evolution et Améliorations
Phase Actuelle (2025)
✅ Réalisé :
- Système de dégradé HSL pour les notes
- Interface unifiée de configuration
- Sauvegarde intégrée échelle + dégradé
- Exemples visuels positionnés sur le dégradé
- Validation et protection des données
Évolutions Possibles
🔮 Futures améliorations :
- Export/import de configurations d'échelles
- Présets de couleurs (thèmes prédéfinis)
- Aperçu temps réel sur vraies données
- Historique des modifications
- Configuration par classe/matière
- API REST pour configuration programmatique
Cas d'Usage Typiques
Enseignant Mathématiques
Échelle 0-3 : Non acquis → En cours → Acquis → Expert
Dégradé notes : Rouge foncé → Vert clair (sur /20)
Valeurs spéciales : "." pour absents, "d" pour dispensés sport
Enseignant Langues
Échelle 0-3 : A découvrir → En apprentissage → Maîtrisé → Excellence
Dégradé notes : Orange → Bleu (évaluations /10)
Valeurs spéciales : "NA" pour non applicable, "O" pour oral seulement
Indicateurs Visuels d'Erreur
Validation des Saisies
Le système détecte automatiquement les valeurs interdites et applique un indicateur visuel très visible :
// Valeurs interdites → Indicateur rouge vif
if (!isValid) {
    input.style.color = '#ffffff';           // Texte blanc
    input.style.backgroundColor = '#dc2626'; // Fond rouge vif
    input.style.borderColor = '#dc2626';     // Bordure rouge
    input.style.borderWidth = '2px';         // Bordure épaisse
    input.style.boxShadow = '0 0 0 3px rgba(220, 38, 38, 0.3)'; // Ombre rouge
    input.style.fontWeight = 'bold';         // Texte en gras
}
Exemples d'Erreurs Détectées
Pour les scores (type="score") :
- Valeurs autres que 0, 1, 2, 3 ou valeurs spéciales configurées
- Exemples : "5","1.5","abc","-1"
Pour les notes (type="notes") :
- Valeurs négatives : "-5"
- Valeurs supérieures au maximum : "25"(si max=20)
- Format invalide : "abc","2.5.3","10,5,2"
Reset Automatique
Dès qu'une valeur valide est saisie, tous les styles d'erreur sont automatiquement effacés et remplacés par la colorisation normale.
Impact UX
Bénéfices Utilisateur
- Cohérence visuelle : Couleurs automatiques selon performance
- Feedback immédiat : Erreurs visibles instantanément + dégradé temps réel
- Distinction claire : Notes vs Scores vs Valeurs spéciales
- Simplicité : Configuration centralisée, application automatique
- Flexibilité : Adaptation aux pratiques pédagogiques
Performance
- Client : Calculs JavaScript optimisés avec interpolation HSL native
- Serveur : Configuration mise en cache, transmission optimisée
- Base : Index sur valeurs d'échelle
- Rendu : Colorisation temps réel sans rechargement
Documentation maintenue à jour - Version 2025
Dernière modification : 9 août 2025 - Ajout dégradé HSL et indicateurs d'erreur