Пример #1
0
    def render_submission_footer(self, request, submission):
        super_footer = super(ProgrammingContestController, self). \
                render_submission_footer(request, submission)
        queryset = Submission.objects \
                .filter(problem_instance__contest=request.contest) \
                .filter(user=submission.user) \
                .filter(problem_instance=submission.problem_instance) \
                .exclude(pk=submission.pk) \
                .order_by('-date') \
                .select_related()
        if not is_contest_admin(request):
            cc = request.contest.controller
            queryset = cc.filter_my_visible_submissions(request, queryset)
        show_scores = bool(queryset.filter(score__isnull=False))

        can_admin = \
            can_admin_problem_instance(request, submission.problem_instance)

        if not queryset.exists():
            return super_footer
        return super_footer + render_to_string(
            'programs/other_submissions.html',
            request=request,
            context={
                'submissions':
                [submission_template_context(request, s) for s in queryset],
                'show_scores':
                show_scores,
                'can_admin':
                can_admin,
                'main_submission_id':
                submission.id,
                'submissions_on_page':
                getattr(settings, 'SUBMISSIONS_ON_PAGE', 15)
            })
Пример #2
0
def submission_view(request, submission_id):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    controller = pi.controller
    can_admin = can_admin_problem_instance(request, pi)

    header = controller.render_submission(request, submission)
    footer = controller.render_submission_footer(request, submission)
    reports = []
    queryset = SubmissionReport.objects.filter(submission=submission). \
        prefetch_related('scorereport_set')
    for report in controller.filter_visible_reports(request, submission,
            queryset.filter(status='ACTIVE')):
        reports.append(controller.render_report(request, report))

    if can_admin:
        all_reports = \
            controller.filter_visible_reports(request, submission, queryset)
    else:
        all_reports = []

    return TemplateResponse(request, 'contests/submission.html',
                {'submission': submission, 'header': header, 'footer': footer,
                 'reports': reports, 'all_reports': all_reports,
                 'can_admin': can_admin})
Пример #3
0
def download_checker_exe_view(request, checker_id):
    checker = get_object_or_404(OutputChecker, id=checker_id)
    if not can_admin_problem_instance(request, checker.problem):
        raise PermissionDenied
    if not checker.exe_file:
        raise Http404
    return stream_file(checker.exe_file)
Пример #4
0
    def render_submission(self, request, submission):
        problem_instance = submission.problem_instance
        if submission.kind == 'USER_OUTS':
            # The comment includes safe string, because it is generated
            # automatically (users can not affect it).
            # Note that we temporarily assign a safestring object, because
            # field type in model is originally a string.
            submission.programsubmission.comment = \
                mark_safe(submission.programsubmission.comment)
        can_admin = \
            can_admin_problem_instance(request, submission.problem_instance)

        return render_to_string(
            'programs/submission_header.html',
            request=request,
            context={
                'submission':
                submission_template_context(request,
                                            submission.programsubmission),
                'saved_diff_id':
                request.session.get('saved_diff_id'),
                'supported_extra_args':
                problem_instance.controller.get_supported_extra_args(
                    submission),
                'can_admin':
                can_admin
            })
Пример #5
0
def submission_view(request, submission_id):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    controller = pi.controller
    can_admin = can_admin_problem_instance(request, pi)

    header = controller.render_submission(request, submission)
    footer = controller.render_submission_footer(request, submission)
    reports = []
    queryset = SubmissionReport.objects.filter(submission=submission).prefetch_related(
        'scorereport_set'
    )
    for report in controller.filter_visible_reports(
        request, submission, queryset.filter(status='ACTIVE')
    ):
        reports.append(controller.render_report(request, report))

    if can_admin:
        all_reports = controller.filter_visible_reports(request, submission, queryset)
    else:
        all_reports = []

    return TemplateResponse(
        request,
        'contests/submission.html',
        {
            'submission': submission,
            'header': header,
            'footer': footer,
            'reports': reports,
            'all_reports': all_reports,
            'can_admin': can_admin,
        },
    )
