Beispiel #1
0
    def grade_success(self, student_input, grader_payload, system_payload, system, response):
        """
        Проводит валидацию состояния выполнения лабораторной работы,
        предоставляемою СУО. В том случае, если работа всё-таки началась, в
        очередь будет поставлена проверка задания.

        Эта штука выполняется каждый раз, когда пользователь нажал "Начать
        лабораторную работу", каждый раз в очередь ставятся новые задания со
        всеми вытекающими.

        TODO: Защитить от флуда
        """
        module = system.get('module')
        state = json.loads(module.state)

        # Стучимся до СУО, получаем статистику выполнения
        result = requests.get(grader_payload.get('attempts_url') % {
            'user_id': student_input.get('user_id'),
            'user_email': student_input.get('user_email'),
            'user_login': student_input.get('user_login'),
            'course_id': grader_payload.get('ant_course_id'),
            'unit_id': grader_payload.get('ant_unit_id'),
            'user_email_login': get_email_login(student_input.get('user_email')),
        })

        # Получаем последнюю попытку, если таковая имело место
        attempts_data = json.loads(result.text)
        latest_attempt = attempts_data['attempts'][-1] if len(attempts_data['attempts']) > 0 else None

        # Если последняя попытка была, и она ещё не закончена (учитывая, что
        # лимит на лабораторную положителен)
        if latest_attempt is not None and latest_attempt.get('end') is None and grader_payload.get('ant_time_limit', 0) > 0:

            # Установим статус модуля в "Выполнение"
            state['ant_result'] = result.text
            state['attempts'] = len(attempts_data['attempts'])
            state['ant_status'] = 'RUNNING'

            # Поставим в очередь задачу по проверке баллов
            new_task = reserve_task(None, save=True,
                                    grader_payload=grader_payload,
                                    system_payload=system_payload,
                                    student_input=student_input,
                                    task_type='ANT_CHECK_DELAYED')
            submit_ant_check(new_task)

        # В противном случае сбросим статус, чтобы не пугать пользователя
        # "подвисшей лабой"
        else:
            state['ant_status'] = 'IDLE'

        # Сохраняем всё, что наменяли
        module.state = json.dumps(state)
        module.save()
Beispiel #2
0
    def grade_success(self, student_input, grader_payload, system_payload, system, response):
        """
        Проводит валидацию состояния выполнения лабораторной работы,
        предоставляемою СУО. В том случае, если работа всё-таки началась, в
        очередь будет поставлена проверка задания.

        Эта штука выполняется каждый раз, когда пользователь нажал "Начать
        лабораторную работу", каждый раз в очередь ставятся новые задания со
        всеми вытекающими.

        TODO: Защитить от флуда
        """
        module = system.get('module')
        state = json.loads(module.state)

        # Стучимся до СУО, получаем статистику выполнения
        result = requests.get(grader_payload.get('attempts_url') % {
            'user_id': student_input.get('user_id'),
            'user_email': student_input.get('user_email'),
            'user_login': student_input.get('user_login'),
            'course_id': grader_payload.get('ant_course_id'),
            'unit_id': grader_payload.get('ant_unit_id'),
            'user_email_login': get_email_login(student_input.get('user_email')),
        })

        # Получаем последнюю попытку, если таковая имело место
        attempts_data = json.loads(result.text)
        latest_attempt = attempts_data['attempts'][-1] if len(attempts_data['attempts']) > 0 else None

        # Если последняя попытка была, и она ещё не закончена (учитывая, что
        # лимит на лабораторную положителен)
        if latest_attempt is not None and latest_attempt.get('end') is None and grader_payload.get('ant_time_limit', 0) > 0:

            # Установим статус модуля в "Выполнение"
            state['ant_result'] = result.text
            state['attempts'] = len(attempts_data['attempts'])
            state['ant_status'] = 'RUNNING'

            # Поставим в очередь задачу по проверке баллов
            new_task = reserve_task(None, save=True,
                                    grader_payload=grader_payload,
                                    system_payload=system_payload,
                                    student_input=student_input,
                                    task_type='ANT_CHECK_DELAYED')
            submit_ant_check(new_task)

        # В противном случае сбросим статус, чтобы не пугать пользователя
        # "подвисшей лабой"
        else:
            state['ant_status'] = 'IDLE'

        # Сохраняем всё, что наменяли
        module.state = json.dumps(state)
        module.save()
