Beispiel #1
0
 def create_submission(self, request, problem_instance, form_data):
     submission = ProgramSubmission(user=request.user,
             problem_instance=problem_instance)
     file = form_data['file']
     submission.source_file.save(file.name, file)
     submission.save()
     self.judge(submission)
Beispiel #2
0
def generate_user_output_view(request, testreport_id=None,
                              submission_report_id=None):
    """Prepares re-submission for generating user outputs and runs judging.

       If there are no test reports' ids given as argument, then all tests from
       reports with the ``submission_report_id`` would be used for generating
       user outs. In that case ``submission_report_id`` is required.
       Note that it uses only tests without already generated outs.

       Also adjusts already generated outs visibility for users
       on tests originally generated by admin.
    """
    assert testreport_id or submission_report_id, \
            _("Not enough information given")

    # taking test report with given id
    if testreport_id is not None:
        testreport = get_object_or_404(TestReport,
                                       id=testreport_id)

        if submission_report_id is not None:
            # testreport_id is not related to given submission_report_id
            if submission_report_id != testreport.submission_report.id:
                raise SuspiciousOperation
        else:
            submission_report_id = testreport.submission_report.id
        testreports = [testreport]
    # taking all test reports related to submission report
    elif submission_report_id is not None:
        testreports = TestReport.objects \
                .filter(submission_report__id=submission_report_id)

    # check download out permission
    submission_report = get_object_or_404(SubmissionReport,
                                          id=submission_report_id)
    _check_generate_out_permission(request, submission_report)

    # filtering tests for judge
    test_ids = _testreports_to_generate_outs(request, testreports)

    # creating re-submission with appropriate tests
    s_id = submission_report.submission.id
    submission = get_submission_or_error(request, s_id,
                                         submission_class=ProgramSubmission)
    if test_ids:
        # Note that submission comment should not be copied to re-submission!
        # It will be overwritten in handler anyway.
        resubmission = ProgramSubmission(problem_instance=submission.
                                            problem_instance,
                                         user=request.user,
                                         date=request.timestamp,
                                         kind='USER_OUTS',
                                         source_file=submission.source_file)
        resubmission.save()
        resubmission.problem_instance.controller.judge(resubmission,
                extra_args={'tests_subset': test_ids,
                            'submission_report_id': submission_report.id})

    return redirect('submission', contest_id=request.contest.id,
                    submission_id=submission.id)
Beispiel #3
0
    def create_submission(self,
                          request,
                          problem_instance,
                          form_data,
                          judge_after_create=True,
                          **kwargs):
        submission = ProgramSubmission(
            user=form_data.get('user', request.user),
            problem_instance=problem_instance,
            kind=form_data.get(
                'kind',
                problem_instance.controller.get_default_submission_kind(
                    request, problem_instance=problem_instance)),
            date=request.timestamp)

        file = form_data['file']
        if file is None:
            lang_exts = get_allowed_languages_dict(problem_instance)
            extension = lang_exts[form_data['prog_lang']][0]
            file = ContentFile(form_data['code'], '__pasted_code.' + extension)

        submission.source_file.save(file.name, file)
        submission.save()
        if judge_after_create:
            problem_instance.controller.judge(submission)
        return submission
Beispiel #4
0
def generate_user_output_view(request, testreport_id=None,
                              submission_report_id=None):
    """Prepares re-submission for generating user outputs and runs judging.

       If there are no test reports' ids given as argument, then all tests from
       reports with the ``submission_report_id`` would be used for generating
       user outs. In that case ``submission_report_id`` is required.
       Note that it uses only tests without already generated outs.

       Also adjusts already generated outs visibility for users
       on tests originally generated by admin.
    """
    assert testreport_id or submission_report_id, \
            _("Not enough information given")

    # taking test report with given id
    if testreport_id is not None:
        testreport = get_object_or_404(TestReport,
                                       id=testreport_id)

        if submission_report_id is not None:
            # testreport_id is not related to given submission_report_id
            if submission_report_id != testreport.submission_report.id:
                raise SuspiciousOperation
        else:
            submission_report_id = testreport.submission_report.id
        testreports = [testreport]
    # taking all test reports related to submission report
    elif submission_report_id is not None:
        testreports = TestReport.objects \
                .filter(submission_report__id=submission_report_id)

    # check download out permission
    submission_report = get_object_or_404(SubmissionReport,
                                          id=submission_report_id)
    _check_generate_out_permission(request, submission_report)

    # filtering tests for judge
    test_ids = _testreports_to_generate_outs(request, testreports)

    # creating re-submission with appropriate tests
    s_id = submission_report.submission.id
    submission = get_submission_or_error(request, s_id,
                                         submission_class=ProgramSubmission)
    if test_ids:
        # Note that submission comment should not be copied to re-submission!
        # It will be overwritten in handler anyway.
        resubmission = ProgramSubmission(problem_instance=submission.
                                            problem_instance,
                                         user=request.user,
                                         date=request.timestamp,
                                         kind='USER_OUTS',
                                         source_file=submission.source_file)
        resubmission.save()
        resubmission.problem_instance.controller.judge(resubmission,
                extra_args={'tests_subset': test_ids,
                            'submission_report_id': submission_report.id})

    return redirect('submission', contest_id=request.contest.id,
                    submission_id=submission.id)
