From 903bff3d2908ed1cc0f089bab14fe5288b70ba0a Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sat, 1 Nov 2025 13:43:32 +0100 Subject: [PATCH 1/6] Display all languages in the contest in teaminterface Also limit the languages in case the problem has different languages. --- .../Controller/Team/LanguageController.php | 22 ++++++++++++++++--- .../Controller/Team/SubmissionController.php | 1 + webapp/templates/team/languages.html.twig | 18 ++++++++++++++- 3 files changed, 37 insertions(+), 4 deletions(-) diff --git a/webapp/src/Controller/Team/LanguageController.php b/webapp/src/Controller/Team/LanguageController.php index a03bc4e8fe..a8a3a1a402 100644 --- a/webapp/src/Controller/Team/LanguageController.php +++ b/webapp/src/Controller/Team/LanguageController.php @@ -40,9 +40,25 @@ public function languagesAction(): Response if (!$languagesEnabled) { throw new BadRequestHttpException("You are not allowed to view this page."); } + $languages = []; $currentContest = $this->dj->getCurrentContest(); - /** @var Language[] $languages */ - $languages = $this->dj->getAllowedLanguagesForContest($currentContest); - return $this->render('team/languages.html.twig', ['languages' => $languages]); + $limited = false; + foreach ($this->dj->getCurrentContest()->getProblems() as $problem) { + foreach ($problem->getProblem()->getLanguages() as $language) { + $langId = $language->getName(); + if (!isset($languages[$langId])) { + $languages[$langId] = ['problems' => [], 'contestlang' => false, 'language' => $language]; + } + $languages[$langId]['problems'][] = $problem; + $limited = true; + } + } + foreach ($this->dj->getAllowedLanguagesForContest($currentContest) as $language) { + if (!isset($languages[$language->getName()])) { + $languages[$language->getName()] = ['problems' => [], 'contestlang' => true, 'language' => $language]; + } + $languages[$language->getName()]['contestlang'] = true; + }; + return $this->render('team/languages.html.twig', ['languages' => $languages, 'limited' => $limited]); } } diff --git a/webapp/src/Controller/Team/SubmissionController.php b/webapp/src/Controller/Team/SubmissionController.php index 9957883054..f8dc4bdac8 100644 --- a/webapp/src/Controller/Team/SubmissionController.php +++ b/webapp/src/Controller/Team/SubmissionController.php @@ -22,6 +22,7 @@ use Symfony\Component\HttpFoundation\File\UploadedFile; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\Exception\BadRequestHttpException; use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; use Symfony\Component\HttpKernel\KernelInterface; use Symfony\Component\Routing\Attribute\Route; diff --git a/webapp/templates/team/languages.html.twig b/webapp/templates/team/languages.html.twig index 57ce0d361f..c5599e8715 100644 --- a/webapp/templates/team/languages.html.twig +++ b/webapp/templates/team/languages.html.twig @@ -7,7 +7,10 @@
- {% for lang in languages %} + {% for langarray in languages %} + {% set lang = langarray['language'] %} + {% set problems = langarray['problems'] %} + {% set contestlang = langarray['contestlang'] %}
@@ -18,6 +21,19 @@ {% for ext in lang.extensions %} .{{ ext }}{% if not loop.last %}, {% endif %} {% endfor %} + + {% if limited %} + + {% if contestlang %} + + All + + {% endif %} + {% for problem in problems %} + {{ problem | problemBadge }} + {% endfor %} + + {% endif %}
{% if lang.compilerVersion and lang.compilerVersionCommand %} From 2ee2712cb9c31b8f6ba5cc7b889ed96e01d7d9fb Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sun, 2 Nov 2025 20:19:18 +0100 Subject: [PATCH 2/6] Implement Nicky his suggestion --- .../Controller/Team/LanguageController.php | 32 ++++++++++++------- webapp/templates/team/languages.html.twig | 6 ---- 2 files changed, 21 insertions(+), 17 deletions(-) diff --git a/webapp/src/Controller/Team/LanguageController.php b/webapp/src/Controller/Team/LanguageController.php index a8a3a1a402..66d819a93d 100644 --- a/webapp/src/Controller/Team/LanguageController.php +++ b/webapp/src/Controller/Team/LanguageController.php @@ -4,6 +4,7 @@ use App\Controller\BaseController; use App\Entity\Language; +use App\Entity\ContestProblem; use App\Service\ConfigurationService; use App\Service\DOMJudgeService; use App\Service\EventLogService; @@ -33,6 +34,20 @@ public function __construct( parent::__construct($em, $eventLogService, $dj, $kernel); } + /** + * @param Language[] $languages + * @return Language[] + */ + private function addLanguage(array $languages, Language $language, ContestProblem $problem): array + { + $langId = $language->getName(); + if (!isset($languages[$langId])) { + $languages[$langId] = ['problems' => [], 'language' => $language]; + } + $languages[$langId]['problems'][] = $problem; + return $languages; + } + #[Route(path: '', name: 'team_languages')] public function languagesAction(): Response { @@ -45,20 +60,15 @@ public function languagesAction(): Response $limited = false; foreach ($this->dj->getCurrentContest()->getProblems() as $problem) { foreach ($problem->getProblem()->getLanguages() as $language) { - $langId = $language->getName(); - if (!isset($languages[$langId])) { - $languages[$langId] = ['problems' => [], 'contestlang' => false, 'language' => $language]; - } - $languages[$langId]['problems'][] = $problem; + $languages = $this->addLanguage($languages, $language, $problem); $limited = true; } - } - foreach ($this->dj->getAllowedLanguagesForContest($currentContest) as $language) { - if (!isset($languages[$language->getName()])) { - $languages[$language->getName()] = ['problems' => [], 'contestlang' => true, 'language' => $language]; + if (count($problem->getProblem()->getLanguages()) == 0) { + foreach ($this->dj->getAllowedLanguagesForContest($currentContest) as $language) { + $languages = $this->addLanguage($languages, $language, $problem); + } } - $languages[$language->getName()]['contestlang'] = true; - }; + } return $this->render('team/languages.html.twig', ['languages' => $languages, 'limited' => $limited]); } } diff --git a/webapp/templates/team/languages.html.twig b/webapp/templates/team/languages.html.twig index c5599e8715..89ef5d21b2 100644 --- a/webapp/templates/team/languages.html.twig +++ b/webapp/templates/team/languages.html.twig @@ -10,7 +10,6 @@ {% for langarray in languages %} {% set lang = langarray['language'] %} {% set problems = langarray['problems'] %} - {% set contestlang = langarray['contestlang'] %}
@@ -24,11 +23,6 @@ {% if limited %} - {% if contestlang %} - - All - - {% endif %} {% for problem in problems %} {{ problem | problemBadge }} {% endfor %} From 2787bb973fc71efe6c4a5637600c6419cf82c1c2 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sun, 2 Nov 2025 20:29:41 +0100 Subject: [PATCH 3/6] Re-order to make it look better --- webapp/templates/team/languages.html.twig | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/webapp/templates/team/languages.html.twig b/webapp/templates/team/languages.html.twig index 89ef5d21b2..042a0f94b5 100644 --- a/webapp/templates/team/languages.html.twig +++ b/webapp/templates/team/languages.html.twig @@ -21,14 +21,14 @@ .{{ ext }}{% if not loop.last %}, {% endif %} {% endfor %} - {% if limited %} - - {% for problem in problems %} - {{ problem | problemBadge }} - {% endfor %} - - {% endif %} + {% if limited %} + + {% for problem in problems %} + {{ problem | problemBadge }} + {% endfor %} + + {% endif %}
{% if lang.compilerVersion and lang.compilerVersionCommand %}
$ {{ lang.compilerVersionCommand }}
From e77eec33aa023db67ac9d7a94337320c86a26124 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sat, 8 Nov 2025 13:38:24 +0100 Subject: [PATCH 4/6] Fix indentation --- webapp/templates/team/languages.html.twig | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/webapp/templates/team/languages.html.twig b/webapp/templates/team/languages.html.twig index 042a0f94b5..96b2de255c 100644 --- a/webapp/templates/team/languages.html.twig +++ b/webapp/templates/team/languages.html.twig @@ -23,11 +23,11 @@ {% if limited %} - - {% for problem in problems %} - {{ problem | problemBadge }} - {% endfor %} - + + {% for problem in problems %} + {{ problem | problemBadge }} + {% endfor %} + {% endif %}
{% if lang.compilerVersion and lang.compilerVersionCommand %} From 0f94434e2b1ef920ff62c5614088bfe077913f58 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sat, 8 Nov 2025 15:39:59 +0100 Subject: [PATCH 5/6] Handle case for the online judge --- .../Controller/Team/LanguageController.php | 34 +++++++++++++++++-- webapp/templates/team/languages.html.twig | 12 +++++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/webapp/src/Controller/Team/LanguageController.php b/webapp/src/Controller/Team/LanguageController.php index 66d819a93d..32d3335aa0 100644 --- a/webapp/src/Controller/Team/LanguageController.php +++ b/webapp/src/Controller/Team/LanguageController.php @@ -38,13 +38,26 @@ public function __construct( * @param Language[] $languages * @return Language[] */ - private function addLanguage(array $languages, Language $language, ContestProblem $problem): array + private function addLanguage(array $languages, Language $language, ContestProblem $problem, bool $inverted = false): array { $langId = $language->getName(); if (!isset($languages[$langId])) { - $languages[$langId] = ['problems' => [], 'language' => $language]; + $languages[$langId] = ['problems' => [], 'limitedProblems' => [], 'language' => $language]; + } + if ($inverted) { + $languages[$langId]['limitedProblems'][] = $problem; + } else { + $languages[$langId]['problems'][] = $problem; + } + return $languages; + } + + private function removeLanguage(array $languages, Language $language): array + { + $langId = $language->getLangid(); + if (isset($languages[$langId])) { + unset($languages[$langId]); } - $languages[$langId]['problems'][] = $problem; return $languages; } @@ -58,16 +71,31 @@ public function languagesAction(): Response $languages = []; $currentContest = $this->dj->getCurrentContest(); $limited = false; + $allLanguages = []; + foreach($this->dj->getAllowedLanguagesForContest($currentContest) as $language) { + $allLanguages[$language->getLangid()] = $language; + } + foreach ($this->dj->getCurrentContest()->getProblems() as $problem) { + foreach ($problem->getProblem()->getLanguages() as $language) { + $allLanguages[$language->getLangid()] = $language; + } + } foreach ($this->dj->getCurrentContest()->getProblems() as $problem) { + $missingLanguages = $allLanguages; foreach ($problem->getProblem()->getLanguages() as $language) { $languages = $this->addLanguage($languages, $language, $problem); + $missingLanguages = $this->removeLanguage($missingLanguages, $language); $limited = true; } if (count($problem->getProblem()->getLanguages()) == 0) { foreach ($this->dj->getAllowedLanguagesForContest($currentContest) as $language) { $languages = $this->addLanguage($languages, $language, $problem); + $missingLanguages = $this->removeLanguage($missingLanguages, $language); } } + foreach ($missingLanguages as $lang) { + $languages = $this->addLanguage($languages, $lang, $problem, true); + } } return $this->render('team/languages.html.twig', ['languages' => $languages, 'limited' => $limited]); } diff --git a/webapp/templates/team/languages.html.twig b/webapp/templates/team/languages.html.twig index 96b2de255c..76dc645ee2 100644 --- a/webapp/templates/team/languages.html.twig +++ b/webapp/templates/team/languages.html.twig @@ -10,6 +10,7 @@ {% for langarray in languages %} {% set lang = langarray['language'] %} {% set problems = langarray['problems'] %} + {% set limitedProblems = langarray['limitedProblems'] %}
@@ -24,6 +25,17 @@ {% if limited %} + {# In case there are many problem we display the problems where the + language is not allowed #} + {% if problems | length > 25 + and (problems | length) > (limitedProblems | length) + %} + {% if limitedProblems | length > 0 %} + {# Can't be in same as the language can be valid for all languages #} + Not for: + {% endif %} + {% set problems = limitedProblems %} + {% endif %} {% for problem in problems %} {{ problem | problemBadge }} {% endfor %} From e91868c89d7947244f97a13dee9f8aae6c2e7bf6 Mon Sep 17 00:00:00 2001 From: Michael Vasseur <14887731+vmcj@users.noreply.github.com> Date: Sun, 9 Nov 2025 00:19:17 +0100 Subject: [PATCH 6/6] Keep PHPStan happy --- webapp/src/Controller/Team/LanguageController.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/webapp/src/Controller/Team/LanguageController.php b/webapp/src/Controller/Team/LanguageController.php index 32d3335aa0..4fa3b71f93 100644 --- a/webapp/src/Controller/Team/LanguageController.php +++ b/webapp/src/Controller/Team/LanguageController.php @@ -52,6 +52,10 @@ private function addLanguage(array $languages, Language $language, ContestProble return $languages; } + /** + * @param Language[] $languages + * @return Language[] + */ private function removeLanguage(array $languages, Language $language): array { $langId = $language->getLangid();