feat: improve assessment creation and edition

This commit is contained in:
2025-08-04 08:25:21 +02:00
parent e0a3ea2764
commit a0608e27aa
20 changed files with 1265 additions and 519 deletions

73
app.py
View File

@@ -1,17 +1,35 @@
import os
import logging
from flask import Flask, render_template
from models import db, Assessment, Student, ClassGroup
from commands import init_db
from config import config
# Import blueprints
from routes.assessments import bp as assessments_bp
from routes.exercises import bp as exercises_bp
from routes.grading import bp as grading_bp
def create_app():
def create_app(config_name=None):
if config_name is None:
config_name = os.environ.get('FLASK_ENV', 'development')
app = Flask(__name__)
app.config['SECRET_KEY'] = 'your-secret-key-here'
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///school_management.db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
app.config.from_object(config[config_name])
# Configuration du logging
if not app.debug and not app.testing:
if not os.path.exists('logs'):
os.mkdir('logs')
file_handler = logging.FileHandler('logs/school_management.log')
file_handler.setFormatter(logging.Formatter(
'%(asctime)s %(levelname)s: %(message)s [in %(pathname)s:%(lineno)d]'
))
file_handler.setLevel(logging.INFO)
app.logger.addHandler(file_handler)
app.logger.setLevel(logging.INFO)
app.logger.info('Application de gestion scolaire démarrée')
# Initialize extensions
db.init_app(app)
@@ -27,25 +45,41 @@ def create_app():
# Main routes
@app.route('/')
def index():
recent_assessments = Assessment.query.order_by(Assessment.date.desc()).limit(5).all()
total_students = Student.query.count()
total_assessments = Assessment.query.count()
total_classes = ClassGroup.query.count()
return render_template('index.html',
recent_assessments=recent_assessments,
total_students=total_students,
total_assessments=total_assessments,
total_classes=total_classes)
try:
recent_assessments = Assessment.query.order_by(Assessment.date.desc()).limit(5).all()
total_students = Student.query.count()
total_assessments = Assessment.query.count()
total_classes = ClassGroup.query.count()
return render_template('index.html',
recent_assessments=recent_assessments,
total_students=total_students,
total_assessments=total_assessments,
total_classes=total_classes)
except Exception as e:
app.logger.error(f'Erreur lors du chargement de la page d\'accueil: {e}')
return render_template('error.html', error="Erreur lors du chargement de la page"), 500
@app.route('/classes')
def classes():
classes = ClassGroup.query.order_by(ClassGroup.year, ClassGroup.name).all()
return render_template('classes.html', classes=classes)
try:
classes = ClassGroup.query.order_by(ClassGroup.year, ClassGroup.name).all()
return render_template('classes.html', classes=classes)
except Exception as e:
app.logger.error(f'Erreur lors du chargement des classes: {e}')
return render_template('error.html', error="Erreur lors du chargement des classes"), 500
@app.route('/students')
def students():
students = Student.query.join(ClassGroup).order_by(ClassGroup.name, Student.last_name, Student.first_name).all()
return render_template('students.html', students=students)
try:
# Optimisation: utiliser joinedload pour éviter les requêtes N+1
from sqlalchemy.orm import joinedload
students = Student.query.options(joinedload(Student.class_group)).order_by(
ClassGroup.name, Student.last_name, Student.first_name
).join(ClassGroup).all()
return render_template('students.html', students=students)
except Exception as e:
app.logger.error(f'Erreur lors du chargement des étudiants: {e}')
return render_template('error.html', error="Erreur lors du chargement des étudiants"), 500
return app
@@ -53,4 +87,7 @@ if __name__ == '__main__':
app = create_app()
with app.app_context():
db.create_all()
app.run(debug=True)
# Le mode debug est géré par la configuration
port = int(os.environ.get('PORT', 5000))
app.run(host='0.0.0.0', port=port)