Пример #6
0
def rejudge_submission_view(request, submission_id):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    if not can_admin_problem_instance(request, pi):
        raise PermissionDenied

    pi.controller.judge(submission, request.GET.dict(), is_rejudge=True)
    messages.info(request, _("Rejudge request received."))
    return redirect('submission', submission_id=submission_id)
Пример #7
0
def report_view(request, submission_id, report_id):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    if not can_admin_problem_instance(request, pi):
        raise PermissionDenied

    queryset = SubmissionReport.objects.filter(submission=submission)
    report = get_object_or_404(queryset, id=report_id)
    return HttpResponse(pi.controller.render_report(request, report))
Пример #8
0
def report_view(request, submission_id, report_id):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    if not can_admin_problem_instance(request, pi):
        raise PermissionDenied

    queryset = SubmissionReport.objects.filter(submission=submission)
    report = get_object_or_404(queryset, id=report_id)
    return HttpResponse(pi.controller.render_report(request, report))
Пример #9
0
def model_solutions_view(request, problem_instance_id):
    problem_instance = \
        get_object_or_404(ProblemInstance, id=problem_instance_id)
    if not can_admin_problem_instance(request, problem_instance):
        raise PermissionDenied
    context = generate_model_solutions_context(request, problem_instance)

    return TemplateResponse(request, 'programs/admin/model_solutions.html',
                            context)
Пример #10
0
def rejudge_submission_view(request, submission_id):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    if not can_admin_problem_instance(request, pi):
        raise PermissionDenied

    pi.controller.judge(submission, request.GET.dict(), is_rejudge=True)
    messages.info(request, _("Rejudge request received."))
    return redirect('submission', submission_id=submission_id)
Пример #11
0
def picture_view(request, mode, picture_id):
    modes = {
        'a': QuizAnswerPicture,
        'q': QuizQuestionPicture,
    }
    if mode not in modes:
        return HttpResponseNotFound()
    picture = get_object_or_404(modes[mode], id=picture_id)
    if not any([pi.controller.can_submit(request, pi) or can_admin_problem_instance(request, pi) \
        for pi in picture.quiz.probleminstance_set.filter(contest=request.contest)]):
        raise PermissionDenied
    return stream_file(picture.file)
Пример #12
0
 def render_submission(self, request, submission):
     problem_instance = submission.problem_instance
     can_admin = \
         can_admin_problem_instance(request, submission.problem_instance)
     context = {
         'submission':
             submission_template_context(request, submission.quizsubmission),
         'supported_extra_args':
             problem_instance.controller.get_supported_extra_args(submission),
         'can_admin': can_admin
     }
     return render_to_string('quizzes/submission_header.html',
                             request=request,
                             context=context)
Пример #13
0
 def render_submission(self, request, submission):
     problem_instance = submission.problem_instance
     can_admin = \
         can_admin_problem_instance(request, submission.problem_instance)
     context = {
         'submission':
             submission_template_context(request, submission.quizsubmission),
         'supported_extra_args':
             problem_instance.controller.get_supported_extra_args(submission),
         'can_admin': can_admin
     }
     return render_to_string('quizzes/submission_header.html',
                             request=request,
                             context=context)
Пример #14
0
def change_submission_kind_view(request, submission_id, kind):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    if not can_admin_problem_instance(request, pi):
        raise PermissionDenied

    controller = pi.controller
    if kind in controller.valid_kinds_for_submission(submission):
        controller.change_submission_kind(submission, kind)
        messages.success(request, _("Submission kind has been changed."))
    else:
        messages.error(request,
            _("%(kind)s is not valid kind for submission %(submission_id)d.")
            % {'kind': kind, 'submission_id': submission.id})
    return redirect('submission', submission_id=submission_id)
Пример #15
0
def change_submission_kind_view(request, submission_id, kind):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    if not can_admin_problem_instance(request, pi):
        raise PermissionDenied

    controller = pi.controller
    if kind in controller.valid_kinds_for_submission(submission):
        controller.change_submission_kind(submission, kind)
        messages.success(request, _("Submission kind has been changed."))
    else:
        messages.error(request,
            _("%(kind)s is not valid kind for submission %(submission_id)d.")
            % {'kind': kind, 'submission_id': submission.id})
    return redirect('submission', submission_id=submission_id)
