diff --git a/cms/db/contest.py b/cms/db/contest.py index d76fc8fea0..55d2af6550 100644 --- a/cms/db/contest.py +++ b/cms/db/contest.py @@ -107,6 +107,12 @@ class Contest(Base): nullable=False, default=False) + # Whether to show task scores in the overview page + show_task_scores_in_overview: bool = Column(Boolean, nullable=False, default=True) + + # Whether to show task scores in the sidebar task list. + show_task_scores_in_sidebar: bool = Column(Boolean, nullable=False, default=True) + # Whether to prevent hidden participations to log in. block_hidden_participations: bool = Column( Boolean, diff --git a/cms/server/admin/handlers/contest.py b/cms/server/admin/handlers/contest.py index b9dd7fa4ff..f00032c074 100644 --- a/cms/server/admin/handlers/contest.py +++ b/cms/server/admin/handlers/contest.py @@ -106,6 +106,8 @@ def post(self, contest_id: str): self.get_bool(attrs, "allow_questions") self.get_bool(attrs, "allow_user_tests") self.get_bool(attrs, "allow_unofficial_submission_before_analysis_mode") + self.get_bool(attrs, "show_task_scores_in_overview") + self.get_bool(attrs, "show_task_scores_in_sidebar") self.get_bool(attrs, "block_hidden_participations") self.get_bool(attrs, "allow_password_authentication") self.get_bool(attrs, "allow_registration") diff --git a/cms/server/admin/templates/contest.html b/cms/server/admin/templates/contest.html index a82899da65..c6ffc90e2e 100644 --- a/cms/server/admin/templates/contest.html +++ b/cms/server/admin/templates/contest.html @@ -92,6 +92,21 @@
| {% trans %}Score{% endtrans %} | +{% endif %}{% trans %}Task{% endtrans %} | {% trans %}Name{% endtrans %} | {% trans %}Time limit{% endtrans %} | @@ -209,6 +212,9 @@
|---|---|---|---|
| {{ task_scores[t_iter.id][2] }} | +{% endif %}{{ t_iter.name }} | {{ t_iter.title }} | diff --git a/cms/server/contest/templates/task_submissions.html b/cms/server/contest/templates/task_submissions.html index ea5a08f2b8..913d84fef4 100644 --- a/cms/server/contest/templates/task_submissions.html +++ b/cms/server/contest/templates/task_submissions.html @@ -35,6 +35,10 @@ {% endfor %} }; +// If any existing submission has a played token, sidebar should show tokened +// total score for this task. +var sidebar_use_tokened_score = {% if submissions|selectattr("token")|list|length > 0 %}true{% else %}false{% endif %}; + $(document).on("click", ".submission_list tbody tr td.status .details", function (event) { var submission_id = $(this).parent().parent().attr("data-submission"); var modal = $("#submission_detail"); @@ -117,6 +121,23 @@ task_score_elem.addClass(get_score_class(task_score, max_score)); }; +update_sidebar_task_score = function(task_score, task_score_message, max_score) { + var task_header = $('.nav-list li.nav-header[data-task-name="{{ task.name }}"]'); + if (task_header.length === 0) { + return; + } + + var badge = task_header.find('.task_score_badge'); + if (badge.length === 0) { + return; + } + + badge.removeClass('undefined score_0 score_0_100 score_100'); + badge.addClass(get_score_class(task_score, max_score)); + badge.text(task_score_message); + badge.show(); +}; + update_scores = function (submission_id, data) { var row = $(".submission_list tbody tr[data-submission=\"" + submission_id + "\"]"); row.attr("data-status", data["status"]); @@ -135,6 +156,29 @@ data["public_score"], data["public_score_message"], data["task_public_score"], data["task_public_score_message"], data["task_score_is_partial"], data["max_public_score"]); + + // If we can see full score for at least one submission (token played or + // analysis), switch sidebar to tokened total score. + if (data["score"] !== undefined) { + sidebar_use_tokened_score = true; + } + + if (sidebar_use_tokened_score + && data["task_tokened_score"] !== undefined + && data["task_tokened_score_message"] !== undefined + && data["max_score"] !== undefined) { + update_sidebar_task_score( + data["task_tokened_score"], + data["task_tokened_score_message"], + data["max_score"]); + } else if (data["task_public_score"] !== undefined + && data["task_public_score_message"] !== undefined + && data["max_public_score"] !== undefined) { + update_sidebar_task_score( + data["task_public_score"], + data["task_public_score_message"], + data["max_public_score"]); + } {% if can_use_tokens %} update_score( row.children("td.total_score"), $("#task_score_tokened"), diff --git a/cmscontrib/updaters/update_from_1.5.sql b/cmscontrib/updaters/update_from_1.5.sql index 306f6ebdfe..d851717c74 100644 --- a/cmscontrib/updaters/update_from_1.5.sql +++ b/cmscontrib/updaters/update_from_1.5.sql @@ -42,6 +42,12 @@ ALTER TABLE user_test_results ADD COLUMN evaluation_sandbox_digests VARCHAR[]; UPDATE user_test_results SET evaluation_sandbox_paths = string_to_array(evaluation_sandbox, ':'); ALTER TABLE user_test_results DROP COLUMN evaluation_sandbox; +-- https://github.com/cms-dev/cms/pull/1476 +ALTER TABLE contests ADD COLUMN show_task_scores_in_overview boolean NOT NULL DEFAULT true; +ALTER TABLE contests ADD COLUMN show_task_scores_in_sidebar boolean NOT NULL DEFAULT true; +ALTER TABLE contests ALTER COLUMN show_task_scores_in_overview DROP DEFAULT; +ALTER TABLE contests ALTER COLUMN show_task_scores_in_sidebar DROP DEFAULT; + -- https://github.com/cms-dev/cms/pull/1486 ALTER TABLE public.tasks ADD COLUMN allowed_languages varchar[]; |