From bfe46c615995d20ed026f9d4abb857f69a730d6d Mon Sep 17 00:00:00 2001 From: cuom1999 Date: Sun, 15 Dec 2024 16:20:53 -0600 Subject: [PATCH] Optimize ranked submission page (DMOJ) --- dmoj/urls.py | 4 +- judge/views/ranked_submission.py | 92 ++++++++++++++++++++++++++------ robots.txt | 2 + 3 files changed, 81 insertions(+), 17 deletions(-) diff --git a/dmoj/urls.py b/dmoj/urls.py index 08951b6a..bb56bc5b 100644 --- a/dmoj/urls.py +++ b/dmoj/urls.py @@ -1232,8 +1232,8 @@ def paged_list_view(view, name, **kwargs): url(r"^upload/$", custom_file_upload.file_upload, name="custom_file_upload"), ] + url_static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT) -# if hasattr(settings, "INTERNAL_IPS"): -# urlpatterns.append(url("__debug__/", include("debug_toolbar.urls"))) +if "debug_toolbar.middleware.DebugToolbarMiddleware" in settings.MIDDLEWARE: + urlpatterns.append(url("__debug__/", include("debug_toolbar.urls"))) favicon_paths = [ "apple-touch-icon-180x180.png", diff --git a/judge/views/ranked_submission.py b/judge/views/ranked_submission.py index 97348011..4d73bf4d 100644 --- a/judge/views/ranked_submission.py +++ b/judge/views/ranked_submission.py @@ -1,29 +1,43 @@ from django.urls import reverse -from django.utils.html import format_html +from django.utils.html import escape, format_html +from django.utils.safestring import mark_safe from django.utils.translation import gettext as _ -from judge.models import Submission +from judge.models import Language, Submission from judge.utils.problems import get_result_data from judge.utils.raw_sql import join_sql_subquery from judge.views.submission import ForceContestMixin, ProblemSubmissions -__all__ = ["RankedSubmissions"] +__all__ = ["RankedSubmissions", "ContestRankedSubmission"] class RankedSubmissions(ProblemSubmissions): tab = "best_submissions_list" - page_type = "best_submissions_list" dynamic_update = False def get_queryset(self): + params = [self.problem.id] if self.in_contest: contest_join = "INNER JOIN judge_contestsubmission AS cs ON (sub.id = cs.submission_id)" points = "cs.points" constraint = " AND sub.contest_object_id = %s" + params.append(self.contest.id) else: contest_join = "" points = "sub.points" constraint = "" + + if self.selected_languages: + lang_ids = Language.objects.filter( + key__in=self.selected_languages + ).values_list("id", flat=True) + if lang_ids: + constraint += ( + f' AND sub.language_id IN ({", ".join(["%s"] * len(lang_ids))})' + ) + params.extend(lang_ids) + self.selected_languages = set() + queryset = ( super(RankedSubmissions, self) .get_queryset() @@ -51,11 +65,7 @@ def get_queryset(self): """.format( points=points, contest_join=contest_join, constraint=constraint ), - params=( - [self.problem.id, self.contest.id] * 3 - if self.in_contest - else [self.problem.id] * 3 - ), + params=params * 3, alias="best_subs", join_fields=[("id", "id")], related_model=Submission, @@ -70,11 +80,63 @@ def get_title(self): return _("Best solutions for %s") % self.problem_name def get_content_title(self): - return format_html( - _('Best solutions for {0}'), - self.problem_name, - reverse("problem_detail", args=[self.problem.code]), + return mark_safe( + escape(_("Best solutions for %s")) + % ( + format_html( + '{0}', + self.problem_name, + reverse("problem_detail", args=[self.problem.code]), + ), + ) + ) + + def _get_result_data(self, queryset=None): + if queryset is None: + queryset = super(RankedSubmissions, self).get_queryset() + return get_result_data(queryset.order_by()) + + +class ContestRankedSubmission(ForceContestMixin, RankedSubmissions): + def get_title(self): + if self.problem.is_accessible_by(self.request.user): + return _("Best solutions for %(problem)s in %(contest)s") % { + "problem": self.problem_name, + "contest": self.contest.name, + } + return _("Best solutions for problem %(number)s in %(contest)s") % { + "number": self.get_problem_number(self.problem), + "contest": self.contest.name, + } + + def get_content_title(self): + if self.problem.is_accessible_by(self.request.user): + return mark_safe( + escape(_("Best solutions for %(problem)s in %(contest)s")) + % { + "problem": format_html( + '{0}', + self.problem_name, + reverse("problem_detail", args=[self.problem.code]), + ), + "contest": format_html( + '{0}', + self.contest.name, + reverse("contest_view", args=[self.contest.key]), + ), + } + ) + return mark_safe( + escape(_("Best solutions for problem %(number)s in %(contest)s")) + % { + "number": self.get_problem_number(self.problem), + "contest": format_html( + '{0}', + self.contest.name, + reverse("contest_view", args=[self.contest.key]), + ), + } ) - def _get_result_data(self): - return get_result_data(super(RankedSubmissions, self).get_queryset().order_by()) + def _get_queryset(self): + return super()._get_queryset().filter(contest_object=self.contest) diff --git a/robots.txt b/robots.txt index aca189f5..d2c2383a 100644 --- a/robots.txt +++ b/robots.txt @@ -6,7 +6,9 @@ Disallow: /problem/*/raw Disallow: /problem/*/submit Disallow: /problem/*/resubmit/ Disallow: /problem/*/submissions/ +Disallow: /problem/*/rank/* Disallow: /user/*/submissions/ +Disallow: /user/*/solved/ Disallow: /submission/ Disallow: /submissions/ Disallow: /single_submission