Esempio n. 1
0
    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
Esempio n. 2
0
    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
Esempio n. 3
0
    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)}
Esempio n. 4
0
    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."
Esempio n. 5
0
    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)
        }