def student_submit_solution(data): print(data) user = User(session['user']) try: type = str(data['type']) action = ProcessRequestType(type) skip_docker = not data.get('docker', True) except: Emittor.error('Unsupported action', [ 'Given action is not supported:', ' %s' % data['type'], '', 'Please contact [email protected]', 'if you think this is a mistake.' ]) return if not user.is_admin() and (skip_docker or action in (ProcessRequestType.GENERATE_INPUT, ProcessRequestType.GENERATE_OUTPUT)): Emittor.error('Operation not permitted', [ 'You do not have sufficient privileges to perform action:', ' %s (skip docker: %s)' % (action, skip_docker), '', 'Please contact [email protected]', 'if you want to gain the privileges.' ]) return request = processing.request.ProcessRequest( user=user, lang=data['lang'], problem=data['prob'], course=data['course'], solution=data['src'], type=action, docker=False if (skip_docker and user.is_admin()) else True, ) mongo.save_log(request.get_log_dict()) # ignore problems which are past due if request.problem.time_left < 0: return Emittor.register_events(request) Emittor.queue_status(queue_status()) time.sleep(0.1) queue.append(request) Emittor.queue_push(request) time.sleep(0.1) # put a barrier here so only certain amount fo users can process code at once # while other will see queue list with thread_lock: try: request.process() except ConfigurationException as e: if user.is_admin(): logger.exception('[visible to admin only] invalid yaml config') Emittor.exception(e) except Exception as e: logger.exception('process error:') Emittor.exception(e) finally: mongo.save_result(request.get_result_dict()) request.save_result() request.destroy() queue.remove(request) Emittor.queue_pop(request)
def _process_solution(user, action, skip_docker, problem_id, course_id, lang_id=None, src=None, _id=None): if not user.is_admin() and (skip_docker or action in (ProcessRequestType.GENERATE_INPUT, ProcessRequestType.GENERATE_OUTPUT)): Emittor.error('Operation not permitted', [ 'You do not have sufficient privileges to perform action:', ' %s (skip docker: %s)' % (action, skip_docker), '', 'Please contact [email protected]', 'if you want to gain the privileges.' ]) return request = processing.request.ProcessRequest( user=user, lang=lang_id, problem=problem_id, course=course_id, src=src, type=action, docker=False if (skip_docker and user.is_admin()) else True, ) if Env.use_database: Mongo().save_log(request.get_log_dict()) # ignore problems which are past due if request.problem.time_left < 0: return Emittor.register_events(request) Emittor.queue_status(queue_status()) queue.append(request) Emittor.queue_push(request) # put a barrier here so only certain amount fo users can process code at once # while other will see queue list with thread_lock: try: request.process() except ConfigurationException as e: if user.is_admin(): logger.exception('[visible to admin only] invalid yaml config') Emittor.exception(e) except Exception as e: logger.exception('process error:') Emittor.exception(e) finally: output_dir, attempt = request.save_result() if Env.use_database: # replace document instead of creating new one Mongo().save_result( request.get_result_dict(), _id=_id, output_dir=output_dir, attempt=attempt, ) request.destroy() queue.remove(request) Emittor.queue_pop(request)