Exemplo n.º 1
0
    def do_POST(self):
        form = cgi.FieldStorage(fp=self.rfile,
                                headers=self.headers,
                                environ={
                                    'REQUEST_METHOD': 'POST',
                                    'CONTENT_TYPE':
                                    self.headers['Content-Type'],
                                })
        if "data" not in form:
            self.send_error(404)
        else:
            logging.debug("Sioworkersd receiver got: " + form.getvalue('data'))
            env = json.loads(form.getvalue('data'))
            del env['workers_jobs']
            if 'workers_jobs.extra_args' in env:
                del env['workers_jobs.extra_args']
            assert 'workers_jobs.results' in env or 'error' in env

            with transaction.atomic():
                delay_environ(env)

            self.send_response(200, 'OK')
            self.send_header('Content-type', 'text/plain')
            self.end_headers()
            self.wfile.write('OK')
Exemplo n.º 2
0
def push_grade(request, saved_environ_id, signature):
    # TODO: might use some kind of url signing decorator and skip
    # arguments from url
    if not verify_zeus_url_signature(saved_environ_id, signature):
        raise PermissionDenied

    # This message may be useful for debugging in case when decoding fails
    logger.info('BEFORE DECODING BODY')
    body = _json_base64_decode(request.body)
    logger.info(' >>>> ')
    logger.info(body)
    logger.info(' <<<< ')

    # Create a small ``env`` that will be used to resume the job. Actuall
    # results processing is done in oioioi.zeus.handlers.restore_job.
    env = {'saved_environ_id': saved_environ_id}
    if 'compilation_output' in body:
        env['compilation_result'] = 'CE'
        env['reports'] = []
    else:
        env['compilation_result'] = 'OK'
        env['reports'] = list(_get_key(body, 'tests_info'))
    env['compilation_message'] = body.get('compilation_output', '')

    delay_environ(env)
    return HttpResponse('Recorded!')
Exemplo n.º 3
0
 def send_async_jobs(self, env, **kwargs):
     res = self.run_jobs(env['workers_jobs'],
                         **(env.get('workers_jobs.extra_args', dict())))
     env['workers_jobs.results'] = res
     del env["workers_jobs"]
     if 'workers_jobs.extra_args' in env:
         del env['workers_jobs.extra_args']
     with transaction.atomic():
         delay_environ(env)
Exemplo n.º 4
0
 def send_async_jobs(self, env, **kwargs):
     res = self.run_jobs(env['workers_jobs'],
         **(env.get('workers_jobs.extra_args', dict())))
     env['workers_jobs.results'] = res
     del env["workers_jobs"]
     if 'workers_jobs.extra_args' in env:
         del env['workers_jobs.extra_args']
     with transaction.atomic():
         delay_environ(env)
Exemplo n.º 5
0
    def judge(self, submission, extra_args=None, is_rejudge=False):
        environ = create_environ()
        environ['extra_args'] = extra_args or {}
        environ['is_rejudge'] = is_rejudge
        picontroller = submission.problem_instance.controller

        picontroller.fill_evaluation_environ(environ, submission)

        extra_steps = [
            ('update_report_statuses',
             'oioioi.contests.handlers.update_report_statuses'),
            ('update_submission_score',
             'oioioi.contests.handlers.update_submission_score'),
            ('update_user_results',
             'oioioi.contests.handlers.update_user_results'),
        ] + ([
            ('update_problem_statistics',
             'oioioi.contests.handlers.update_problem_statistics'),
        ] if settings.PROBLEM_STATISTICS_AVAILABLE else []) + [
            ('call_submission_judged',
             'oioioi.contests.handlers.call_submission_judged'),
            ('dump_final_env', 'oioioi.evalmgr.handlers.dump_env',
             dict(message='Finished evaluation')),
        ]

        environ.setdefault('error_handlers', [])
        environ['error_handlers'].append(
            ('create_error_report',
             'oioioi.contests.handlers.create_error_report'))

        if settings.MAIL_ADMINS_ON_GRADING_ERROR:
            environ['error_handlers'].append(
                ('mail_admins_on_error',
                 'oioioi.contests.handlers.mail_admins_on_error'))

        environ['error_handlers'].extend(extra_steps)
        environ['error_handlers'].append(
            ('error_handled', 'oioioi.evalmgr.handlers.error_handled'))

        environ['recipe'].extend(extra_steps)

        picontroller.finalize_evaluation_environment(environ)

        environ['recipe'].insert(
            0, ('wait_for_submission_in_db',
                'oioioi.contests.handlers.wait_for_submission_in_db'))

        evalmgr_extra_args = environ.get('evalmgr_extra_args', {})
        logger.debug("Judging submission #%d with environ:\n %s",
                     submission.id, pprint.pformat(environ, indent=4))
        delay_environ(environ, **evalmgr_extra_args)
    def do_POST(self):
        form = cgi.FieldStorage(
            fp=self.rfile,
            headers=self.headers,
            environ={'REQUEST_METHOD': 'POST',
                     'CONTENT_TYPE': self.headers['Content-Type'],
                     })
        if "data" not in form:
            self.send_error(404)
        else:
            logging.debug("Sioworkersd receiver got: " + form.getvalue('data'))
            env = json.loads(form.getvalue('data'))
            del env['workers_jobs']
            if 'workers_jobs.extra_args' in env:
                del env['workers_jobs.extra_args']
            assert 'workers_jobs.results' in env or 'error' in env

            with transaction.atomic():
                delay_environ(env)

            self.send_response(200, 'OK')
            self.send_header('Content-type', 'text/plain')
            self.end_headers()
            self.wfile.write('OK')
Exemplo n.º 7
0
def delay_environ_wrapper(*args, **kwargs):
    with transaction.atomic():
        result = delay_environ(*args, **kwargs)
    return result
Exemplo n.º 8
0
def delay_environ_wrapper(*args, **kwargs):
    with transaction.atomic():
        result = delay_environ(*args, **kwargs)
    return result