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
« prev ^ index » next coverage.py v7.8.0, created at 2025-05-05 14:02 +0000
1"""Handles the routes for the skills module."""
3from html import escape
4import uuid
5from flask import jsonify, redirect, render_template, request, send_file
6from core import handlers
7from .models import Skill
10def add_skills_routes(app):
11 """Skills routes"""
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
22 return Skill().attempt_add_skill(skill_name)
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 )
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
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 }
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)
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 )
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)
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")
73 if not skill_id or not skill_name or not skill_description:
74 return jsonify({"error": "Missing fields"}), 400
76 return Skill().update_skill(skill_id, skill_name, skill_description)
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 )
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()
92 return render_template(
93 "/skills/skill_approval.html",
94 attempted_skills=attempted_skills,
95 user_type="admin",
96 page="skills",
97 )
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")
105 return Skill().approve_skill(uuid, description)
107 @app.route("/skills/reject_skill", methods=["POST"])
108 @handlers.login_required
109 def reject_skill():
110 uuid = request.args.get("attempt_skill_id")
112 return Skill().reject_skill(uuid)
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)
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()
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()
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)
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 )
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()
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()