From bf45c573804977665188ad584c445f370ed161ef Mon Sep 17 00:00:00 2001 From: Jan-Hendrik Willms <tleilax+studip@gmail.com> Date: Fri, 18 Oct 2024 08:32:31 +0000 Subject: [PATCH] rework admission priority retrieval, fixes #4717 Closes #4717 Merge request studip/studip!3508 --- app/controllers/course/enrolment.php | 40 +++++++++++++++++++++------- 1 file changed, 30 insertions(+), 10 deletions(-) diff --git a/app/controllers/course/enrolment.php b/app/controllers/course/enrolment.php index 1bd339c3360..e2c0e76b044 100644 --- a/app/controllers/course/enrolment.php +++ b/app/controllers/course/enrolment.php @@ -285,16 +285,7 @@ class Course_EnrolmentController extends AuthenticatedController if ($admission_user_limit && $admission_user_limit <= $limit->getMaxNumber()) { $limit->setCustomMaxNumber($user_id, $admission_user_limit); } - $admission_prio = Request::getArray('admission_prio'); - $max_prio = $admission_prio ? max($admission_prio) : 0; - $admission_prio = array_map(function ($a) use (&$max_prio) { - return $a > 0 ? $a : ++$max_prio; - }, $admission_prio); - if (count(array_unique($admission_prio)) != count(Request::getArray('admission_prio'))) { - PageLayout::postInfo( - _('Sie dürfen jede Priorität nur einmal auswählen. Überprüfen Sie bitte Ihre Auswahl!') - ); - } + $admission_prio = $this->getPrioritiesFromRequest(); $old_prio_count = AdmissionPriority::unsetAllPrioritiesForUser($courseset->getId(), $user_id); if ($order_up = key(Request::getArray('admission_prio_order_up'))) { $prio_to_move = $admission_prio[$order_up]; @@ -344,4 +335,33 @@ class Course_EnrolmentController extends AuthenticatedController } $this->redirect($this->action_url("apply/{$this->course_id}{$anchor}")); } + + /** + * Get the priorities from the request. This will discard all defined + * priorities and set them according to their position. + */ + private function getPrioritiesFromRequest(): array + { + $admission_prio = Request::getArray('admission_prio'); + if (count($admission_prio) === 0) { + return []; + } + + // Ensure all items have a positive priority that is not zero + $max_prio = max($admission_prio); + foreach ($admission_prio as $course_id => $prio) { + if ($prio <= 0) { + $admission_prio[$course_id] = ++$max_prio; + } + } + + // Sort the array by the defined priories + asort($admission_prio); + + // Set the priorities according to their position + return array_combine( + array_keys($admission_prio), + range(1, count($admission_prio)) + ); + } } -- GitLab