def check_tests(cls, editor_data: dict, taskitem: TaskItem, **kwargs): """ Прогнать код по тестам задачи и вернуть результаты тестирования """ if not taskitem.task.tests: return OperationResponse(status=WARNING, msg='Тесты отсутствуют') if not taskitem.compiler_check: return OperationResponse(status=WARNING, msg='Операция запрещена') sandbox_data: SandboxResponseData = testing( code=editor_data['content'], taskitem=taskitem, ) # Запрос в песочницу прошел успешно if sandbox_data['ok']: # Тесты пройдены if sandbox_data['data']['ok']: return OperationResponse( status=OK, msg='Тесты пройдены', sandbox_data=sandbox_data ) else: return OperationResponse( status=WARNING, msg='Тесты не пройдены', sandbox_data=sandbox_data ) else: # Запрос к песочнице завершился с ошибкой return OperationResponse( status=ERROR, msg=sandbox_data['error']['msg'], sandbox_data=sandbox_data )
def ready_solution(cls, editor_data: dict, taskitem: TaskItem, user: User): if not user.is_active: return OperationResponse( status=WARNING, msg='Требуется авторизация' ) if not editor_data['content']: return OperationResponse( status=WARNING, msg='Решение отсутствует' ) solution = Solution.objects.filter(user=user, taskitem=taskitem).first() # если у задачи одна попытка и она уже использована - решение нельзя изменить if solution and taskitem.one_try and solution.is_locked: return OperationResponse( status=WARNING, msg='Решение более нельзя изменить' ) # если задача с автотестами - прогнать автотесты tests_score = None if taskitem.compiler_check and taskitem.task.tests: sandbox_data: SandboxResponseData = testing( code=editor_data['content'], taskitem=taskitem, ) # Запрос в песочницу прошел успешно if sandbox_data['ok']: # Тесты пройдены tests_score = ( round( sandbox_data['data']['num_ok'] / sandbox_data['data']['num'] * taskitem.max_score, 2 ) ) else: # Запрос к песочнице завершился с ошибкой return OperationResponse( status=ERROR, msg=sandbox_data['error_msg'] ) if solution is None: solution = Solution(user=user, taskitem=taskitem) solution.tests_score = tests_score solution.content = editor_data['content'] solution.last_changes = editor_data['content'] solution.is_locked = taskitem.one_try solution.last_modified = timezone.now() solution.set_is_count() if solution.taskitem.manual_check: solution.manual_status = Solution.MS__READY_TO_CHECK solution.save() return OperationResponse( status=OK, msg='Решение отправлено' )
def create_version(cls, editor_data: dict, taskitem: TaskItem, user: User): if user.is_active: solution, _ = Solution.objects.get_or_create(user=user, taskitem=taskitem) solution.create_version(content=editor_data['content']) solution.save() return OperationResponse( status=OK, msg='Версия сохранена' ) else: return OperationResponse( status=WARNING, msg='Требуется авторизация' )
def save_last_changes(cls, editor_data: dict, taskitem: TaskItem, user: User): if not user.is_active: return OperationResponse( status=WARNING, msg='Требуется авторизация' ) solution, created = Solution.objects.get_or_create( user=user, taskitem=taskitem, defaults={ "last_changes": editor_data['content'] }) if not created: solution.last_changes = editor_data['content'] solution.save() return OperationResponse( status=OK, msg='Изменения сохранены' )
def perform_operation(self, user: User, taskitem: TaskItem): if self.is_valid(): operation = getattr(self.Operations, self.cleaned_data['operation']) return operation(editor_data=self.cleaned_data, taskitem=taskitem, user=user) else: return OperationResponse( status=ERROR, msg='Некорректные данные формы' )
def save_last_changes(cls, editor_data: dict, taskitem: TaskItem, user: User): if not user.is_active: return OperationResponse(status=WARNING, msg='Требуется авторизация') solution, created = Solution.objects.get_or_create( user=user, taskitem=taskitem, defaults={"last_changes": editor_data['content']}) if not created: if solution.is_locked: return OperationResponse(status=WARNING, msg='Решение запрещено изменять') elif solution.manual_status in Solution.MS__BLOCKED_STATUS: return OperationResponse(status=WARNING, msg='Решение запрещено изменять') solution.last_changes = editor_data['content'] solution.save() return OperationResponse(status=OK, msg='Сохранено')