feat: add concil page
This commit is contained in:
@@ -260,4 +260,157 @@ def details_legacy(id):
|
||||
return render_template('class_details.html',
|
||||
class_group=class_group,
|
||||
students=students,
|
||||
recent_assessments=recent_assessments)
|
||||
recent_assessments=recent_assessments)
|
||||
|
||||
@bp.route('/<int:id>/council')
|
||||
@handle_db_errors
|
||||
def council_preparation(id):
|
||||
"""Page de préparation du conseil de classe."""
|
||||
# Le trimestre est obligatoire pour la préparation du conseil
|
||||
trimester = request.args.get('trimestre', type=int)
|
||||
if not trimester or trimester not in [1, 2, 3]:
|
||||
flash('Veuillez sélectionner un trimestre pour préparer le conseil de classe.', 'error')
|
||||
return redirect(url_for('classes.dashboard', id=id))
|
||||
|
||||
# Vérifier que la classe existe
|
||||
class_repo = ClassRepository()
|
||||
class_group = class_repo.get_or_404(id)
|
||||
|
||||
try:
|
||||
# Injection de dépendances via factory
|
||||
from services.council_services import CouncilServiceFactory
|
||||
council_service = CouncilServiceFactory.create_council_preparation_service()
|
||||
|
||||
# Préparer toutes les données du conseil
|
||||
council_data = council_service.prepare_council_data(id, trimester)
|
||||
|
||||
current_app.logger.info(f'Préparation conseil classe {id}, trimestre {trimester} - {len(council_data.student_summaries)} élèves')
|
||||
|
||||
return render_template('class_council_preparation.html',
|
||||
class_group=class_group,
|
||||
trimester=trimester,
|
||||
council_data=council_data,
|
||||
student_summaries=council_data.student_summaries,
|
||||
class_statistics=council_data.class_statistics,
|
||||
appreciation_stats=council_data.appreciation_stats)
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f'Erreur préparation conseil classe {id}: {e}')
|
||||
flash('Erreur lors de la préparation des données du conseil de classe.', 'error')
|
||||
return redirect(url_for('classes.dashboard', id=id))
|
||||
|
||||
@bp.route('/<int:class_id>/council/appreciation/<int:student_id>', methods=['POST'])
|
||||
@handle_db_errors
|
||||
def save_appreciation_api(class_id, student_id):
|
||||
"""API pour sauvegarde d'appréciations (AJAX)."""
|
||||
try:
|
||||
# Vérifications de base
|
||||
class_repo = ClassRepository()
|
||||
class_group = class_repo.get_or_404(class_id)
|
||||
|
||||
data = request.get_json()
|
||||
if not data:
|
||||
return jsonify({'success': False, 'error': 'Données manquantes'}), 400
|
||||
|
||||
# Validation du trimestre
|
||||
trimester = data.get('trimester')
|
||||
if not trimester or trimester not in [1, 2, 3]:
|
||||
return jsonify({'success': False, 'error': 'Trimestre invalide'}), 400
|
||||
|
||||
# Vérifier que l'élève appartient à cette classe
|
||||
from models import Student
|
||||
student = Student.query.get_or_404(student_id)
|
||||
if student.class_group_id != class_id:
|
||||
return jsonify({'success': False, 'error': 'Élève non trouvé dans cette classe'}), 403
|
||||
|
||||
# Préparer les données d'appréciation
|
||||
appreciation_data = {
|
||||
'student_id': student_id,
|
||||
'class_group_id': class_id,
|
||||
'trimester': trimester,
|
||||
'general_appreciation': data.get('appreciation', '').strip() or None,
|
||||
'strengths': data.get('strengths', '').strip() or None,
|
||||
'areas_for_improvement': data.get('areas_for_improvement', '').strip() or None,
|
||||
'status': data.get('status', 'draft')
|
||||
}
|
||||
|
||||
# Sauvegarder via le service
|
||||
from services.council_services import CouncilServiceFactory
|
||||
appreciation_service = CouncilServiceFactory.create_appreciation_service()
|
||||
result = appreciation_service.save_appreciation(appreciation_data)
|
||||
|
||||
current_app.logger.info(f'Appréciation sauvegardée - Élève {student_id}, Classe {class_id}, T{trimester}')
|
||||
|
||||
return jsonify({
|
||||
'success': True,
|
||||
'appreciation_id': result.id,
|
||||
'last_modified': result.last_modified.isoformat(),
|
||||
'status': result.status,
|
||||
'has_content': result.has_content
|
||||
})
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f'Erreur sauvegarde appréciation élève {student_id}: {e}')
|
||||
return jsonify({
|
||||
'success': False,
|
||||
'error': 'Erreur lors de la sauvegarde'
|
||||
}), 500
|
||||
|
||||
@bp.route('/<int:class_id>/council/api')
|
||||
@handle_db_errors
|
||||
def council_data_api(class_id):
|
||||
"""API JSON pour récupérer les données d'un trimestre (AJAX)."""
|
||||
try:
|
||||
# Vérifications
|
||||
trimester = request.args.get('trimestre', type=int)
|
||||
if not trimester or trimester not in [1, 2, 3]:
|
||||
return jsonify({'error': 'Trimestre invalide'}), 400
|
||||
|
||||
class_repo = ClassRepository()
|
||||
class_group = class_repo.get_or_404(class_id)
|
||||
|
||||
# Récupérer les données via le service
|
||||
from services.council_services import CouncilServiceFactory
|
||||
council_service = CouncilServiceFactory.create_council_preparation_service()
|
||||
council_data = council_service.prepare_council_data(class_id, trimester)
|
||||
|
||||
# Formatter pour JSON
|
||||
response_data = {
|
||||
'trimester': trimester,
|
||||
'class_id': class_id,
|
||||
'total_students': council_data.total_students,
|
||||
'completed_appreciations': council_data.completed_appreciations,
|
||||
'class_statistics': council_data.class_statistics,
|
||||
'appreciation_stats': council_data.appreciation_stats,
|
||||
'students': []
|
||||
}
|
||||
|
||||
# Ajouter les données des élèves
|
||||
for summary in council_data.student_summaries:
|
||||
student_data = {
|
||||
'id': summary.student.id,
|
||||
'name': summary.student.full_name,
|
||||
'last_name': summary.student.last_name,
|
||||
'first_name': summary.student.first_name,
|
||||
'average': summary.overall_average,
|
||||
'assessment_count': summary.assessment_count,
|
||||
'performance_status': summary.performance_status,
|
||||
'has_appreciation': summary.has_appreciation,
|
||||
'assessments': {}
|
||||
}
|
||||
|
||||
# Ajouter les détails des évaluations
|
||||
for assessment_id, assessment_data in summary.grades_by_assessment.items():
|
||||
student_data['assessments'][assessment_id] = {
|
||||
'score': assessment_data['score'],
|
||||
'max': assessment_data['max'],
|
||||
'title': assessment_data['title']
|
||||
}
|
||||
|
||||
response_data['students'].append(student_data)
|
||||
|
||||
return jsonify(response_data)
|
||||
|
||||
except Exception as e:
|
||||
current_app.logger.error(f'Erreur API données conseil classe {class_id}: {e}')
|
||||
return jsonify({'error': 'Erreur lors de la récupération des données'}), 500
|
||||
Reference in New Issue
Block a user