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) })
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})
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)
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 })
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, }, )
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)
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))
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))
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)
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)
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)
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)
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)
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)
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)
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)
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)
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}))
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), }, )
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) })
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)
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)
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)
def can_see_checker_exe(self, request, checker): return can_admin_problem_instance(request, checker.problem_instance)
def can_see_test(self, request, test): return can_admin_problem_instance(request, test.problem_instance)
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)
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)
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)