Refactor submission detail page

This commit is contained in:
cuom1999 2024-04-27 00:37:34 -05:00
parent 8d0045ec82
commit c8f21aa9a5

View file

@ -33,13 +33,16 @@ from django.views import View
from judge import event_poster as event from judge import event_poster as event
from judge.highlight_code import highlight_code from judge.highlight_code import highlight_code
from judge.models import Contest, ContestParticipation from judge.models import (
from judge.models import Language Contest,
from judge.models import Problem ContestParticipation,
from judge.models import ProblemTestCase Language,
from judge.models import ProblemTranslation Problem,
from judge.models import Profile ProblemTestCase,
from judge.models import Submission ProblemTranslation,
Profile,
Submission,
)
from judge.utils.problems import get_result_data from judge.utils.problems import get_result_data
from judge.utils.problem_data import get_problem_case from judge.utils.problem_data import get_problem_case
from judge.utils.raw_sql import join_sql_subquery, use_straight_join from judge.utils.raw_sql import join_sql_subquery, use_straight_join
@ -79,6 +82,10 @@ class SubmissionMixin(object):
class SubmissionDetailBase(LoginRequiredMixin, TitleMixin, SubmissionMixin, DetailView): class SubmissionDetailBase(LoginRequiredMixin, TitleMixin, SubmissionMixin, DetailView):
queryset = Submission.objects.select_related(
"language", "problem", "user", "contest_object"
).defer("problem__description", "user__about", "contest_object__description")
def get_object(self, queryset=None): def get_object(self, queryset=None):
submission = super(SubmissionDetailBase, self).get_object(queryset) submission = super(SubmissionDetailBase, self).get_object(queryset)
if submission.is_accessible_by(self.request.profile): if submission.is_accessible_by(self.request.profile):
@ -90,7 +97,7 @@ class SubmissionDetailBase(LoginRequiredMixin, TitleMixin, SubmissionMixin, Deta
submission = self.object submission = self.object
return _("Submission of %(problem)s by %(user)s") % { return _("Submission of %(problem)s by %(user)s") % {
"problem": submission.problem.translated_name(self.request.LANGUAGE_CODE), "problem": submission.problem.translated_name(self.request.LANGUAGE_CODE),
"user": submission.user.user.username, "user": submission.user.username,
} }
def get_content_title(self): def get_content_title(self):
@ -105,8 +112,8 @@ class SubmissionDetailBase(LoginRequiredMixin, TitleMixin, SubmissionMixin, Deta
), ),
"user": format_html( "user": format_html(
'<a href="{0}">{1}</a>', '<a href="{0}">{1}</a>',
reverse("user_page", args=[submission.user.user.username]), reverse("user_page", args=[submission.user.username]),
submission.user.user.username, submission.user.username,
), ),
} }
) )
@ -187,15 +194,28 @@ def get_cases_data(submission):
class SubmissionStatus(SubmissionDetailBase): class SubmissionStatus(SubmissionDetailBase):
template_name = "submission/status.html" template_name = "submission/status.html"
def access_testcases_in_contest(self): def can_see_testcases(self):
contest = self.object.contest_or_none contest_submission = self.object.contest_or_none
if contest is None: if contest_submission is None:
return False
if contest.problem.problem.is_editable_by(self.request.user):
return True return True
if contest.problem.contest.is_in_contest(self.request.user):
contest_problem = contest_submission.problem
problem = self.object.problem
contest = self.object.contest_object
if contest_problem.show_testcases:
return True
if problem.is_editable_by(self.request.user):
return True
if contest.is_editable_by(self.request.user):
return True
if not problem.is_public:
return False return False
if contest.participation.ended: if contest.is_in_contest(self.request.user):
return False
if not contest.ended:
return False
if contest_submission.participation.ended:
return True return True
return False return False
@ -217,14 +237,7 @@ class SubmissionStatus(SubmissionDetailBase):
title=submission.language, title=submission.language,
) )
contest = submission.contest_or_none if self.can_see_testcases():
show_testcases = False
can_see_testcases = self.access_testcases_in_contest()
if contest is not None:
show_testcases = contest.problem.show_testcases or False
if contest is None or show_testcases or can_see_testcases:
context["cases_data"] = get_cases_data(submission) context["cases_data"] = get_cases_data(submission)
context["can_see_testcases"] = True context["can_see_testcases"] = True
try: try: