diff --git a/app/controllers/course/members.php b/app/controllers/course/members.php index fd650772b8425cbeaafc6d322cb2d38f7dcb080a..1c492d691b7458db2935c66c50f6d0786063a610 100644 --- a/app/controllers/course/members.php +++ b/app/controllers/course/members.php @@ -1119,12 +1119,9 @@ class Course_MembersController extends AuthenticatedController /** * Cancel the subscription of a selected user or group of users - * @param String $cmd - * @param String $status - * @param String $user_id * @throws AccessDeniedException */ - public function cancel_subscription_action($cmd, $status, $user_id = null) + public function cancel_subscription_action(string $cmd, string $status, ?string $user_id = null) { if (!$this->is_tutor) { throw new AccessDeniedException(); @@ -1134,22 +1131,31 @@ class Course_MembersController extends AuthenticatedController if (!Request::submitted('no')) { if (Request::submitted('yes')) { CSRFProtection::verifyUnsafeRequest(); - $users = Request::getArray('users'); + + $user_ids = Request::optionArray('users'); if (!$this->is_dozent) { - $this->validateTutorPermission($users, $this->course_id); + $this->validateTutorPermission($user_ids, $this->course_id); } + + $users = User::findMany($user_ids); + if (!empty($users)) { $removed_users = []; $errors = []; if (in_array($status, words('accepted awaiting claiming'))) { foreach ($users as $user) { - $course->removePreliminaryMember($user); + try { + $course->removePreliminaryMember($user); + $removed_users[] = $user->getFullName(); + } catch (Exception $e) { + $errors[] = $e->getMessage(); + } } } else { foreach ($users as $user) { try { - $course->cancelSubscription($user); + $course->deleteMember($user); $removed_users[] = $user->getFullName(); } catch (Exception $e) { $errors[] = $e->getMessage(); @@ -1164,33 +1170,16 @@ class Course_MembersController extends AuthenticatedController ); } if (count($removed_users) > 5) { - PageLayout::postSuccess( + PageLayout::postSuccess(sprintf( _('%u Personen wurden ausgetragen.'), count($removed_users) - ); + )); } elseif (count($removed_users) > 0) { PageLayout::postSuccess( _('Die folgenden Personen wurden ausgetragen:'), $removed_users ); } - - // deleted authors - if (!empty($msgs)) { - if (count($msgs) <= 5) { - PageLayout::postSuccess(sprintf( - _("%s %s wurde aus der Veranstaltung ausgetragen."), - htmlReady($this->status_groups[$status]), - htmlReady(join(', ', $msgs)) - )); - } else { - PageLayout::postSuccess(sprintf( - _("%u %s wurden aus der Veranstaltung entfernt."), - count($msgs), - htmlReady($this->status_groups[$status]) - )); - } - } } else { PageLayout::postWarning(sprintf( _('Sie haben keine %s zum Austragen ausgewählt'), diff --git a/lib/models/Course.php b/lib/models/Course.php index b51db088506d7e1c5de98722576057eb0acf2361..d736725d17bdd330b0ff674beef8e0242712e43f 100644 --- a/lib/models/Course.php +++ b/lib/models/Course.php @@ -1215,10 +1215,7 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe */ public function deleteMember(User $user, bool $send_mail = false) : void { - $membership = CourseMember::findOneBySQL( - 'seminar_id = :course_id AND user_id = :user_id', - ['course_id' => $this->id, 'user_id' => $user->id] - ); + $membership = CourseMember::find([$this->id, $user->id]); if (!$membership) { //The user is not a member of the course. throw new \Studip\MembershipException( @@ -1262,9 +1259,6 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe ); } - $removed_from_parent = false; - $removed_from_children = false; - if ($this->parent_course) { //This course has a parent course. //Delete the user from the parent course if they are not part of @@ -1276,14 +1270,13 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe AND `seminar_id` <> :this_course_id', [ 'user_id' => $user->id, - 'parent_course_id' => $this->parent_course->id, + 'parent_course_id' => $this->parent->id, 'this_course_id' => $this->id ] ); if ($other_memberships === 0) { //No other memberships. We can delete the user from the parent course. - $this->parent_course->deleteMember($user, false); - $removed_from_parent = true; + $this->parent->deleteMember($user); } } @@ -1294,7 +1287,6 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe foreach ($this->children as $child) { $child->deleteMember($user); } - $removed_from_children = true; } if ($send_mail) { @@ -1344,7 +1336,7 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe AND `seminar_user`.`status` = 'dozent'", ['deleted_user_id' => $user->id] ); - if ($other_deputy_amount === 0 && $GLOBALS['user']->id != $deputy_duty->user_id) { + if ($other_deputy_amount === 0 && $GLOBALS['user']->id !== $deputy_duty->user_id) { Deputy::deleteBySQL( '`range_id` = :course_id AND `user_id` = :deputy_id', ['course_id' => $this->id, $deputy_duty->user_id] @@ -1370,8 +1362,6 @@ class Course extends SimpleORMap implements Range, PrivacyObject, StudipItem, Fe StudipLog::log('SEM_USER_DEL', $this->id, $user->id, 'Wurde aus der Veranstaltung entfernt'); $this->resetRelation('members'); - - //At this point, removal is complete. } /**