Пример #16
0
def rejudge_submission_view(request, submission_id):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    if not can_admin_problem_instance(request, pi):
        raise PermissionDenied

    extra_args = {}
    supported_extra_args = pi.controller.get_supported_extra_args(submission)
    for flag in request.GET:
        if flag in supported_extra_args:
            extra_args[flag] = True
        else:
            raise SuspiciousOperation

    pi.controller.judge(submission, extra_args, is_rejudge=True)
    messages.info(request, _("Rejudge request received."))
    return redirect('submission', submission_id=submission_id)
Пример #17
0
def rejudge_submission_view(request, submission_id):
    submission = get_submission_or_error(request, submission_id)
    pi = submission.problem_instance
    if not can_admin_problem_instance(request, pi):
        raise PermissionDenied

    extra_args = {}
    supported_extra_args = pi.controller.get_supported_extra_args(submission)
    for flag in request.GET:
        if flag in supported_extra_args:
            extra_args[flag] = True
        else:
            raise SuspiciousOperation

    pi.controller.judge(submission, extra_args, is_rejudge=True)
    messages.info(request, _("Rejudge request received."))
    return redirect('submission', submission_id=submission_id)
Пример #18
0
    def render_submission(self, request, submission):
        problem_instance = submission.problem_instance
        if submission.kind == 'USER_OUTS':
            # The comment includes safe string, because it is generated
            # automatically (users can not affect it).
            # Note that we temporarily assign a safestring object, because
            # field type in model is originally a string.
            submission.programsubmission.comment = \
                mark_safe(submission.programsubmission.comment)
        can_admin = \
            can_admin_problem_instance(request, submission.problem_instance)

        return render_to_string('programs/submission_header.html',
                context_instance=RequestContext(request,
                    {'submission': submission_template_context(request,
                        submission.programsubmission),
                    'saved_diff_id': request.session.get('saved_diff_id'),
                    'supported_extra_args':
                        problem_instance.controller.get_supported_extra_args(
                            submission),
                    'can_admin': can_admin}))
Пример #19
0
    def render_submission_footer(self, request, submission):
        super_footer = super(ProgrammingProblemController,
                             self).render_submission_footer(
                                 request, submission)
        queryset = (Submission.objects.filter(
            problem_instance__contest=request.contest).filter(
                user=submission.user).filter(
                    problem_instance=submission.problem_instance).exclude(
                        pk=submission.pk).order_by('-date').select_related())
        if not submission.problem_instance.contest == request.contest:
            raise SuspiciousOperation
        if not is_contest_basicadmin(request) and request.contest:
            cc = request.contest.controller
            queryset = cc.filter_my_visible_submissions(request, queryset)
        elif not request.contest and not is_contest_basicadmin(request):
            pc = submission.problem_instance.controller
            queryset = pc.filter_my_visible_submissions(request, queryset)
        show_scores = bool(queryset.filter(score__isnull=False))

        can_admin = can_admin_problem_instance(request,
                                               submission.problem_instance)

        if not queryset.exists():
            return super_footer
        return super_footer + render_to_string(
            'programs/other_submissions.html',
            request=request,
            context={
                'submissions':
                [submission_template_context(request, s) for s in queryset],
                'show_scores':
                show_scores,
                'can_admin':
                can_admin,
                'main_submission_id':
                submission.id,
                'submissions_on_page':
                getattr(settings, 'SUBMISSIONS_ON_PAGE', 15),
            },
        )
