def post(self, node_id): parser = reqparse.RequestParser() parser.add_argument('answer', type=str) parser.add_argument('question', type=int, location='args') args = parser.parse_args() question_id = args['question'] exam = Exam.get_or_none(Exam.node_id == node_id) current_attempt = Attempt.get_or_none((Attempt.user == current_user.id) & (Attempt.exam == exam)) with open(f"uploads/{exam.json_file}", "r") as json_file: data = json.load(json_file) if args['answer'] == data[question_id - 1]['answer']: current_attempt.correct += 1 else: current_attempt.incorrect += 1 user_answers = json.loads(current_attempt.answers) user_answers[str(question_id)] = args['answer'] current_attempt.answers = json.dumps(user_answers) current_attempt.save() return user_answers
def get(self, node_id): parser = reqparse.RequestParser() parser.add_argument('question', type=int, location='args', required=False) args = parser.parse_args() exam = Exam.get_or_none(Exam.node_id == node_id) user_roles = [role.name for role in list(current_user.roles.select())] if not bool(set(user_roles).intersection(set(exam.roles.split(','))))\ and not current_user.has_role("admin"): return "You can't do this.", 403 attempt = Attempt.get_or_none((Attempt.user == current_user.id) & (Attempt.exam == exam)) # Get a question question_id = args.get('question') if question_id is not None: if attempt is None: return "You have not started your attempt." if attempt.times > exam.attempts: return "Number of attempts exceeded." if attempt.time_start < datetime.now() - timedelta( minutes=exam.time): return {"timeUp": True} with open(f"uploads/{exam.json_file}", "r") as json_file: data = json.load(json_file) question = data[question_id - 1] del question['answer'] if data.index(question) == (len(data) - 1): question['last'] = True return question exam_dict = marshal(exam, exam_fields) if attempt is not None: exam_dict["attempts_left"] = exam.attempts - attempt.times else: exam_dict["attempts_left"] = exam.attempts return exam_dict
def get(self, node_id): exam = Exam.get_or_none(Exam.node_id == node_id) if exam is None: return '', 406 if exam.locked: return "Locked.", 423 user_roles = [role.name for role in list(current_user.roles.select())] if not bool(set(user_roles).intersection(set(exam.roles.split(','))))\ and not current_user.has_role("admin"): return "You can't do this.", 403 last_attempt = Attempt.get_or_none((Attempt.user == current_user.id) & (Attempt.exam == exam)) if last_attempt is None: time_start = datetime.now() attempt = Attempt(user=current_user.id, exam=exam, time_start=time_start) attempt.save() elif (last_attempt.time_start > datetime.now() - timedelta(minutes=exam.time)): return { "message": "There's a valid attempt still going.", "time_start": last_attempt.time_start.ctime() } else: if last_attempt.times > exam.attempts: return "Number of attempts exceeded." last_attempt.correct = 0 last_attempt.incorrect = 0 time_start = datetime.now() last_attempt.time_start = time_start last_attempt.times += 1 last_attempt.answers = '{}' last_attempt.save() with open(f"uploads/{exam.json_file}", "r") as json_file: data = json.load(json_file) return {"time": exam.time, "max_questions": len(data)}
def get(self, node_id): exam = Exam.get_or_none(Exam.node_id == node_id) if exam is None: return '', 406 current_attempt = Attempt.get((Attempt.user == current_user.id) & (Attempt.exam == exam)) current_attempt.time_start -= timedelta(minutes=exam.time) current_attempt.save() return "Finished."
def get(self, node_id): exam = Exam.get_or_none(Exam.node_id == node_id) submitters = list(Attempt.select()) if exam is None: return '', 406 with open(f"uploads/{exam.json_file}", "r") as json_file: data = json.load(json_file) return { "submitters": marshal(submitters, result_fields), "max_questions": len(data) }