Display submission list for hidden-subtasks contest

This commit is contained in:
cuom1999 2023-01-02 22:38:25 -06:00
parent 13f1f03462
commit 69692504aa
2 changed files with 70 additions and 57 deletions

View file

@ -158,26 +158,45 @@ class SubmissionSource(SubmissionDetailBase):
return context return context
def make_batch(batch, cases): def get_hidden_subtasks(request, submission):
result = {"id": batch, "cases": cases} 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: if batch:
result["points"] = sum(map(attrgetter("points"), cases)) result["points"] = sum(map(attrgetter("points"), cases))
result["total"] = sum(map(attrgetter("total"), cases)) result["total"] = sum(map(attrgetter("total"), cases))
result["AC"] = abs(result["points"] - result["total"]) < 1e-5
return result 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 = [] result = []
buf = [] buf = []
last = None last = None
for case in cases: for case in cases:
if case.batch != last and buf: if case.batch != last and buf:
result.append(make_batch(last, buf)) result.append(make_batch(last, buf, include_cases))
buf = [] buf = []
buf.append(case) buf.append(case)
last = case.batch last = case.batch
if buf: if buf:
result.append(make_batch(last, buf)) result.append(make_batch(last, buf, include_cases))
return result return result
@ -226,33 +245,21 @@ class SubmissionStatus(SubmissionDetailBase):
return True return True
return False 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): def get_context_data(self, **kwargs):
context = super(SubmissionStatus, self).get_context_data(**kwargs) context = super(SubmissionStatus, self).get_context_data(**kwargs)
submission = self.object submission = self.object
context["hidden_subtasks"] = get_hidden_subtasks(self.request, self.object)
context["last_msg"] = event.last() 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["time_limit"] = submission.problem.time_limit
context["can_see_testcases"] = False context["can_see_testcases"] = False
context["raw_source"] = submission.source.source.rstrip("\n") context["raw_source"] = submission.source.source.rstrip("\n")
context["highlighted_source"] = highlight_code( context["highlighted_source"] = highlight_code(
submission.source.source, submission.language.pygments, linenos=False submission.source.source, submission.language.pygments, linenos=False
) )
context["hidden_subtasks"] = self.get_hidden_subtasks()
contest = submission.contest_or_none contest = submission.contest_or_none
prefix_length = 0 prefix_length = 0
@ -439,13 +446,25 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView):
hidden_codes += ["IE"] hidden_codes += ["IE"]
return [(key, value) for key, value in all_statuses if key not in hidden_codes] return [(key, value) for key, value in all_statuses if key not in hidden_codes]
def should_show_result_data(self): def in_hidden_subtasks_contest(self):
return not ( return (
self.in_contest self.in_contest
and self.contest.format.has_hidden_subtasks and self.contest.format.has_hidden_subtasks
and not self.request.user.is_superuser 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): def get_context_data(self, **kwargs):
context = super(SubmissionsListBase, self).get_context_data(**kwargs) context = super(SubmissionsListBase, self).get_context_data(**kwargs)
authenticated = self.request.user.is_authenticated authenticated = self.request.user.is_authenticated
@ -467,7 +486,7 @@ class SubmissionsListBase(DiggPaginatorMixin, TitleMixin, ListView):
context["all_statuses"] = self.get_searchable_status_codes() context["all_statuses"] = self.get_searchable_status_codes()
context["selected_statuses"] = self.selected_statuses 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_json"] = mark_safe(json.dumps(self.get_result_data()))
context["results_colors_json"] = mark_safe( context["results_colors_json"] = mark_safe(
json.dumps(settings.DMOJ_STATS_SUBMISSION_RESULT_COLORS) 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["all_submissions_link"] = self.get_all_submissions_page()
context["page_type"] = self.page_type 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 return context
def get(self, request, *args, **kwargs): def get(self, request, *args, **kwargs):

View file

@ -1,22 +1,5 @@
{% set can_view = submission_layout(submission, profile_id, request.user, editable_problem_ids, completed_problem_ids) %} {% 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 %} <div class="sub-result {{ submission._result_class if in_hidden_subtasks_contest else submission.result_class }}">
{% if hidden %}
<div class="sub-result TLE">
<div class="score">
{%- if submission.is_graded -%}
??? / {{ submission.case_total|floatformat(0) }}
{%- else -%}
<i class="fa fa-spinner fa-pulse"></i>
{%- endif -%}
</div>
<div class="state">
<span title="?" class="status">?</span> |
<span class="language">{{ submission.language.short_display_name }}</span>
</div>
</div>
{% else %}
<div class="sub-result {{ submission.result_class }}">
<div class="score"> <div class="score">
{%- if submission.is_graded -%} {%- if submission.is_graded -%}
{%- if submission.status in ('IE', 'CE', 'AB') -%} {%- if submission.status in ('IE', 'CE', 'AB') -%}
@ -28,13 +11,28 @@
<i class="fa fa-spinner fa-pulse"></i> <i class="fa fa-spinner fa-pulse"></i>
{%- endif -%} {%- endif -%}
</div> </div>
<div class="state"> <div class="state">
<span title="{{ submission.long_status }}" class="status">{{ submission.short_status }}</span> | {% if in_hidden_subtasks_contest and submission.is_graded %}
<span class="language">{{ submission.language.short_display_name }}</span> <span>
{% set ns = namespace(is_first=False) %}
{% for batch in submission.batches %}
{% if batch.id %}
{{ '+' if ns.is_first else '' }}
{% set ns.is_first = True %}
<span class={{'green' if batch.AC else 'red'}}>
{{ batch.points|floatformat(0) }}
</span>
{% endif %}
{% endfor %}
</span>
{% else %}
{% if not in_hidden_subtasks_contest or submission.status in ('IE', 'CE', 'AB') %}
<span title="{{ submission.long_status }}" class="status">{{ submission.short_status }}</span> |
{% endif %}
<span class="language">{{ submission.language.short_display_name }}</span>
{% endif %}
</div> </div>
</div> </div>
{% endif %}
<div class="sub-info{% if submission.status == 'G' %} sub-info-grading{% endif %}"> <div class="sub-info{% if submission.status == 'G' %} sub-info-grading{% endif %}">
{% if show_problem %} {% if show_problem %}
<div class="name"><a href="{{ url('problem_detail', submission.problem.code) }}">{{ problem_name }}</a></div> <div class="name"><a href="{{ url('problem_detail', submission.problem.code) }}">{{ problem_name }}</a></div>
@ -51,7 +49,7 @@
</div> </div>
</div> </div>
{% if submission.status == 'G' and not hidden %} {% if submission.status == 'G' and not in_hidden_subtasks_contest %}
<div class="sub-testcase"> <div class="sub-testcase">
{%- if submission.current_testcase > 0 -%} {%- if submission.current_testcase > 0 -%}
{{ _('Point %(point)s / Case #%(case)s', point=submission.points|floatformat(1), case=submission.current_testcase) }} {{ _('Point %(point)s / Case #%(case)s', point=submission.points|floatformat(1), case=submission.current_testcase) }}
@ -79,14 +77,8 @@
</div></div> </div></div>
{% endif %} {% endif %}
{% if hidden %}
<div class="sub-usage"> <div class="sub-usage">
<div class="time">---</div> {% if submission.status in ('QU', 'P', 'G', 'CE', 'IE', 'AB') or in_hidden_subtasks_contest %}
<div class="memory">---</div>
</div>
{% else %}
<div class="sub-usage">
{% if submission.status in ('QU', 'P', 'G', 'CE', 'IE', 'AB') %}
<div class="time">---</div> <div class="time">---</div>
<div class="memory">---</div> <div class="memory">---</div>
{% else %} {% else %}
@ -97,8 +89,6 @@
{% else %} {% else %}
<div class="time">---</div> <div class="time">---</div>
{% endif %} {% endif %}
{# No one actually like IEC prefixes, Jinja2. #}
<div class="memory">{{ (submission.memory_bytes|filesizeformat(True)).replace('i', '') }}</div> <div class="memory">{{ (submission.memory_bytes|filesizeformat(True)).replace('i', '') }}</div>
{% endif %} {% endif %}
</div> </div>
{% endif %}