93 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			93 lines
		
	
	
		
			3.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| 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(config_name=None):
 | |
|     if config_name is None:
 | |
|         config_name = os.environ.get('FLASK_ENV', 'development')
 | |
|     
 | |
|     app = Flask(__name__)
 | |
|     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)
 | |
| 
 | |
|     # Register blueprints
 | |
|     app.register_blueprint(assessments_bp)
 | |
|     app.register_blueprint(exercises_bp)
 | |
|     app.register_blueprint(grading_bp)
 | |
| 
 | |
|     # Register CLI commands
 | |
|     app.cli.add_command(init_db)
 | |
| 
 | |
|     # Main routes
 | |
|     @app.route('/')
 | |
|     def index():
 | |
|         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():
 | |
|         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():
 | |
|         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
 | |
| 
 | |
| if __name__ == '__main__':
 | |
|     app = create_app()
 | |
|     with app.app_context():
 | |
|         db.create_all()
 | |
|     
 | |
|     # 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) |