feat: uniform competence management

This commit is contained in:
2025-08-05 20:44:54 +02:00
parent 4a2d8a73e1
commit 91eb04ca01
26 changed files with 3801 additions and 167 deletions

View File

@@ -1,5 +1,6 @@
from flask import Blueprint, render_template, redirect, url_for, flash, request
from models import db, Assessment, Student, Grade, GradingElement, Exercise
from app_config import config_manager
bp = Blueprint('grading', __name__)
@@ -20,11 +21,16 @@ def assessment_grading(assessment_id):
key = f"{grade.student_id}_{grade.grading_element_id}"
existing_grades[key] = grade
# Préparer les informations d'affichage pour les scores
scale_values = config_manager.get_competence_scale_values()
return render_template('assessment_grading.html',
assessment=assessment,
students=students,
grading_elements=grading_elements,
existing_grades=existing_grades)
existing_grades=existing_grades,
scale_values=scale_values,
config_manager=config_manager)
@bp.route('/assessments/<int:assessment_id>/grading/save', methods=['POST'])
def save_grades(assessment_id):
@@ -45,15 +51,31 @@ def save_grades(assessment_id):
).first()
if value.strip(): # If value is not empty
if not grade:
grade = Grade(
student_id=student_id,
grading_element_id=element_id,
value=value
)
db.session.add(grade)
# Validation unifiée selon le nouveau système
grading_element = GradingElement.query.get(element_id)
if grading_element:
# Passer max_points pour la validation des notes
max_points = grading_element.max_points if grading_element.grading_type == 'notes' else None
# Normaliser virgule en point pour les notes avant sauvegarde
normalized_value = value.strip()
if grading_element.grading_type == 'notes' and ',' in normalized_value:
normalized_value = normalized_value.replace(',', '.')
if config_manager.validate_grade_value(normalized_value, grading_element.grading_type, max_points):
if not grade:
grade = Grade(
student_id=student_id,
grading_element_id=element_id,
value=normalized_value
)
db.session.add(grade)
else:
grade.value = normalized_value
else:
flash(f'Valeur invalide pour {grading_element.label if grading_element else "cet élément"}: {value}', 'warning')
else:
grade.value = value
flash(f'Élément de notation non trouvé: {element_id}', 'error')
elif grade: # If value is empty but grade exists, delete it
db.session.delete(grade)