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()
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()
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)
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)