feat: add new initialisation db mode
This commit is contained in:
79
CLAUDE.md
79
CLAUDE.md
@@ -3,6 +3,7 @@
|
||||
**Notytex** est une application web Flask moderne conçue pour la gestion complète des évaluations scolaires. Elle permet aux enseignants de créer, organiser et noter les évaluations de leurs élèves avec une interface intuitive et des fonctionnalités avancées.
|
||||
|
||||
## 🎯 **Objectif Principal**
|
||||
|
||||
Simplifier et digitaliser le processus d'évaluation scolaire, de la création des contrôles à la saisie des notes, en offrant une structure hiérarchique flexible et deux modes de notation.
|
||||
|
||||
## 🏗️ **Architecture Technique (Phase 1 - Refactorisée)**
|
||||
@@ -34,6 +35,7 @@ Grade (Note attribuée à chaque élève)
|
||||
## ⭐ **Fonctionnalités Clés**
|
||||
|
||||
### **Gestion des Évaluations**
|
||||
|
||||
- Création d'évaluations complètes avec exercices multiples
|
||||
- **Organisation par trimestre** : Chaque évaluation doit être assignée à un trimestre (1, 2 ou 3)
|
||||
- Structure hiérarchique : Assessment → Exercise → GradingElement
|
||||
@@ -43,21 +45,25 @@ Grade (Note attribuée à chaque élève)
|
||||
### **Système de Notation Unifié (Phase 2 - 2025)**
|
||||
|
||||
**2 Types de Notation Fixes :**
|
||||
|
||||
1. **`notes`** : Valeurs numériques décimales (ex: 2.5/4, 18/20, 15.5/20)
|
||||
2. **`score`** : Échelle fixe de 0 à 3 pour l'évaluation par compétences
|
||||
|
||||
**Valeurs Spéciales Configurables :**
|
||||
|
||||
- **`.`** = Pas de réponse (traité comme 0 dans les calculs)
|
||||
- **`d`** = Dispensé (ne compte pas dans la note finale)
|
||||
- **Autres valeurs** : Entièrement configurables via l'interface d'administration
|
||||
|
||||
**Configuration Centralisée :**
|
||||
|
||||
- **Signification des scores** : 0=Non acquis, 1=En cours, 2=Acquis, 3=Expert (modifiable)
|
||||
- **Couleurs associées** : Chaque niveau peut avoir sa couleur personnalisée
|
||||
- **Règles de calcul** : Logique unifiée pour tous les types de notation
|
||||
- **Interface d'administration** : Gestion complète des paramètres de notation
|
||||
|
||||
### **Interface Utilisateur & UX Moderne (Phase 2 - Décembre 2024)**
|
||||
|
||||
- **Dashboard avec statistiques en temps réel** : Cartes cliquables avec animations et gradients
|
||||
- **Pages hero modernisées** : Sections d'accueil avec gradients colorés et informations contextuelles
|
||||
- **Navigation intuitive** : Actions principales mises en avant avec boutons colorés et icônes
|
||||
@@ -72,6 +78,7 @@ Grade (Note attribuée à chaque élève)
|
||||
- **Interface cohérente** : Design system unifié avec espacements, couleurs et animations harmonieux
|
||||
|
||||
### **Analyse des Résultats Avancée**
|
||||
|
||||
- **Page de résultats complète** : Vue d'ensemble des performances de l'évaluation
|
||||
- **Statistiques descriptives** : Moyenne, médiane, minimum, maximum, écart-type
|
||||
- **Visualisation graphique** : Histogramme de distribution des notes (groupes de 1 point, de 0 au maximum)
|
||||
@@ -142,6 +149,7 @@ tail -f logs/notytex.log
|
||||
```
|
||||
|
||||
## 🧪 **Qualité du Code (Phase 1 - Renforcée)**
|
||||
|
||||
- **Tests pytest avec 100% de réussite** (100 tests ✅)
|
||||
- **Architecture découplée** : Repository Pattern + Dependency Injection
|
||||
- **Gestion d'erreurs centralisée** : Gestionnaires globaux JSON/HTML
|
||||
@@ -154,7 +162,7 @@ tail -f logs/notytex.log
|
||||
|
||||
1. **Professeur crée une évaluation** : "Contrôle Chapitre 3 - Fonctions" pour le 2ème trimestre
|
||||
2. **Définit les paramètres** : Date, trimestre (obligatoire), classe, coefficient
|
||||
3. **Ajoute des exercices** : "Exercice 1: Calculs", "Exercice 2: Graphiques"
|
||||
3. **Ajoute des exercices** : "Exercice 1: Calculs", "Exercice 2: Graphiques"
|
||||
4. **Définit le barème** : Question 1a (2 pts), Question 1b (3 pts), Compétence graphique (score 0-3)
|
||||
5. **Voit l'indicateur de progression** : "Correction 0%" en rouge sur toutes les pages
|
||||
6. **Saisit les notes** pour chaque élève sur chaque élément via clic sur l'indicateur
|
||||
@@ -162,7 +170,15 @@ tail -f logs/notytex.log
|
||||
8. **Consulte les résultats détaillés** : Accès direct à la page de résultats avec statistiques et histogramme
|
||||
9. **Analyse les performances** : Statistiques descriptives, distribution des notes et classement alphabétique
|
||||
|
||||
## Volumétrie de milieu d'année (milieu du 2e trimestre)
|
||||
|
||||
- 5 classes d'entre 25 et 35 élèves
|
||||
- Les évaluations sont constitués d'entre 10 et 20 éléments de notations
|
||||
- 4 évaluations corrigées par classes pour le premier trimestre
|
||||
- 2 évaluations non corrigée ou partiellement corrigée par classe
|
||||
|
||||
## 🎓 **Public Cible**
|
||||
|
||||
- Enseignants du secondaire (collège/lycée)
|
||||
- Établissements souhaitant digitaliser leurs évaluations
|
||||
- Contexte où coexistent notation classique et évaluation par compétences
|
||||
@@ -172,6 +188,7 @@ Ce projet présente une architecture solide, une interface soignée avec des **i
|
||||
## 🎨 **Dernières Améliorations UX**
|
||||
|
||||
### **Indicateurs de Progression Intégrés**
|
||||
|
||||
- **Calcul automatique** : Propriété `grading_progress` dans le modèle Assessment
|
||||
- **Affichage multi-pages** : Présent sur index, liste évaluations, détail évaluation
|
||||
- **Code couleur intuitif** :
|
||||
@@ -183,8 +200,9 @@ Ce projet présente une architecture solide, une interface soignée avec des **i
|
||||
- **Responsive design** : Version complète sur liste évaluations, version compacte sur index
|
||||
|
||||
### **Système de Résultats et Statistiques**
|
||||
|
||||
- **Calculs automatisés** : Méthodes `calculate_student_scores()`, `get_assessment_statistics()` dans le modèle Assessment
|
||||
- **Double logique de scoring** :
|
||||
- **Double logique de scoring** :
|
||||
- **Points** : Sommation directe des valeurs
|
||||
- **Compétences** : Formule `1/3 * score * pointMax` (score 0-3)
|
||||
- **Gestion des cas particuliers** : Les scores "." comptent comme 0 mais incluent les points maximum
|
||||
@@ -201,12 +219,14 @@ Cette évolution transforme Notytex en un outil **véritablement centré utilisa
|
||||
## 📋 **Prérequis**
|
||||
|
||||
### **Environnement de Développement**
|
||||
|
||||
- **Python 3.8+** : Version recommandée 3.11+
|
||||
- **uv** : Gestionnaire de paquets moderne Python ([installation](https://docs.astral.sh/uv/))
|
||||
- **Git** : Pour le contrôle de version
|
||||
- **IDE recommandé** : VSCode avec extensions Python, Flask, Jinja2
|
||||
|
||||
### **Connaissances Requises**
|
||||
|
||||
- **Python** : Classes, décorateurs, gestion d'erreurs
|
||||
- **Flask** : Routes, templates, blueprints, contexte d'application
|
||||
- **SQLAlchemy** : ORM, relations, requêtes
|
||||
@@ -233,6 +253,7 @@ uv run flask --app app run --debug
|
||||
## 🏗️ **Architecture Détaillée**
|
||||
|
||||
### **Structure des Fichiers**
|
||||
|
||||
```
|
||||
notytex/
|
||||
├── 📱 app.py # Point d'entrée Flask + routes principales
|
||||
@@ -257,11 +278,12 @@ notytex/
|
||||
```
|
||||
|
||||
### **Flux de Données Typique**
|
||||
|
||||
```
|
||||
1. Route Flask (routes/*.py)
|
||||
↓
|
||||
2. Validation Form (forms.py)
|
||||
↓
|
||||
↓
|
||||
3. Logique Métier (models.py)
|
||||
↓
|
||||
4. Accès Base de Données (SQLAlchemy)
|
||||
@@ -272,12 +294,15 @@ notytex/
|
||||
## 🎯 **Points d'Entrée pour Contribuer**
|
||||
|
||||
### **🌟 Débutant - Familiarisation**
|
||||
|
||||
1. **Ajouter un champ à un modèle existant**
|
||||
|
||||
- Fichier : `models.py`
|
||||
- Exemple : Ajouter un champ "commentaire" à Student
|
||||
- Impact : Migration DB + template + form
|
||||
|
||||
2. **Modifier l'apparence d'une page**
|
||||
|
||||
- Fichiers : `templates/*.html`
|
||||
- Technologie : TailwindCSS
|
||||
- Exemple : Changer les couleurs du dashboard
|
||||
@@ -288,13 +313,16 @@ notytex/
|
||||
- Exemple : Validation format email étudiant
|
||||
|
||||
### **🔥 Intermédiaire - Nouvelles Fonctionnalités**
|
||||
|
||||
1. **Créer une nouvelle page**
|
||||
|
||||
- Blueprint dans `routes/`
|
||||
- Template correspondant
|
||||
- Formulaire si nécessaire
|
||||
- Tests
|
||||
|
||||
2. **Ajouter un système d'export**
|
||||
|
||||
- Route d'export (PDF, Excel, CSV)
|
||||
- Template de génération
|
||||
- Boutons dans l'interface
|
||||
@@ -305,12 +333,15 @@ notytex/
|
||||
- Template de configuration
|
||||
|
||||
### **⚡ Avancé - Architecture**
|
||||
|
||||
1. **Optimiser les performances**
|
||||
|
||||
- Requêtes SQLAlchemy (N+1 queries)
|
||||
- Cache des calculs coûteux
|
||||
- Lazy loading intelligent
|
||||
|
||||
2. **Ajouter des API REST**
|
||||
|
||||
- Endpoints JSON
|
||||
- Authentification
|
||||
- Documentation OpenAPI
|
||||
@@ -323,6 +354,7 @@ notytex/
|
||||
## 📚 **Concepts Clés à Maîtriser**
|
||||
|
||||
### **Configuration Dynamique**
|
||||
|
||||
```python
|
||||
# Configuration stockée en base SQLite
|
||||
from app_config import config_manager
|
||||
@@ -331,12 +363,13 @@ from app_config import config_manager
|
||||
school_year = config_manager.get('context.school_year')
|
||||
competences = config_manager.get_competences_list()
|
||||
|
||||
# Écriture
|
||||
# Écriture
|
||||
config_manager.set('context.school_year', '2025-2026')
|
||||
config_manager.save()
|
||||
```
|
||||
|
||||
### **Calcul de Progression**
|
||||
|
||||
```python
|
||||
# Dans models.py - Assessment
|
||||
@property
|
||||
@@ -352,6 +385,7 @@ def grading_progress(self):
|
||||
```
|
||||
|
||||
### **Système de Notation Unifié**
|
||||
|
||||
```python
|
||||
# Type "notes" - Valeurs numériques
|
||||
grade.value = "15.5" # Points décimaux
|
||||
@@ -376,6 +410,7 @@ special_values = config_manager.get('grading.special_values')
|
||||
## 🧪 **Tests et Débogage**
|
||||
|
||||
### **Lancer les Tests**
|
||||
|
||||
```bash
|
||||
# Tous les tests
|
||||
uv run pytest
|
||||
@@ -388,6 +423,7 @@ uv run pytest tests/test_models.py -v
|
||||
```
|
||||
|
||||
### **Débogage**
|
||||
|
||||
```bash
|
||||
# Mode debug avec rechargement auto
|
||||
uv run flask --app app run --debug
|
||||
@@ -400,6 +436,7 @@ tail -f logs/school_management.log
|
||||
```
|
||||
|
||||
### **Base de Données**
|
||||
|
||||
```bash
|
||||
# Réinitialiser complètement
|
||||
rm school_management.db
|
||||
@@ -414,18 +451,21 @@ sqlite3 school_management.db
|
||||
## 🎨 **Conventions de Code**
|
||||
|
||||
### **Style Python**
|
||||
|
||||
- **PEP 8** : Formatage automatique avec black
|
||||
- **Type hints** : Recommandés pour les nouvelles fonctions
|
||||
- **Docstrings** : Format Google pour les fonctions publiques
|
||||
- **Noms explicites** : `calculate_student_scores()` plutôt que `calc()`
|
||||
|
||||
### **Templates Jinja2**
|
||||
|
||||
- **Indentation** : 4 espaces
|
||||
- **Noms de variables** : snake_case
|
||||
- **Blocs réutilisables** : Utiliser les includes et macros
|
||||
- **Classes CSS** : TailwindCSS avec composition
|
||||
|
||||
### **Base de Données**
|
||||
|
||||
- **Noms de tables** : Pluriel en anglais (`students`, `assessments`)
|
||||
- **Relations** : Toujours avec `backref` explicite
|
||||
- **Cascades** : Définir explicitement le comportement
|
||||
@@ -433,6 +473,7 @@ sqlite3 school_management.db
|
||||
## 🐛 **Problèmes Courants**
|
||||
|
||||
### **Erreur : Template Not Found**
|
||||
|
||||
```python
|
||||
# ❌ Mauvais
|
||||
return render_template('config.html')
|
||||
@@ -442,6 +483,7 @@ return render_template('config/index.html')
|
||||
```
|
||||
|
||||
### **Erreur : SQLAlchemy Session**
|
||||
|
||||
```python
|
||||
# ❌ Oublier de commit
|
||||
db.session.add(new_student)
|
||||
@@ -452,6 +494,7 @@ db.session.commit()
|
||||
```
|
||||
|
||||
### **Erreur : Import Circulaire**
|
||||
|
||||
```python
|
||||
# ❌ Import direct dans models.py
|
||||
from app import app
|
||||
@@ -465,19 +508,22 @@ def get_current_app():
|
||||
## 📖 **Ressources Utiles**
|
||||
|
||||
### **Documentation Officielle**
|
||||
|
||||
- [Flask](https://flask.palletsprojects.com/) - Framework web
|
||||
- [SQLAlchemy](https://docs.sqlalchemy.org/) - ORM Python
|
||||
- [TailwindCSS](https://tailwindcss.com/) - Framework CSS
|
||||
- [Jinja2](https://jinja.palletsprojects.com/) - Moteur de templates
|
||||
|
||||
### **Outils de Développement**
|
||||
|
||||
- [uv](https://docs.astral.sh/uv/) - Gestionnaire de paquets
|
||||
- [pytest](https://docs.pytest.org/) - Framework de tests
|
||||
- [Flask-Shell](https://flask.palletsprojects.com/en/2.3.x/shell/) - Console interactive
|
||||
|
||||
### **Extensions Recommandées VSCode**
|
||||
|
||||
- Python
|
||||
- Flask Snippets
|
||||
- Flask Snippets
|
||||
- Jinja2
|
||||
- SQLite Viewer
|
||||
- TailwindCSS IntelliSense
|
||||
@@ -506,12 +552,14 @@ La **Phase 1** de refactoring a transformé Notytex en une application **robuste
|
||||
### 🔧 **1. Configuration Externalisée Sécurisée**
|
||||
|
||||
**Avant** : Configuration en dur avec clés secrètes dans le code
|
||||
|
||||
```python
|
||||
# ❌ Ancien : Sécurité compromise
|
||||
SECRET_KEY = os.urandom(32) # Différent à chaque redémarrage
|
||||
```
|
||||
|
||||
**Après** : Configuration robuste avec validation
|
||||
|
||||
```python
|
||||
# ✅ Nouveau : Configuration sécurisée
|
||||
# config/settings.py
|
||||
@@ -525,6 +573,7 @@ class Settings:
|
||||
```
|
||||
|
||||
**🎯 Bénéfices :**
|
||||
|
||||
- **Sécurité renforcée** : Plus de données sensibles en dur
|
||||
- **Configuration flexible** : Variables d'environnement (.env)
|
||||
- **Validation au démarrage** : Échec rapide si configuration incorrecte
|
||||
@@ -533,6 +582,7 @@ class Settings:
|
||||
### 🛡️ **2. Gestion d'Erreurs Centralisée**
|
||||
|
||||
**Avant** : Gestion d'erreurs dispersée et incohérente
|
||||
|
||||
```python
|
||||
# ❌ Ancien : Gestion ad-hoc
|
||||
try:
|
||||
@@ -542,6 +592,7 @@ except Exception as e:
|
||||
```
|
||||
|
||||
**Après** : Gestionnaires d'erreurs globaux
|
||||
|
||||
```python
|
||||
# ✅ Nouveau : Gestion centralisée
|
||||
# exceptions/handlers.py
|
||||
@@ -553,6 +604,7 @@ def handle_validation_error(error):
|
||||
```
|
||||
|
||||
**🎯 Bénéfices :**
|
||||
|
||||
- **Gestion unifiée** : Toutes les erreurs traitées de manière cohérente
|
||||
- **Support JSON/HTML** : API et interface web harmonisées
|
||||
- **Logs automatiques** : Traçabilité complète des erreurs
|
||||
@@ -561,12 +613,14 @@ def handle_validation_error(error):
|
||||
### 🔍 **3. Logging Structuré JSON**
|
||||
|
||||
**Avant** : Logs textuels basiques difficiles à analyser
|
||||
|
||||
```python
|
||||
# ❌ Ancien : Logs non structurés
|
||||
app.logger.info(f'Utilisateur {user} a créé évaluation {assessment}')
|
||||
```
|
||||
|
||||
**Après** : Logs JSON avec corrélation des requêtes
|
||||
|
||||
```python
|
||||
# ✅ Nouveau : Logs structurés
|
||||
# core/logging.py
|
||||
@@ -588,6 +642,7 @@ app.logger.info(f'Utilisateur {user} a créé évaluation {assessment}')
|
||||
```
|
||||
|
||||
**🎯 Bénéfices :**
|
||||
|
||||
- **Traçabilité complète** : ID de corrélation pour suivre les requêtes
|
||||
- **Analyse facilitée** : Logs exploitables par des outils (ELK, Splunk)
|
||||
- **Contexte riche** : URL, IP, user-agent automatiquement capturés
|
||||
@@ -596,6 +651,7 @@ app.logger.info(f'Utilisateur {user} a créé évaluation {assessment}')
|
||||
### 📦 **4. Repository Pattern pour l'Accès aux Données**
|
||||
|
||||
**Avant** : Accès direct aux modèles dans les contrôleurs
|
||||
|
||||
```python
|
||||
# ❌ Ancien : Couplage fort
|
||||
def assessments_list():
|
||||
@@ -604,6 +660,7 @@ def assessments_list():
|
||||
```
|
||||
|
||||
**Après** : Couche Repository découplée
|
||||
|
||||
```python
|
||||
# ✅ Nouveau : Accès découplé
|
||||
# repositories/assessment_repository.py
|
||||
@@ -621,6 +678,7 @@ def assessments_list():
|
||||
```
|
||||
|
||||
**🎯 Bénéfices :**
|
||||
|
||||
- **Séparation des responsabilités** : Logique d'accès données isolée
|
||||
- **Réutilisabilité** : Requêtes complexes réutilisables
|
||||
- **Testabilité** : Repositories mockables indépendamment
|
||||
@@ -629,12 +687,14 @@ def assessments_list():
|
||||
## 🏆 **Résultats de la Phase 1**
|
||||
|
||||
### 📊 **Métriques de Qualité**
|
||||
|
||||
- **100 tests passent** ✅ (vs 79 avant refactoring)
|
||||
- **0 régression fonctionnelle** ✅
|
||||
- **0 régression fonctionnelle** ✅
|
||||
- **Architecture découplée** ✅
|
||||
- **Sécurité renforcée** ✅
|
||||
|
||||
### 🎯 **Prêt pour la Production**
|
||||
|
||||
- **Configuration externalisée** : Variables d'environnement
|
||||
- **Logs exploitables** : JSON structuré avec corrélation
|
||||
- **Gestion d'erreurs robuste** : Gestionnaires centralisés
|
||||
@@ -643,17 +703,20 @@ def assessments_list():
|
||||
### 🚀 **Prochaines Phases**
|
||||
|
||||
**Phase 2 - Performance & Architecture** (En cours)
|
||||
|
||||
- Services découplés avec injection de dépendances
|
||||
- Validation centralisée avec Pydantic
|
||||
- Validation centralisée avec Pydantic
|
||||
- Cache layer pour optimiser les performances
|
||||
- Pagination des listes longues
|
||||
- Métriques et monitoring avancés
|
||||
|
||||
**Phase 3 - Finalisation**
|
||||
|
||||
- Tests d'intégration complets
|
||||
- Documentation API complète
|
||||
- Pipeline CI/CD
|
||||
|
||||
---
|
||||
|
||||
**Notytex v2.0** est maintenant une application **moderne, robuste et sécurisée**, respectant les meilleures pratiques de l'industrie et prête pour un déploiement professionnel ! 🎓✨
|
||||
**Notytex v2.0** est maintenant une application **moderne, robuste et sécurisée**, respectant les meilleures pratiques de l'industrie et prête pour un déploiement professionnel ! 🎓✨
|
||||
|
||||
|
||||
Reference in New Issue
Block a user