Skip to content
Closed
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
90 changes: 70 additions & 20 deletions progressReport/app.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
from flask import Flask, request, render_template
from flask import Flask, request, render_template, redirect, url_for
from werkzeug.utils import secure_filename
import json
import os
Expand Down Expand Up @@ -65,8 +65,7 @@

app = Flask(__name__)

@app.route('/', methods=["GET"])
def index():
def render(school_name, course_name, student_mastery, class_mastery, use_json=False):
def assign_node_levels(node, student_levels_count, class_levels_count):
nonlocal student_mastery, class_mastery
if not node["children"]:
Expand All @@ -93,28 +92,35 @@ def assign_node_levels(node, student_levels_count, class_levels_count):
node["class_level"] = sum(children_class_levels) // len(children_class_levels)
return node["student_level"], node["class_level"]

school_name = request.args.get("school", "Berkeley")
course_name = request.args.get("class", "CS10")
student_mastery = request.args.get("student_mastery", "000000")
class_mastery = request.args.get("class_mastery", "")
use_url_class_mastery = True if class_mastery != "" else False
if not student_mastery.isdigit():
return "URL parameter student_mastery is invalid", 400
if use_url_class_mastery and not class_mastery.isdigit():
return "URL parameter class_mastery is invalid", 400
if not use_json:
use_url_class_mastery = True if class_mastery != "" else False
if not student_mastery.isdigit():
return "URL parameter student_mastery is invalid", 400
if use_url_class_mastery and not class_mastery.isdigit():
return "URL parameter class_mastery is invalid", 400
else:
if not isinstance(student_mastery, dict):
return "URL parameter student_mastery is invalid", 400
if not isinstance(class_mastery, dict):
return "URL parameter class_mastery is invalid", 400
use_url_class_mastery = True if len(class_mastery) > 0 else False

parser.generate_map(school_name=secure_filename(school_name), course_name=secure_filename(course_name), render=True)
try:
with open("data/{}_{}.json".format(secure_filename(school_name), secure_filename(course_name))) as data_file:
course_data = json.load(data_file)
except FileNotFoundError:
return "Class not found", 400
return "Course not found", 400

start_date = course_data["start date"]
course_term = course_data["term"]
class_levels = course_data["class levels"]
student_levels = course_data["student levels"]
course_node_count = course_data["count"]
course_nodes = course_data["nodes"]

assign_node_levels(course_nodes, len(student_levels), len(class_levels))

return render_template("web_ui.html",
start_date=start_date,
course_name=course_name,
Expand All @@ -125,18 +131,62 @@ def assign_node_levels(node, student_levels_count, class_levels_count):
course_node_count=course_node_count,
course_data=course_nodes)

def parse_json_mastery(school_name, course_name, student_mastery_json, class_mastery_json):
def assign_node_levels_json(node, student_levels_count, class_levels_count):
nonlocal student_mastery, class_mastery
Copy link
Owner

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Revise this to remove side effects and just return the student and class mastery

if not node["children"]:
if node["name"] in student_mastery_json and isinstance(student_mastery_json[node["name"]], int):
student_mastery += str(student_mastery_json[node["name"]]) \
if student_mastery_json[node["name"]] < student_levels_count \
else student_levels_count - 1
else:
student_mastery += "0"
if node["name"] in class_mastery_json and isinstance(class_mastery_json[node["name"]], int):
class_mastery += str(class_mastery_json[node["name"]]) \
if class_mastery_json[node["name"]] < class_levels_count \
else class_levels_count - 1
else:
class_mastery += "0"
else:
for child in node["children"]:
assign_node_levels_json(child, student_levels_count, class_levels_count)
return

@app.route('/parse', methods=["POST"])
def parse():
school_name = request.args.get("school_name", "Berkeley")
course_name = request.form.get("course_name", "CS10")
parser.generate_map(school_name=secure_filename(school_name), course_name=secure_filename(course_name), render=False)
parser.generate_map(school_name=secure_filename(school_name), course_name=secure_filename(course_name), render=True)
try:
with open("data/{}_{}.json".format(secure_filename(school_name), secure_filename(course_name))) as data_file:
course_data = json.load(data_file)
except FileNotFoundError:
return "Class not found", 400
return course_data
return None, None
course_nodes = course_data["nodes"]
student_mastery, class_mastery = "", ""
assign_node_levels_json(course_nodes, len(course_data["student levels"]), len(course_data["class levels"]))
return student_mastery, class_mastery


@app.route('/', methods=["GET"])
def index():
school_name = request.args.get("school", "Berkeley")
course_name = request.args.get("course", "CS10")
student_mastery = request.args.get("student_mastery", "0")
class_mastery = request.args.get("class_mastery", "0")
return render(school_name, course_name, student_mastery, class_mastery)

@app.route('/json', methods=["POST"])
def index_json():
args_json = request.get_json()
if args_json is None:
return "URL JSON parameter is invalid", 400
school_name = args_json["school"] if "school" in args_json else "Berkeley"
course_name = args_json["course"] if "course" in args_json else "CS10"
student_mastery_json = args_json["student_mastery"] if "student_mastery" in args_json else {}
class_mastery_json = args_json["class_mastery"] if "class_mastery" in args_json else {}
student_mastery, class_mastery = parse_json_mastery(school_name, course_name,
student_mastery_json, class_mastery_json)
if student_mastery is None or class_mastery is None:
return "Course not found", 400
return redirect(url_for("index", school=school_name, course=course_name,
student_mastery=student_mastery, class_mastery=class_mastery))


if __name__ == '__main__':
Expand Down