Beispiel #3
0
    def grade_success(self, student_input, grader_payload, system_payload, system, response):

        module = system.get('module')
        state = json.loads(module.state)

        # Приведём оценку за лабораторную к взвешенному значению и сохраним всё
        module.max_grade = float(100)
        module.grade = 0

        # Получаем последнюю попытку, если таковая была
        latest_attempt = response['attempts'][-1] if len(response['attempts']) > 0 else None

        # Если последняя попытка была (то есть как минимум одна попытка
        # сдачи)...
        if latest_attempt is not None:

            # ... запишем баллы, историю, количество попыток вцелом
            module.grade = max(map(lambda x: x.get('result', 0) or 0, response['attempts']))
            if module.grade is not None:
                state['score'] = module.grade / module.max_grade * system_payload.get('max_score', 1)

            state['ant_result'] = json.dumps(response)
            state['attempts'] = len(response['attempts'])

            # Если времени окончания нет, то лабораторная ещё идёт
            state['ant_status'] = 'RUNNING' if latest_attempt.get('end') is None else 'IDLE'

            module.state = json.dumps(state)

        # ... в противном случае просто обнулим результат
        else:
            module.grade = 0

        module.save()

        # Если оказалось, что лабораторная всё ещё идёт, то просто создадим
        # плановую проверку. Через интервал равный веремени, отведённому на
        # лабораторную, вытянем баллы из СУО ещё раз, со всеми теми же
        # параметрами.
        # Дополнительно проверим таймаут для проверки, чтобы не ставить
        # проверку моментально.
        if state.get('ant_status') == 'RUNNING' and grader_payload.get('ant_time_limit', 0) > 0:
            new_task = reserve_task(None, save=True,
                                    grader_payload=grader_payload,
                                    system_payload=system_payload,
                                    student_input=student_input,
                                    task_type='ANT_CHECK')
            submit_ant_check(new_task)
Beispiel #4
0
    def grade_success(self, student_input, grader_payload, system_payload, system, response):

        module = system.get('module')
        state = json.loads(module.state)

        # Приведём оценку за лабораторную к взвешенному значению и сохраним всё
        module.max_grade = float(100)
        module.grade = 0

        # Получаем последнюю попытку, если таковая была
        latest_attempt = response['attempts'][-1] if len(response['attempts']) > 0 else None

        # Если последняя попытка была (то есть как минимум одна попытка
        # сдачи)...
        if latest_attempt is not None:

            # ... запишем баллы, историю, количество попыток вцелом
            module.grade = max(map(lambda x: x.get('result', 0), response['attempts']))
            if module.grade is not None:
                state['score'] = module.grade / module.max_grade * system_payload.get('max_score', 1)

            state['ant_result'] = json.dumps(response)
            state['attempts'] = len(response['attempts'])

            # Если времени окончания нет, то лабораторная ещё идёт
            state['ant_status'] = 'RUNNING' if latest_attempt.get('end') is None else 'IDLE'

            module.state = json.dumps(state)

        # ... в противном случае просто обнулим результат
        else:
            module.grade = 0

        module.save()

        # Если оказалось, что лабораторная всё ещё идёт, то просто создадим
        # плановую проверку. Через интервал равный веремени, отведённому на
        # лабораторную, вытянем баллы из СУО ещё раз, со всеми теми же
        # параметрами.
        # Дополнительно проверим таймаут для проверки, чтобы не ставить
        # проверку моментально.
        if state.get('ant_status') == 'RUNNING' and grader_payload.get('ant_time_limit', 0) > 0:
            new_task = reserve_task(None, save=True,
                                    grader_payload=grader_payload,
                                    system_payload=system_payload,
                                    student_input=student_input,
                                    task_type='ANT_CHECK')
            submit_ant_check(new_task)