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

1from flask import render_template, g, abort, request, redirect, url_for, send_file 

2 

3from app.models.user import User 

4 

5from app.controllers.admin import admin_bp 

6 

7from app.logic.minor import getDeclaredMinorStudentsWithProgress, getMinorInterest, getMinorProgress, toggleMinorInterest, getMinorSpreadsheet 

8 

9@admin_bp.route('/admin/cceMinor', methods=['GET','POST']) 

10def manageMinor(): 

11 if not g.current_user.isAdmin: 

12 abort(403) 

13 

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) 

20 

21 return redirect(url_for("admin.manageMinor")) 

22 

23 

24 

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]) 

30 

31 declaredUsernames = { 

32 s['username'] 

33 for s in declaredStudentsList 

34 } 

35 

36 sustainedUsernames = { 

37 s['username'] 

38 for s in sustainedEngagement 

39 } 

40 

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 } 

49 

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()) 

57 

58 

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 ) 

67 

68@admin_bp.route("/admin/cceMinor/download") 

69def downloadSpreadsheet(): 

70 if not g.current_user.isCeltsAdmin: 

71 abort(403) 

72 

73 newfile = getMinorSpreadsheet() 

74 return send_file(open(newfile, 'rb'), download_name='minor_progress.xlsx', as_attachment=True) 

75 

76