diff --git a/webapp/src/Controller/Team/LanguageController.php b/webapp/src/Controller/Team/LanguageController.php index a03bc4e8fe..4fa3b71f93 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,37 @@ public function __construct( parent::__construct($em, $eventLogService, $dj, $kernel); } + /** + * @param Language[] $languages + * @return Language[] + */ + private function addLanguage(array $languages, Language $language, ContestProblem $problem, bool $inverted = false): array + { + $langId = $language->getName(); + if (!isset($languages[$langId])) { + $languages[$langId] = ['problems' => [], 'limitedProblems' => [], 'language' => $language]; + } + if ($inverted) { + $languages[$langId]['limitedProblems'][] = $problem; + } else { + $languages[$langId]['problems'][] = $problem; + } + return $languages; + } + + /** + * @param Language[] $languages + * @return Language[] + */ + private function removeLanguage(array $languages, Language $language): array + { + $langId = $language->getLangid(); + if (isset($languages[$langId])) { + unset($languages[$langId]); + } + return $languages; + } + #[Route(path: '', name: 'team_languages')] public function languagesAction(): Response { @@ -40,9 +72,35 @@ 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; + $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/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..76dc645ee2 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 limitedProblems = langarray['limitedProblems'] %}
@@ -18,7 +21,26 @@ {% for ext in lang.extensions %} .{{ ext }}{% if not loop.last %}, {% endif %} {% endfor %} + + {% 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 %} + + {% endif %}
{% if lang.compilerVersion and lang.compilerVersionCommand %}
$ {{ lang.compilerVersionCommand }}