Files
notytex/app.py

117 lines
4.5 KiB
Python

import os
from flask import Flask, render_template
from models import db
from repositories import AssessmentRepository, StudentRepository, ClassRepository
from commands import init_db, create_large_test_data
from app_config_classes import config
from app_config import config_manager
from exceptions.handlers import register_error_handlers
from core.logging import setup_logging
# Import blueprints
from routes.assessments import bp as assessments_bp
from routes.grading import bp as grading_bp
from routes.config import bp as config_bp
from routes.domains import bp as domains_bp
from routes.classes import bp as classes_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])
# Initialiser la configuration de l'application
app.app_config = config_manager
# Configuration du logging structuré
setup_logging(app)
# Initialize extensions
db.init_app(app)
# Register error handlers
register_error_handlers(app)
# Initialiser la configuration par défaut après l'initialisation de la DB
with app.app_context():
db.create_all()
config_manager.initialize_default_config()
# Register blueprints
app.register_blueprint(assessments_bp)
app.register_blueprint(grading_bp)
app.register_blueprint(config_bp)
app.register_blueprint(domains_bp)
app.register_blueprint(classes_bp)
# Register CLI commands
app.cli.add_command(init_db)
app.cli.add_command(create_large_test_data)
# Main routes
@app.route('/')
def index():
try:
assessment_repo = AssessmentRepository()
student_repo = StudentRepository()
class_repo = ClassRepository()
recent_assessments = assessment_repo.find_recent(5)
total_students = student_repo.model_class.query.count() # Keeping simple count
total_assessments = assessment_repo.model_class.query.count() # Keeping simple count
total_classes = class_repo.count_all()
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:
class_repo = ClassRepository()
classes = class_repo.find_all_ordered('year_name')
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:
# Utilisation du repository temporel pour récupérer tous les élèves avec leur classe actuelle
from repositories.temporal_student_repository import TemporalStudentRepository
from models import Student
temporal_repo = TemporalStudentRepository()
all_students = Student.query.order_by(Student.last_name, Student.first_name).all()
# Enrichir chaque élève avec sa classe actuelle
students_with_classes = []
for student in all_students:
current_class = student.get_current_class()
students_with_classes.append({
'student': student,
'current_class': current_class
})
return render_template('students.html', students_with_classes=students_with_classes)
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)