Coverage for skills/routes_skills.py: 88%

113 statements  

« prev     ^ index     » next       coverage.py v7.8.0, created at 2025-05-05 14:02 +0000

1"""Handles the routes for the skills module.""" 

2 

3from html import escape 

4import uuid 

5from flask import jsonify, redirect, render_template, request, send_file 

6from core import handlers 

7from .models import Skill 

8 

9 

10def add_skills_routes(app): 

11 """Skills routes""" 

12 

13 @app.route("/skills/attempt_add_skill_student", methods=["POST"]) 

14 @handlers.student_login_required 

15 def attempt_add_skill_student(): 

16 """Attempt to add a skill to a student.""" 

17 skill_name = request.json.get("skill_name").lower() 

18 skill_name = escape(skill_name) 

19 if not skill_name: 

20 return jsonify({"error": "Missing skill name"}), 400 

21 

22 return Skill().attempt_add_skill(skill_name) 

23 

24 @app.route("/skills/add_skill", methods=["POST", "GET"]) 

25 @handlers.login_required 

26 def add_skill(): 

27 if request.method == "GET": 

28 return render_template( 

29 "/skills/adding_skills.html", user_type="admin", page="skills" 

30 ) 

31 

32 if not request.form.get("skill_name") or not request.form.get( 

33 "skill_description" 

34 ): 

35 return jsonify({"error": "One of the inputs is blank"}), 400 

36 

37 skill = { 

38 "_id": uuid.uuid1().hex, 

39 "skill_name": escape(request.form.get("skill_name")), 

40 "skill_description": escape(request.form.get("skill_description")), 

41 } 

42 

43 if skill["skill_name"] == "" or skill["skill_description"] == "": 

44 return jsonify({"error": "One of the inputs is blank"}), 400 

45 return Skill().add_skill(skill) 

46 

47 @app.route("/skills/search", methods=["GET"]) 

48 @handlers.login_required 

49 def list_skills(): 

50 return render_template( 

51 "/skills/search.html", 

52 user_type="admin", 

53 skills=Skill().get_skills(), 

54 page="skills", 

55 ) 

56 

57 @app.route("/skills/delete", methods=["DELETE"]) 

58 @handlers.login_required 

59 def delete_skill(): 

60 skill_id = request.args.get("skill_id") 

61 if not skill_id: 

62 return jsonify({"error": "Missing skill ID"}), 400 

63 return Skill().delete_skill(skill_id) 

64 

65 @app.route("/skills/update", methods=["POST", "GET"]) 

66 @handlers.login_required 

67 def update_skill(): 

68 if request.method == "POST": 

69 skill_id = request.form.get("skill_id") 

70 skill_name = request.form.get("skill_name") 

71 skill_description = request.form.get("skill_description") 

72 

73 if not skill_id or not skill_name or not skill_description: 

74 return jsonify({"error": "Missing fields"}), 400 

75 

76 return Skill().update_skill(skill_id, skill_name, skill_description) 

77 

78 skill_id = request.args.get("skill_id") 

79 skill = Skill().find_skill(None, skill_id) 

80 if skill is None: 

81 return redirect("/404") 

82 return render_template( 

83 "/skills/update_skill.html", skill=skill, user_type="admin", page="skills" 

84 ) 

85 

86 @app.route("/skills/attempted_skill_search", methods=["GET"]) 

87 @handlers.login_required 

88 def search_attempt_skills(): 

89 """Approval page for attempted Skills""" 

90 attempted_skills = Skill().get_list_attempted_skills() 

91 

92 return render_template( 

93 "/skills/skill_approval.html", 

94 attempted_skills=attempted_skills, 

95 user_type="admin", 

96 page="skills", 

97 ) 

98 

99 @app.route("/skills/approve_skill", methods=["POST"]) 

100 @handlers.login_required 

101 def approve_skill(): 

102 uuid = request.args.get("attempt_skill_id") 

103 description = request.json.get("skill_description") 

104 

105 return Skill().approve_skill(uuid, description) 

106 

107 @app.route("/skills/reject_skill", methods=["POST"]) 

108 @handlers.login_required 

109 def reject_skill(): 

110 uuid = request.args.get("attempt_skill_id") 

111 

112 return Skill().reject_skill(uuid) 

113 

114 @app.route("/skills/update_attempted_skill", methods=["GET", "POST"]) 

115 @handlers.login_required 

116 def update_attempted_skill(): 

117 if request.method == "GET": 

118 skill_id = request.args.get("attempt_skill_id") 

119 skill = Skill().get_attempted_skill(skill_id) 

120 if skill is None: 

121 return redirect("/404") 

122 return render_template( 

123 "/skills/update_attempt_skill.html", skill=skill, page="skills" 

124 ) 

125 skill_id = request.form.get("skill_id") 

126 skill_name = request.form.get("skill_name").lower() 

127 skill_description = request.form.get("skill_description") 

128 if not skill_name or not skill_description: 

129 return jsonify({"error": "One of the inputs is blank"}), 400 

130 return Skill().update_attempt_skill(skill_id, skill_name, skill_description) 

131 

132 @app.route("/skills/download_all", methods=["GET"]) 

133 @handlers.login_required 

134 def download_all_skills(): 

135 """Download all skills""" 

136 return Skill().download_all() 

137 

138 @app.route("/skills/download_attempted", methods=["GET"]) 

139 @handlers.login_required 

140 def download_all_attempted_skills(): 

141 """Download attempted skills""" 

142 return Skill().download_attempted() 

143 

144 @app.route("/skills/upload", methods=["GET", "POST"]) 

145 @handlers.login_required 

146 def upload_skills(): 

147 """Upload skills from an excel file""" 

148 if request.method == "GET": 

149 return render_template( 

150 "/skills/upload.html", user_type="admin", page="skills" 

151 ) 

152 file = request.files["file"] 

153 if not file: 

154 return jsonify({"error": "No file uploaded"}), 400 

155 if not handlers.allowed_file(file.filename, ["xlsx"]): 

156 return jsonify({"error": "Invalid file type"}), 400 

157 return Skill().upload_skills(file) 

158 

159 @app.route("/skills/download_template", methods=["GET"]) 

160 @handlers.login_required 

161 def download_skills_template(): 

162 """Download the skills template""" 

163 return send_file( 

164 "data_model_upload_template/skills_template.xlsx", as_attachment=True 

165 ) 

166 

167 @app.route("/skills/delete_all_attempted_skill", methods=["DELETE"]) 

168 @handlers.login_required 

169 def delete_all_attempted_skills(): 

170 """Delete all attempted skills""" 

171 return Skill().delete_all_attempted_skill() 

172 

173 @app.route("/skills/delete_all_skills", methods=["DELETE"]) 

174 @handlers.login_required 

175 def delete_all_skills(): 

176 """Delete all skills""" 

177 return Skill().delete_all_skills()