Пример #20
0
    def render_submission_footer(self, request, submission):
        super_footer = super(QuizProblemController, self). \
                render_submission_footer(request, submission)
        queryset = Submission.objects \
                .filter(problem_instance__contest=request.contest) \
                .filter(user=submission.user) \
                .filter(problem_instance=submission.problem_instance) \
                .exclude(pk=submission.pk) \
                .order_by('-date') \
                .select_related()
        if not submission.problem_instance.contest == request.contest:
            raise SuspiciousOperation
        if not is_contest_basicadmin(request) and request.contest:
            cc = request.contest.controller
            queryset = cc.filter_my_visible_submissions(request, queryset)
        elif not request.contest and not is_contest_basicadmin(request):
            queryset = queryset.filter(user=request.user, date__lte=request.timestamp) \
             .exclude(kind='IGNORED_HIDDEN')
        show_scores = bool(queryset.filter(score__isnull=False))

        can_admin = \
            can_admin_problem_instance(request, submission.problem_instance)

        if not queryset.exists():
            return super_footer
        return super_footer + render_to_string(
            'quizzes/other_submissions.html',
            request=request,
            context={
                'submissions':
                [submission_template_context(request, s) for s in queryset],
                'show_scores':
                show_scores,
                'can_admin':
                can_admin,
                'main_submission_id':
                submission.id,
                'submissions_on_page':
                getattr(settings, 'SUBMISSIONS_ON_PAGE', 15)
            })
Пример #21
0
def model_solutions_view(request, problem_instance_id):
    problem_instance = \
        get_object_or_404(ProblemInstance, id=problem_instance_id)
    if not can_admin_problem_instance(request, problem_instance):
        raise PermissionDenied

    filter_kwargs = {
        'test__isnull':
        False,
        'submission_report__submission__problem_instance':
        problem_instance,
        'submission_report__submission__programsubmission'
        '__modelprogramsubmission__isnull':
        False,
        'submission_report__status':
        'ACTIVE',
    }
    test_reports = TestReport.objects.filter(**filter_kwargs) \
            .select_related()
    filter_kwargs = {
        'submission_report__submission__problem_instance':
        problem_instance,
        'submission_report__submission__programsubmission'
        '__modelprogramsubmission__isnull':
        False,
        'submission_report__status':
        'ACTIVE',
    }
    group_reports = GroupReport.objects.filter(**filter_kwargs) \
            .select_related()
    submissions = ModelProgramSubmission.objects \
            .filter(problem_instance=problem_instance) \
            .order_by('model_solution__order_key') \
            .select_related('model_solution') \
            .all()
    tests = problem_instance.test_set \
            .order_by('order', 'group', 'name').all()

    group_results = defaultdict(lambda: defaultdict(lambda: None))
    for gr in group_reports:
        group_results[gr.group][gr.submission_report.submission_id] = gr

    test_results = defaultdict(lambda: defaultdict(lambda: None))
    for tr in test_reports:
        test_results[tr.test_id][tr.submission_report.submission_id] = tr

    submissions_percentage_statuses = {s.id: '25' for s in submissions}
    rows = []
    submissions_row = []
    for t in tests:
        row_test_results = test_results[t.id]
        row_group_results = group_results[t.group]
        percentage_statuses = {s.id: '100' for s in submissions}
        for s in submissions:
            if row_test_results[s.id] is not None:
                time_ratio = float(row_test_results[s.id].time_used) / \
                        row_test_results[s.id].test_time_limit
                if time_ratio <= 0.25:
                    percentage_statuses[s.id] = '25'
                elif time_ratio <= 0.50:
                    percentage_statuses[s.id] = '50'
                    if submissions_percentage_statuses[s.id] is not '100':
                        submissions_percentage_statuses[s.id] = '50'
                else:
                    percentage_statuses[s.id] = '100'
                    submissions_percentage_statuses[s.id] = '100'

        rows.append({
            'test':
            t,
            'results': [{
                'test_report':
                row_test_results[s.id],
                'group_report':
                row_group_results[s.id],
                'is_partial_score':
                s.problem_instance.controller._is_partial_score(
                    row_test_results[s.id]),
                'percentage_status':
                percentage_statuses[s.id]
            } for s in submissions]
        })

    for s in submissions:
        status = s.status
        if s.status == 'OK' or s.status == 'INI_OK':
            status = 'OK' + submissions_percentage_statuses[s.id]

        submissions_row.append({'submission': s, 'status': status})

    total_row = {
        'test':
        sum(t.time_limit for t in tests),
        'results': [
            sum(t[s.id].time_used if t[s.id] else 0
                for t in test_results.values()) for s in submissions
        ],
    }

    context = {
        'problem_instance': problem_instance,
        'submissions_row': submissions_row,
        'submissions': submissions,
        'rows': rows,
        'total_row': total_row
    }

    return TemplateResponse(request, 'programs/admin/model_solutions.html',
                            context)
