elemes/routes/progress.py

84 lines
2.8 KiB
Python

"""
Student progress tracking and reporting JSON API routes.
"""
import csv
import io
import logging
from flask import Blueprint, request, jsonify, Response
from services.token_service import (
validate_token,
update_student_progress,
get_all_students_progress,
)
from services.lesson_service import get_lessons_with_learning_objectives
progress_bp = Blueprint('progress', __name__)
@progress_bp.route('/track-progress', methods=['POST'])
def track_progress():
"""Track student progress for a lesson."""
try:
data = request.get_json()
token = data.get('token', '').strip()
lesson_name = data.get('lesson_name', '').strip()
status = data.get('status', 'completed').strip()
logging.info(f"Received track-progress request: token={token}, lesson_name={lesson_name}, status={status}")
if not token or not lesson_name:
return jsonify({'success': False, 'message': 'Token and lesson name are required'})
student_info = validate_token(token)
if not student_info:
return jsonify({'success': False, 'message': 'Invalid token'})
updated = update_student_progress(token, lesson_name, status)
if updated:
logging.info(f"Progress updated successfully for token {token}, lesson {lesson_name}")
return jsonify({'success': True, 'message': 'Progress updated successfully'})
else:
logging.warning(f"Failed to update progress for token {token}, lesson {lesson_name}")
return jsonify({'success': False, 'message': 'Failed to update progress'})
except Exception as e:
logging.error(f"Error in track-progress: {e}")
return jsonify({'success': False, 'message': f'Error tracking progress: {e}'})
@progress_bp.route('/progress-report.json')
def api_progress_report():
"""Return progress report data as JSON."""
all_students_progress, ordered_lessons = get_all_students_progress(
get_lessons_with_learning_objectives,
)
return jsonify({
'students': all_students_progress,
'lessons': [{'filename': l['filename'], 'title': l['title']} for l in ordered_lessons],
})
@progress_bp.route('/progress-report/export-csv')
def export_progress_csv():
"""Export the progress report as CSV."""
all_students_progress, _ordered_lessons = get_all_students_progress(
get_lessons_with_learning_objectives,
)
output = io.StringIO()
if all_students_progress:
fieldnames = list(all_students_progress[0].keys())
writer = csv.DictWriter(output, fieldnames=fieldnames, delimiter=';')
writer.writeheader()
writer.writerows(all_students_progress)
return Response(
output.getvalue(),
mimetype='text/csv',
headers={"Content-Disposition": "attachment; filename=progress_report.csv"},
)