Coverage for app/controllers/admin/minor.py: 22%
36 statements
« prev ^ index » next coverage.py v7.10.2, created at 2026-01-22 18:12 +0000
« prev ^ index » next coverage.py v7.10.2, created at 2026-01-22 18:12 +0000
1from flask import render_template, g, abort, request, redirect, url_for, send_file
3from app.models.user import User
5from app.controllers.admin import admin_bp
7from app.logic.minor import getDeclaredMinorStudentsWithProgress, getMinorInterest, getMinorProgress, toggleMinorInterest, getMinorSpreadsheet
9@admin_bp.route('/admin/cceMinor', methods=['GET','POST'])
10def manageMinor():
11 if not g.current_user.isAdmin:
12 abort(403)
14 if request.method == 'POST':
15 interestedStudents = request.form.getlist('interestedStudents[]')
16 for student in interestedStudents:
17 user = User.get(username=student)
18 if not user.minorInterest:
19 toggleMinorInterest(student, True)
21 return redirect(url_for("admin.manageMinor"))
25 interestedStudentsList = getMinorInterest()
26 interestedStudentEmailString = ';'.join([student['email'] for student in interestedStudentsList])
27 sustainedEngagement = getMinorProgress()
28 declaredStudentsList = getDeclaredMinorStudentsWithProgress()
29 declaredStudentEmailString = ';'.join([student['email'] for student in declaredStudentsList])
31 declaredUsernames = {
32 s['username']
33 for s in declaredStudentsList
34 }
36 sustainedUsernames = {
37 s['username']
38 for s in sustainedEngagement
39 }
41 # merging both lists
42 cceMinorStudents = {}
43 # if they are in sustainedEngagement and have been declared
44 for student in sustainedEngagement:
45 cceMinorStudents[student['username']] = {
46 **student,
47 'isDeclaredMinor': student['username'] in declaredUsernames
48 }
50 for student in declaredStudentsList:
51 if student['username'] not in sustainedUsernames:
52 cceMinorStudents[student['username']] = {
53 **student,
54 'isDeclaredMinor': True
55 }
56 cceMinorStudents = list(cceMinorStudents.values())
59 return render_template('/admin/cceMinor.html',
60 cceMinorStudents = cceMinorStudents,
61 interestedStudentsList = interestedStudentsList,
62 declaredStudentsList = declaredStudentsList,
63 interestedStudentEmailString = interestedStudentEmailString,
64 declaredStudentEmailString = declaredStudentEmailString,
65 sustainedEngagement = sustainedEngagement,
66 )
68@admin_bp.route("/admin/cceMinor/download")
69def downloadSpreadsheet():
70 if not g.current_user.isCeltsAdmin:
71 abort(403)
73 newfile = getMinorSpreadsheet()
74 return send_file(open(newfile, 'rb'), download_name='minor_progress.xlsx', as_attachment=True)