Пример #22
0
def model_solutions_view(request, problem_instance_id):
    problem_instance = get_object_or_404(ProblemInstance, id=problem_instance_id)
    if not can_admin_problem_instance(request, problem_instance):
        raise PermissionDenied

    filter_kwargs = {
        "test__isnull": False,
        "submission_report__submission__problem_instance": problem_instance,
        "submission_report__submission__programsubmission" "__modelprogramsubmission__isnull": False,
        "submission_report__status": "ACTIVE",
    }
    test_reports = TestReport.objects.filter(**filter_kwargs).select_related()
    filter_kwargs = {
        "submission_report__submission__problem_instance": problem_instance,
        "submission_report__submission__programsubmission" "__modelprogramsubmission__isnull": False,
        "submission_report__status": "ACTIVE",
    }
    group_reports = GroupReport.objects.filter(**filter_kwargs).select_related()
    submissions = (
        ModelProgramSubmission.objects.filter(problem_instance=problem_instance)
        .order_by("model_solution__order_key")
        .select_related("model_solution")
        .all()
    )
    tests = problem_instance.test_set.order_by("order", "group", "name").all()

    group_results = defaultdict(lambda: defaultdict(lambda: None))
    for gr in group_reports:
        group_results[gr.group][gr.submission_report.submission_id] = gr

    test_results = defaultdict(lambda: defaultdict(lambda: None))
    for tr in test_reports:
        test_results[tr.test_id][tr.submission_report.submission_id] = tr

    submissions_percentage_statuses = {s.id: "25" for s in submissions}
    rows = []
    submissions_row = []
    for t in tests:
        row_test_results = test_results[t.id]
        row_group_results = group_results[t.group]
        percentage_statuses = {s.id: "100" for s in submissions}
        for s in submissions:
            if row_test_results[s.id] is not None:
                time_ratio = float(row_test_results[s.id].time_used) / row_test_results[s.id].test_time_limit
                if time_ratio <= 0.25:
                    percentage_statuses[s.id] = "25"
                elif time_ratio <= 0.50:
                    percentage_statuses[s.id] = "50"
                    if submissions_percentage_statuses[s.id] is not "100":
                        submissions_percentage_statuses[s.id] = "50"
                else:
                    percentage_statuses[s.id] = "100"
                    submissions_percentage_statuses[s.id] = "100"

        rows.append(
            {
                "test": t,
                "results": [
                    {
                        "test_report": row_test_results[s.id],
                        "group_report": row_group_results[s.id],
                        "is_partial_score": s.problem_instance.controller._is_partial_score(row_test_results[s.id]),
                        "percentage_status": percentage_statuses[s.id],
                    }
                    for s in submissions
                ],
            }
        )

    for s in submissions:
        status = s.status
        if s.status == "OK" or s.status == "INI_OK":
            status = "OK" + submissions_percentage_statuses[s.id]

        submissions_row.append({"submission": s, "status": status})

    total_row = {
        "test": sum(t.time_limit for t in tests),
        "results": [sum(t[s.id].time_used if t[s.id] else 0 for t in test_results.values()) for s in submissions],
    }

    context = {
        "problem_instance": problem_instance,
        "submissions_row": submissions_row,
        "submissions": submissions,
        "rows": rows,
        "total_row": total_row,
    }

    return TemplateResponse(request, "programs/admin/model_solutions.html", context)
Пример #23
0
def show_statement_view(request, statement_id):
    statement = get_object_or_404(ProblemStatement, id=statement_id)
    if not can_admin_problem_instance(request, statement.problem):
        raise PermissionDenied
    return stream_file(statement.content)
Пример #24
0
 def can_see_checker_exe(self, request, checker):
     return can_admin_problem_instance(request, checker.problem_instance)