Beispiel #5
0
 def create_submission(self, request, problem_instance, form_data):
     submission = ProgramSubmission(
             user=form_data.get('user', request.user),
             problem_instance=problem_instance,
             kind=form_data.get('kind', 'NORMAL'))
     file = form_data['file']
     submission.source_file.save(file.name, file)
     submission.save()
     self.judge(submission)
Beispiel #6
0
 def create_submission(self, request, problem_instance, form_data,
                 judge_after_create=True, **kwargs):
     submission = ProgramSubmission(
             user=form_data.get('user', request.user),
             problem_instance=problem_instance,
             kind=form_data.get('kind',
                     self.get_default_submission_kind(request)),
             date=request.timestamp)
     file = form_data['file']
     submission.source_file.save(file.name, file)
     submission.save()
     if judge_after_create:
         self.judge(submission)
     return submission
Beispiel #7
0
    def create_submission(self, request, problem_instance, form_data,
                    judge_after_create=True, **kwargs):
        submission = ProgramSubmission(
                user=form_data.get('user', request.user),
                problem_instance=problem_instance,
                kind=form_data.get('kind',
                    problem_instance.controller.get_default_submission_kind(
                           request, problem_instance=problem_instance)),
                    date=request.timestamp
        )

        file = form_data['file']
        if file is None:
            lang_exts = getattr(settings, 'SUBMITTABLE_EXTENSIONS', {})
            extension = lang_exts[form_data['prog_lang']][0]
            file = ContentFile(form_data['code'], '__pasted_code.' + extension)

        submission.source_file.save(file.name, file)
        submission.save()
        if judge_after_create:
            problem_instance.controller.judge(submission)
        return submission
Beispiel #8
0
def sync_submission(sio1_submission_id):
    """Sync submission (sio1_submission_id) to SIO2."""

    sql = 'SELECT s.task, s.user, s.date, s.data, b.body FROM submits as s,' \
          ' submits_bodies as b WHERE s.id = b.id AND b.id = %s'

    sync_env['sioCursor'].execute(sql, (sio1_submission_id,))

    sio1_problem_id, sio1_user_id, sio1_date, sio1_filename, sio1_source \
        = sync_env['sioCursor'].fetchone()

    problem_id = sync_env['reversed_problems'][str(sio1_problem_id)]
    problem = Problem.objects.get(id=problem_id)
    c = Contest.objects.get(id=sync_env['sio2_contest'])
    r = Round.objects.get(name=sync_env['sio2_round'])

    pi = ProblemInstance.objects.get(problem=problem, contest=c, round=r)

    sio1_user = get_sio1_user(sio1_user_id)
    sio2_user = sync_user(sio1_user)

    submission_file = ContentFile(sio1_source, name=sio1_filename)
    sio1_date = parse_datetime(str(sio1_date)).replace(tzinfo=LocalTimezone())

    submission = ProgramSubmission(user=sio2_user, problem_instance=pi)
    submission.source_file.save(sio1_filename, submission_file)
    submission.date = sio1_date
    submission.save()
    c.controller.judge(submission)

    sql = 'UPDATE submits SET in_sio2 = %s WHERE id = %s'
    sync_env['sioCursor'].execute(sql, (submission.id, sio1_submission_id))

    logger.info("Submission (id: %(id1)s, u: %(login)s, p: %(pshortname)s)"
                " synced to SIO2 (id: %(id2)s).",
                {'id1': sio1_submission_id, 'login': sio1_user['username'],
                 'pshortname': pi.short_name, 'id2': submission.id})
    def create_submission(self,
                          request,
                          problem_instance,
                          form_data,
                          judge_after_create=True,
                          **kwargs):
        submission = ProgramSubmission(
            user=form_data.get('user', request.user),
            problem_instance=problem_instance,
            kind=form_data.get('kind',
                               self.get_default_submission_kind(request)),
            date=request.timestamp)

        file = form_data['file']
        if file is None:
            lang_exts = getattr(settings, 'SUBMITTABLE_EXTENSIONS', {})
            extension = lang_exts[form_data['prog_lang']][0]
            file = ContentFile(form_data['code'], '__pasted_code.' + extension)

        submission.source_file.save(file.name, file)
        submission.save()
        if judge_after_create:
            self.judge(submission)
        return submission