def getUserResults(req, courseId, assignmentId, username): """Get the results for a given username""" req.content_type = "text/html" strout = websutil.OutputString() try: vmcfg = config.CourseConfig(CourseList().course_config(courseId)) except: traceback.print_exc(file=strout) return json.dumps({"errorType": ERR_EXCEPTION, "errorMessage": "", "errorTrace": strout.get()}) vmpaths = paths.VmcheckerPaths(vmcfg.root_path()) submission_dir = vmpaths.dir_submission_root(assignmentId, username) r_path = paths.dir_submission_results(submission_dir) strout = websutil.OutputString() try: result_files = [] if os.path.isdir(r_path): update_db.update_all(courseId) for fname in os.listdir(r_path): # skill all files not ending in '.vmr' if not fname.endswith(".vmr"): continue f_path = os.path.join(r_path, fname) if os.path.isfile(f_path): with open(f_path, "r") as f: result_files.append({fname: f.read()}) if len(result_files) != 0: result_files = websutil.sortResultFiles(result_files) else: process = subprocess.Popen("/usr/games/fortune", shell=False, stdout=subprocess.PIPE) msg = "In the meantime have a fortune cookie: <blockquote>" msg += process.communicate()[0] + "</blockquote>" result_files = [{"Your results are not ready yet": msg}] return json.dumps(result_files) except: traceback.print_exc(file=strout) return json.dumps({"errorType": ERR_EXCEPTION, "errorMessage": "", "errorTrace": strout.get()})
def getAllGrades(req, courseId): """Returns a table with all the grades of all students for a given course""" req.content_type = "text/html" try: update_db.update_all(courseId) vmcfg = CourseConfig(CourseList().course_config(courseId)) vmpaths = paths.VmcheckerPaths(vmcfg.root_path()) db_conn = sqlite3.connect(vmpaths.db_file()) assignments = vmcfg.assignments() sorted_assg = sorted( assignments, lambda x, y: int(assignments.get(x, "OrderNumber")) - int(assignments.get(y, "OrderNumber")) ) grades = {} try: db_cursor = db_conn.cursor() db_cursor.execute( "SELECT users.name, assignments.name, grades.grade " "FROM users, assignments, grades " "WHERE 1 " "AND users.id = grades.user_id " "AND assignments.id = grades.assignment_id" ) for row in db_cursor: user, assignment, grade = row grades.setdefault(user, {})[assignment] = grade db_cursor.close() finally: db_conn.close() ret = [] for user in sorted(grades.keys()): ret.append({"studentName": user, "studentId": user, "results": grades.get(user)}) return json.dumps(ret) except: strout = websutil.OutputString() traceback.print_exc(file=strout) return json.dumps({"errorType": ERR_EXCEPTION, "errorMessage": "", "errorTrace": strout.get()})