Пример #25
0
 def can_see_test(self, request, test):
     return can_admin_problem_instance(request, test.problem_instance)
Пример #26
0
def show_problem_attachment_view(request, attachment_id):
    attachment = get_object_or_404(ProblemAttachment, id=attachment_id)
    if not can_admin_problem_instance(request, attachment.problem):
        raise PermissionDenied
    return stream_file(attachment.content)
Пример #27
0
def download_output_file_view(request, test_id):
    test = get_object_or_404(Test, id=test_id)
    if not can_admin_problem_instance(request, test.problem):
        raise PermissionDenied
    return stream_file(test.output_file)
Пример #28
0
def model_solutions_view(request, problem_instance_id):
    problem_instance = \
        get_object_or_404(ProblemInstance, id=problem_instance_id)
    if not can_admin_problem_instance(request, problem_instance):
        raise PermissionDenied

    filter_kwargs = {
        'test__isnull': False,
        'submission_report__submission__problem_instance':
            problem_instance,
        'submission_report__submission__programsubmission'
                '__modelprogramsubmission__isnull': False,
        'submission_report__status': 'ACTIVE',
    }
    test_reports = TestReport.objects.filter(**filter_kwargs) \
            .select_related()
    filter_kwargs = {
        'submission_report__submission__problem_instance':
            problem_instance,
        'submission_report__submission__programsubmission'
                '__modelprogramsubmission__isnull': False,
        'submission_report__status': 'ACTIVE',
    }
    group_reports = GroupReport.objects.filter(**filter_kwargs) \
            .select_related()
    submissions = ModelProgramSubmission.objects \
            .filter(problem_instance=problem_instance) \
            .order_by('model_solution__order_key') \
            .select_related('model_solution') \
            .all()
    tests = problem_instance.test_set \
            .order_by('order', 'group', 'name').all()

    group_results = defaultdict(lambda: defaultdict(lambda: None))
    for gr in group_reports:
        group_results[gr.group][gr.submission_report.submission_id] = gr

    test_results = defaultdict(lambda: defaultdict(lambda: None))
    for tr in test_reports:
        test_results[tr.test_id][tr.submission_report.submission_id] = tr

    submissions_percentage_statuses = {s.id: '25' for s in submissions}
    rows = []
    submissions_row = []
    for t in tests:
        row_test_results = test_results[t.id]
        row_group_results = group_results[t.group]
        percentage_statuses = {s.id: '100' for s in submissions}
        for s in submissions:
            if row_test_results[s.id] is not None:
                time_ratio = float(row_test_results[s.id].time_used) / \
                        row_test_results[s.id].test_time_limit
                if time_ratio <= 0.25:
                    percentage_statuses[s.id] = '25'
                elif time_ratio <= 0.50:
                    percentage_statuses[s.id] = '50'
                    if submissions_percentage_statuses[s.id] is not '100':
                        submissions_percentage_statuses[s.id] = '50'
                else:
                    percentage_statuses[s.id] = '100'
                    submissions_percentage_statuses[s.id] = '100'

        rows.append({
            'test': t,
            'results': [{
                    'test_report': row_test_results[s.id],
                    'group_report': row_group_results[s.id],
                    'is_partial_score': s.problem_instance.controller
                        ._is_partial_score(row_test_results[s.id]),
                    'percentage_status': percentage_statuses[s.id]}
                for s in submissions]
        })

    for s in submissions:
        status = s.status
        if s.status == 'OK' or s.status == 'INI_OK':
            status = 'OK' + submissions_percentage_statuses[s.id]

        submissions_row.append({
            'submission': s,
            'status': status
            })

    total_row = {
        'test': sum(t.time_limit for t in tests),
        'results':
            [sum(t[s.id].time_used if t[s.id] else 0
                 for t in test_results.values())
             for s in submissions],
    }

    context = {
            'problem_instance': problem_instance,
            'submissions_row': submissions_row,
            'submissions': submissions,
            'rows': rows,
            'total_row': total_row
    }

    return TemplateResponse(request, 'programs/admin/model_solutions.html',
            context)