From 69692504aa474cc42f9e8e17cf11e658c17b316c Mon Sep 17 00:00:00 2001 From: cuom1999 Date: Mon, 2 Jan 2023 22:38:25 -0600 Subject: [PATCH] Display submission list for hidden-subtasks contest --- judge/views/submission.py | 71 +++++++++++++++++++++++------------ templates/submission/row.html | 56 ++++++++++++--------------- 2 files changed, 70 insertions(+), 57 deletions(-) diff --git a/judge/views/submission.py b/judge/views/submission.py index e1de0f9..8202dd5 100644 --- a/judge/views/submission.py +++ b/judge/views/submission.py @@ -158,26 +158,45 @@ class SubmissionSource(SubmissionDetailBase): return context -def make_batch(batch, cases): - result = {"id": batch, "cases": cases} +def get_hidden_subtasks(request, submission): + if request.user.is_superuser: + return set() + contest = submission.contest_object + if contest and contest.format.has_hidden_subtasks: + try: + return contest.format.get_hidden_subtasks().get( + str(submission.contest.problem.id), set() + ) + except Exception: + pass + return set() + + +def make_batch(batch, cases, include_cases=True): + result = {"id": batch} + if include_cases: + result["cases"] = cases if batch: result["points"] = sum(map(attrgetter("points"), cases)) result["total"] = sum(map(attrgetter("total"), cases)) + result["AC"] = abs(result["points"] - result["total"]) < 1e-5 + return result -def group_test_cases(cases): +def group_test_cases(submission, hidden_subtasks, include_cases=True): + cases = submission.test_cases.exclude(batch__in=hidden_subtasks) result = [] buf = [] last = None for case in cases: if case.batch != last and buf: - result.append(make_batch(last, buf)) + result.append(make_batch(last, buf, include_cases)) buf = [] buf.append(case) last = case.batch if buf: - result.append(make_batch(last, buf)) + result.append(make_batch(last, buf, include_cases)) return result @@ -226,33 +245,21 @@ class SubmissionStatus(SubmissionDetailBase): return True return False - def get_hidden_subtasks(self): - if self.request.user.is_superuser: - return set() - submission = self.object - contest = submission.contest_object - if contest and contest.format.has_hidden_subtasks: - try: - return contest.format.get_hidden_subtasks().get( - str(submission.contest.problem.id), set() - ) - except Exception: - pass - return set() - def get_context_data(self, **kwargs): context = super(SubmissionStatus, self).get_context_data(**kwargs) submission = self.object + context["hidden_subtasks"] = get_hidden_subtasks(self.request, self.object) context["last_msg"] = event.last() - context["batches"] = group_test_cases(submission.test_cases.all()) + context["batches"] = group_test_cases( + submission, context["hidden_subtasks"], True + ) context["time_limit"] = submission.problem.time_limit context["can_see_testcases"] = False context["raw_source"] = submission.source.source.rstrip("\n") context["highlighted_source"] = highlight_code( submission.source.source, submission.language.pygments, linenos=False ) - context["hidden_subtasks"] = self.get_hidden_subtasks() contest = submission.contest_or_none prefix_length = 0 @@ -439,13 +446,25 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView): hidden_codes += ["IE"] return [(key, value) for key, value in all_statuses if key not in hidden_codes] - def should_show_result_data(self): - return not ( + def in_hidden_subtasks_contest(self): + return ( self.in_contest and self.contest.format.has_hidden_subtasks and not self.request.user.is_superuser ) + def modify_attrs(self, submission): + # Used to modify submission's info in contest with hidden subtasks + batches = group_test_cases( + submission, get_hidden_subtasks(self.request, submission), False + ) + setattr(submission, "case_points", sum([i.get("points", 0) for i in batches])) + setattr(submission, "batches", batches) + if submission.status in ("IE", "CE", "AB"): + setattr(submission, "_result_class", submission.result_class) + else: + setattr(submission, "_result_class", "TLE") + def get_context_data(self, **kwargs): context = super(SubmissionsListBase, self).get_context_data(**kwargs) authenticated = self.request.user.is_authenticated @@ -467,7 +486,7 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView): context["all_statuses"] = self.get_searchable_status_codes() context["selected_statuses"] = self.selected_statuses - if self.should_show_result_data(): + if not self.in_hidden_subtasks_contest(): context["results_json"] = mark_safe(json.dumps(self.get_result_data())) context["results_colors_json"] = mark_safe( json.dumps(settings.DMOJ_STATS_SUBMISSION_RESULT_COLORS) @@ -483,6 +502,10 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView): context["all_submissions_link"] = self.get_all_submissions_page() context["page_type"] = self.page_type + context["in_hidden_subtasks_contest"] = self.in_hidden_subtasks_contest() + if context["in_hidden_subtasks_contest"]: + for submission in context["submissions"]: + self.modify_attrs(submission) return context def get(self, request, *args, **kwargs): diff --git a/templates/submission/row.html b/templates/submission/row.html index e0ad24d..a0f4ade 100644 --- a/templates/submission/row.html +++ b/templates/submission/row.html @@ -1,22 +1,5 @@ {% set can_view = submission_layout(submission, profile_id, request.user, editable_problem_ids, completed_problem_ids) %} -{% set hidden = submission.contest_object and submission.contest_object.format.has_hidden_subtasks and not request.user.is_superuser %} -{% if hidden %} -
-
- {%- if submission.is_graded -%} - ??? / {{ submission.case_total|floatformat(0) }} - {%- else -%} - - {%- endif -%} -
- -
- ? | - {{ submission.language.short_display_name }} -
-
-{% else %} -
+
{%- if submission.is_graded -%} {%- if submission.status in ('IE', 'CE', 'AB') -%} @@ -28,13 +11,28 @@ {%- endif -%}
-
- {{ submission.short_status }} | - {{ submission.language.short_display_name }} + {% if in_hidden_subtasks_contest and submission.is_graded %} + + {% set ns = namespace(is_first=False) %} + {% for batch in submission.batches %} + {% if batch.id %} + {{ '+' if ns.is_first else '' }} + {% set ns.is_first = True %} + + {{ batch.points|floatformat(0) }} + + {% endif %} + {% endfor %} + + {% else %} + {% if not in_hidden_subtasks_contest or submission.status in ('IE', 'CE', 'AB') %} + {{ submission.short_status }} | + {% endif %} + {{ submission.language.short_display_name }} + {% endif %}
-{% endif %}
{% if show_problem %} @@ -51,7 +49,7 @@
-{% if submission.status == 'G' and not hidden %} +{% if submission.status == 'G' and not in_hidden_subtasks_contest %}
{%- if submission.current_testcase > 0 -%} {{ _('Point %(point)s / Case #%(case)s', point=submission.points|floatformat(1), case=submission.current_testcase) }} @@ -79,14 +77,8 @@
{% endif %} -{% if hidden %}
-
---
-
---
-
-{% else %} -
- {% if submission.status in ('QU', 'P', 'G', 'CE', 'IE', 'AB') %} + {% if submission.status in ('QU', 'P', 'G', 'CE', 'IE', 'AB') or in_hidden_subtasks_contest %}
---
---
{% else %} @@ -97,8 +89,6 @@ {% else %}
---
{% endif %} - {# No one actually like IEC prefixes, Jinja2. #}
{{ (submission.memory_bytes|filesizeformat(True)).replace('i', '') }}
{% endif %} -
-{% endif %} \ No newline at end of file + \ No newline at end of file