From f20f8f193992335531aa2781628155b91e283b7a Mon Sep 17 00:00:00 2001 From: David Siegfried <david.siegfried@uni-vechta.de> Date: Fri, 15 Mar 2024 16:38:46 +0000 Subject: [PATCH] remove MembersModel, closes #3811 Closes #3811 Merge request studip/studip!2677 --- lib/classes/MembersModel.php | 580 ----------------------------------- 1 file changed, 580 deletions(-) delete mode 100644 lib/classes/MembersModel.php diff --git a/lib/classes/MembersModel.php b/lib/classes/MembersModel.php deleted file mode 100644 index d9dc1040e13..00000000000 --- a/lib/classes/MembersModel.php +++ /dev/null @@ -1,580 +0,0 @@ -<?php -/** - * @deprecated since Stud.IP 5.3 - */ -class MembersModel -{ - - protected $course_id; - protected $course_title; - - public function __construct($course_id, $course_title) - { - $this->course_id = $course_id; - $this->course_title = $course_title; - } - - public function setAdmissionVisibility($user_id, $status) - { - $query = "UPDATE admission_seminar_user SET visible = '?' WHERE user_id = ? AND seminar_id = ?"; - $statement = DBManager::get()->prepare($query); - - return $statement->execute([$status, $user_id, $this->course_id]); - } - - public function setVisibilty($user_id, $status) - { - - $query = "UPDATE seminar_user SET visible = ? WHERE user_id = ? AND Seminar_id = ?"; - $statement = DBManager::get()->prepare($query); - - $statement->execute([$status, $user_id, $this->course_id]); - - return $statement->rowCount(); - } - - public function setMemberStatus($members, $status, $next_status, $direction) - { - $msgs = []; - $query = 'UPDATE seminar_user SET status = ?, position = ? WHERE Seminar_id = ? AND user_id = ? AND status = ?'; - $pleasure_statement = DBManager::get()->prepare($query); - - foreach ($members as $user_id) { - $temp_user = User::find($user_id); - if ($next_status == 'tutor' && !$GLOBALS['perm']->have_perm('tutor', $user_id)) { - $msgs['no_tutor'][$user_id] = $temp_user->getFullName(); - } else { - if ($temp_user) { - // get the next position of the user - switch ($next_status) { - case 'user': - // get the current position of the user - $next_pos = $this->getPosition($user_id); - break; - case 'autor': - // get the current position of the user - $next_pos = $this->getPosition($user_id); - break; - // set the status to tutor - case 'tutor': - - // get the next position of the user - $next_pos = get_next_position($next_status, $this->course_id); - // resort the tutors - re_sort_tutoren($this->course_id, $this->getPosition($user_id)); - break; - } - - if (is_null($next_pos)) { - $next_pos = 0; - } - - $pleasure_statement->execute([$next_status, $next_pos, $this->course_id, $user_id, $status]); - - if ($pleasure_statement->rowCount()) { - StudipLog::log('SEM_CHANGED_RIGHTS', $this->course_id, $user_id, $next_status, - $this->getLogLevel($direction, $next_status)); - NotificationCenter::postNotification('CourseMemberStatusDidUpdate', $this->course_id, $user_id); - if ($next_status == 'autor') { - re_sort_tutoren($this->course_id, $next_pos); - } - $msgs['success'][$user_id] = $temp_user->getFullName(); - } - } - } - } - - if (!empty($msgs)) { - return $msgs; - } else { - return false; - } - } - - public function cancelSubscription($users) - { - $sem = Seminar::GetInstance($this->course_id); - $messaging = new messaging; - foreach ($users as $user_id) { - // delete member from seminar - if ($sem->deleteMember($user_id)) { - $user = User::find($user_id); - setTempLanguage($user_id); - $message = sprintf(_('Ihre Anmeldung zur Veranstaltung **%1$s** wurde von Lehrenden (%2$s) oder Admin aufgehoben.'), $this->course_title, get_title_for_status('dozent', 1)); - restoreLanguage(); - $messaging->insert_message($message, $user->username, - '____%system%____', FALSE, FALSE, '1', FALSE, sprintf('%s %s', _('Systemnachricht:'), - _("Anmeldung aufgehoben")), TRUE); - $msgs[] = $user->getFullName(); - } - } - - return $msgs; - } - - public function cancelAdmissionSubscription($users, $status) - { - $messaging = new messaging; - $query = "DELETE FROM admission_seminar_user WHERE seminar_id = ? AND user_id = ? AND status = ?"; - $db = DBManager::get()->prepare($query); - $cs = Seminar::GetInstance($this->course_id)->getCourseSet(); - foreach ($users as $user_id) { - $user = User::find($user_id); - if ($cs) { - $prio_delete = AdmissionPriority::unsetPriority($cs->getId(), $user_id, $this->course_id); - } - $db->execute([$this->course_id, $user_id, $status]); - if ($db->rowCount() > 0 || $prio_delete) { - setTempLanguage($user_id); - if ($status !== 'accepted') { - $message = sprintf(_('Sie wurden von %1$s oder Admin von der Warteliste der Veranstaltung **%2$s** gestrichen und sind damit __nicht__ zugelassen worden.'), get_title_for_status('dozent', 1), $this->course_title); - } else { - $message = sprintf(_('Sie wurden von %1$s oder Admin aus der Veranstaltung **%2$s** gestrichen und sind damit __nicht__ zugelassen worden.'), get_title_for_status('dozent', 1), $this->course_title); - } - restoreLanguage(); - $messaging->insert_message($message, $user->username, - '____%system%____', FALSE, FALSE, '1', FALSE, sprintf('%s %s', _('Systemnachricht:'), - _("nicht zugelassen in Veranstaltung")), TRUE); - StudipLog::log('SEM_USER_DEL', $this->course_id, $user_id, 'Wurde aus der Veranstaltung entfernt'); - NotificationCenter::postNotification('UserDidLeaveCourse', $this->course_id, $user_id); - - $msgs[] = $user->getFullName(); - } - } - return $msgs; - } - - public function insertAdmissionMember($users, $next_status, $consider_contingent, $accepted = null, $cmd = 'add_user') - { - $messaging = new messaging; - foreach ($users as $user_id => $value) { - if ($value) { - $user = User::find($user_id); - if ($user) { - $admission_user = insert_seminar_user($this->course_id, $user_id, $next_status, - ($accepted || $consider_contingent ? TRUE : FALSE), $consider_contingent); - - // only if user was on the waiting list - if ($admission_user) { - setTempLanguage($user_id); - restoreLanguage(); - - if ($cmd == "add_user") { - $message = sprintf(_('Sie wurden von %1$s oder Admin - in die Veranstaltung **%2$s** eingetragen.'), get_title_for_status('dozent', 1), $this->course_title); - } else { - if (!$accepted) { - $message = sprintf(_('Sie wurden von %1$s oder Admin - aus der Warteliste in die Veranstaltung **%2$s** aufgenommen und sind damit zugelassen.'), - get_title_for_status('dozent', 1), $this->course_title); - } else { - $message = sprintf(_('Sie wurden von einem/einer %1$s oder Admin - vom Status **vorläufig akzeptiert** auf **teilnehmend** in der Veranstaltung **%2$s** - hochgestuft und sind damit zugelassen.'), get_title_for_status('dozent', 1), $this->course_title); - } - } - - $messaging->insert_message($message, $user->username, - '____%system%____', FALSE, FALSE, '1', FALSE, sprintf('%s %s', _('Systemnachricht:'), - _('Eintragung in Veranstaltung')), TRUE); - $msgs[] = $user->getFullName(); - } - } - } - } - - // resort admissionlist - renumber_admission($this->course_id); - - return $msgs; - } - - public function addMember($user_id, $accepted = null, $consider_contingent = null, $cmd = 'add_user') - { - global $perm, $SEM_CLASS, $SEM_TYPE; - - $user = User::find($user_id); - $messaging = new messaging; - - $status = 'autor'; - - // insert - $copy_course = ($accepted || $consider_contingent) ? TRUE : FALSE; - $admission_user = insert_seminar_user($this->course_id, $user_id, $status, $copy_course, $consider_contingent, true); - - if ($admission_user) { - setTempLanguage($user_id); - if ($cmd == 'add_user') { - $message = sprintf(_('Sie wurden vom einem/einer %1$s oder Admin - in die Veranstaltung **%2$s** eingetragen.'), get_title_for_status('dozent', 1), $this->course_title); - } else { - if (!$accepted) { - $message = sprintf(_('Sie wurden vom einem/einer %1$s oder Admin - aus der Warteliste in die Veranstaltung **%2$s** aufgenommen und sind damit zugelassen.'), - get_title_for_status('dozent', 1), $this->course_title); - } else { - $message = sprintf(_('Sie wurden von einem/einer %1$s oder Admin vom Status - **vorläufig akzeptiert** auf "**teilnehmend** in der Veranstaltung **%2$s** - hochgestuft und sind damit zugelassen.'), get_title_for_status('dozent', 1), $this->course_title); - } - } - restoreLanguage(); - $messaging->insert_message($message, $user->username, - '____%system%____', FALSE, FALSE, '1', FALSE, sprintf('%s %s', _('Systemnachricht:'), - _('Eintragung in Veranstaltung')), TRUE); - } - - //Warteliste neu sortieren - renumber_admission($this->course_id); - - if ($admission_user) { - if ($cmd == 'add_user') { - $msg = MessageBox::success(sprintf(_('%1$s wurde in die Veranstaltung mit dem Status - <b>%2$s</b> eingetragen.'), $user->getFullName(), $status)); - } else { - if (!$accepted) { - $msg = MessageBox::success(sprintf(_('%1$s wurde aus der Anmelde bzw. Warteliste - mit dem Status <b>%2$s</b> in die Veranstaltung eingetragen.'), $user->getFullName(), $status)); - } else { - $msg = MessageBox::success(sprintf(_('%1$s wurde mit dem Status <b>%2$s</b> - endgültig akzeptiert und damit in die Veranstaltung aufgenommen.'), $user->getFullName(), $status)); - } - } - } else if ($consider_contingent) { - $msg = MessageBox::error(_('Es stehen keine weiteren Plätze mehr im Teilnehmendenkontingent zur Verfügung.')); - } else { - $msg = MessageBox::error(_('Beim Eintragen ist ein Fehler aufgetreten. - Bitte versuchen Sie es erneut oder wenden Sie sich an einen Systemadministrator')); - } - - return $msg; - } - - /** - * Adds the given user to the waitlist of the current course and sends a - * corresponding message. - * - * @param String $user_id The user to add - * @return bool Successful operation? - */ - public function addToWaitlist($user_id) - { - $course = Seminar::getInstance($this->course_id); - // Insert user in waitlist at current position. - if ($course->addToWaitlist($user_id, 'last')) { - setTempLanguage($user_id); - $message = sprintf(_('Sie wurden von einem/einer Veranstaltungsleiter/-in (%1$s) ' . - 'oder einem/einer Administrator/-in auf die Warteliste der Veranstaltung **%2$s** gesetzt.'), - get_title_for_status('dozent', 1), $this->course_title); - restoreLanguage(); - messaging::sendSystemMessage($user_id, sprintf('%s %s', _('Systemnachricht:'), - _('Auf Warteliste gesetzt')), $message); - - return true; - } - return false; - } - - /** - * Adds the given users to the target course. - * @param array $users users to add - * @param string $target_course which course to add users to - * @param bool $move move users (=delete in source course) or just add to target course? - * @return array success and failure statuses - */ - public function sendToCourse($users, $target_course_id, $move = false) - { - $msg = []; - foreach ($users as $user) { - if (!CourseMember::exists([$target_course_id, $user])) { - $target_course = new Seminar($target_course_id); - if ($target_course->addMember($user)) { - if ($move) { - $remove_from = Seminar::getInstance($this->course_id); - $remove_from->deleteMember($user); - } - $msg['success'][] = $user; - } else { - $msg['failed'][] = $user; - } - } else { - $msg['existing'][] = $user; - } - } - return $msg; - } - - /** - * Get user informations by first and last name for csv-import - * @param String $vorname - * @param String $nachname - * @return Array - */ - public function getMemberByIdentification($nachname, $vorname = null) - { - // TODO Fullname - $query = "SELECT a.user_id, username, perms, b.Seminar_id AS is_present - FROM auth_user_md5 AS a - LEFT JOIN user_info USING (user_id) - LEFT JOIN seminar_user AS b ON (b.user_id = a.user_id AND b.Seminar_id = ?) - WHERE perms IN ('autor', 'tutor', 'dozent') - AND a.visible <> 'never' - AND Nachname LIKE ? AND (? IS NULL OR Vorname LIKE ?) - ORDER BY Nachname, Vorname"; - $db = DBManager::get()->prepare($query); - - $db->execute([$this->course_id, $nachname, $vorname, $vorname]); - - return $db->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * Get user informations by username for csv-import - * @param String $username - * @return Array - */ - public function getMemberByUsername($username) - { - // TODO Fullname - $query = "SELECT a.user_id, username, - perms, b.Seminar_id AS is_present - FROM auth_user_md5 AS a - LEFT JOIN user_info USING (user_id) - LEFT JOIN seminar_user AS b ON (b.user_id = a.user_id AND b.Seminar_id = ?) - WHERE perms IN ('autor', 'tutor', 'dozent') - AND a.visible <> 'never' - AND username LIKE ? - ORDER BY Nachname, Vorname"; - $db = DBManager::get()->prepare($query); - $db->execute([$this->course_id, $username]); - - return $db->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * Get user informations by email for csv-import - * @param String $email - * @return Array - */ - public function getMemberByEmail($email) - { - $query = "SELECT a.user_id, username, - perms, b.Seminar_id AS is_present - FROM auth_user_md5 AS a - LEFT JOIN user_info USING (user_id) - LEFT JOIN seminar_user AS b ON (b.user_id = a.user_id AND b.Seminar_id = ?) - WHERE perms IN ('autor', 'tutor', 'dozent') - AND a.visible <> 'never' - AND email LIKE ? - ORDER BY Nachname, Vorname"; - return DBManager::get()->fetchAll($query, [$this->course_id, $email]); - - } - - /** - * Get user informations by generic datafields for csv-import - * @param String $nachname - * @param String $datafield_id - * @return Array - */ - public function getMemberByDatafield($nachname, $datafield_id) - { - // TODO Fullname - $query = "SELECT a.user_id, username, b.Seminar_id AS is_present - FROM datafields_entries AS de - LEFT JOIN auth_user_md5 AS a ON (a.user_id = de.range_id) - LEFT JOIN user_info USING (user_id) - LEFT JOIN seminar_user AS b ON (b.user_id = a.user_id AND b.Seminar_id = ?) - WHERE perms IN ('autor', 'tutor', 'dozent') - AND a.visible <> 'never' - AND de.datafield_id = ? AND de.content = ? - ORDER BY Nachname, Vorname"; - $db = DBManager::get()->prepare($query); - $db->execute([$this->course_id, $datafield_id, $nachname]); - return $db->fetchAll(PDO::FETCH_ASSOC); - } - - /** - * @param string $sort_status - * @param string $order_by - * @param string $exclude_invisibles - * @return SimpleCollection - */ - public function getMembers($sort_status = 'autor', $order_by = 'nachname asc') - { - list($order, $asc) = explode(' ', $order_by); - if ($order === 'nachname') { - $order_by = "Nachname {$asc},Vorname {$asc}"; - } - - $query = "SELECT su.user_id, username, Vorname, Nachname, Email, status, - position, su.mkdate, su.visible, su.comment, - {$GLOBALS['_fullname_sql']['full_rev']} AS fullname - FROM seminar_user AS su - INNER JOIN auth_user_md5 USING (user_id) - INNER JOIN user_info USING (user_id) - WHERE seminar_id = ? - ORDER BY position, Nachname ASC"; - $st = DBManager::get()->prepare($query); - $st->execute([$this->course_id]); - $members = SimpleCollection::createFromArray($st->fetchAll(PDO::FETCH_ASSOC)); - $filtered_members = []; - - foreach (words('user autor tutor dozent') as $status) { - $filtered_members[$status] = $members->findBy('status', $status); - if ($status === $sort_status) { - $filtered_members[$status]->orderBy($order_by, $order !== 'nachname' ? SORT_NUMERIC : SORT_LOCALE_STRING); - } else { - $filtered_members[$status]->orderBy(in_array($status, words('tutor dozent')) ? 'position,Nachname,Vorname' : 'Nachname,Vorname'); - } - } - return $filtered_members; - } - - /** - * @param string $sort_status - * @param string $order_by - * @return SimpleCollection - */ - public function getAdmissionMembers($sort_status = 'autor', $order_by = 'nachname asc') - { - list($order, $asc) = explode(' ', $order_by); - if ($order === 'nachname') { - $order_by = "nachname {$asc},vorname {$asc}"; - } - - $cs = CourseSet::getSetForCourse($this->course_id); - $claiming = []; - if (is_object($cs) && !$cs->hasAlgorithmRun()) { - foreach (AdmissionPriority::getPrioritiesByCourse($cs->getId(), $this->course_id) as $user_id => $p) { - $user = User::find($user_id); - $data = $user->toArray('user_id username vorname nachname email'); - $data['fullname'] = $user->getFullName('full_rev'); - $data['position'] = $cs->hasAdmissionRule('LimitedAdmission') ? $p : '-'; - $data['visible'] = 'unknown'; - $data['status'] = 'claiming'; - $claiming[] = $data; - } - } - - $query = "SELECT asu.user_id, username, Vorname, Nachname, Email, status, - position, asu.mkdate, asu.visible, asu.comment, - {$GLOBALS['_fullname_sql']['full_rev']} AS fullname - FROM admission_seminar_user AS asu - INNER JOIN auth_user_md5 USING (user_id) - INNER JOIN user_info USING (user_id) - WHERE seminar_id = ? - ORDER BY position, Nachname ASC"; - $st = DBManager::get()->prepare($query); - $st->execute([$this->course_id]); - $application_members = SimpleCollection::createFromArray(array_merge($claiming, $st->fetchAll(PDO::FETCH_ASSOC))); - $filtered_members = []; - foreach (words('awaiting accepted claiming') as $status) { - $filtered_members[$status] = $application_members->findBy('status', $status); - if ($status === $sort_status) { - $filtered_members[$status]->orderBy($order_by, $order !== 'nachname' ? SORT_NUMERIC : SORT_LOCALE_STRING); - } - } - return $filtered_members; - } - - /** - * Adds given users to the course waitlist, either at list beginning or end. - * System messages are sent to affected users. - * - * @param mixed $users array of user ids to add - * @param String $which_end 'last' or 'first': which list end to append to - * @return mixed Array of messages (stating success and/or errors) - */ - public function moveToWaitlist($users, $which_end) - { - $course = Seminar::getInstance($this->course_id); - foreach ($users as $user_id) { - // Delete member from seminar - if ($course->deleteMember($user_id)) { - setTempLanguage($user_id); - $message = sprintf(_('Sie wurden von der Veranstaltung **%s** von '. - '%s oder der Administration abgemeldet, '. - 'Sie wurden auf die Warteliste dieser Veranstaltung gesetzt.'), - $this->course_title, get_title_for_status('dozent', 1)); - restoreLanguage(); - messaging::sendSystemMessage($user_id, sprintf('%s %s', _('Systemnachricht:'), - _('Anmeldung aufgehoben, auf Warteliste gesetzt')), $message); - // Insert user in waitlist at current position. - if ($course->addToWaitlist($user_id, $which_end)) { - $temp_user = User::find($user_id); - $msgs['success'][] = $temp_user->getFullName('no_title'); - $curpos++; - // Something went wrong on removing the user from course. - } else { - $msgs['error'][] = $temp_user->getFullName('no_title'); - } - // Something went wrong on inserting the user in waitlist. - } else { - $msgs['error'][] = $temp_user->getFullName('no_title'); - } - } - return $msgs; - } - - /** - * Get the positon out of the database - * @param String $user_id - * @return String - */ - private function getPosition($user_id) - { - $query = "SELECT position FROM seminar_user WHERE user_id = ?"; - $position_statement = DBManager::get()->prepare($query); - - $position_statement->execute([$user_id]); - $pos = $position_statement->fetchColumn(); - $position_statement->closeCursor(); - - if ($pos) { - return $pos; - } else { - return null; - } - } - - private function getLogLevel($direction, $status) - { - if ($direction == 'upgrade') { - $directionString = 'hochgestuft'; - } else { - $directionString = 'runtergestuft'; - } - - switch ($status) { - case 'tutor': $log_level = 'zum Tutor'; - break; - case 'autor': $log_level = 'zum Autor'; - break; - case 'dozent': $log_level = 'zum Dozenten'; - break; - } - - return sprintf('%s %s', $directionString, $log_level); - } - - /* - * set the user_visibility of all unkowns to their global visibility - * set tutor and dozent to visible=yes - */ - function checkUserVisibility() - { - $st = DBManager::get()->prepare("SELECT COUNT(*) FROM seminar_user WHERE visible = 'unknown' AND Seminar_id = ?"); - $st->execute([$this->course_id]); - if ($st->fetchColumn()) { - $st = DBManager::get()->prepare("UPDATE seminar_user SET visible = 'yes' WHERE status IN ('tutor', 'dozent') AND Seminar_id = ?"); - $st->execute([$this->course_id]); - - $st = DBManager::get()->prepare("UPDATE seminar_user su INNER JOIN auth_user_md5 aum USING(user_id) - SET su.visible=IF(aum.visible IN('no','never') OR (aum.visible='unknown' AND " . (int)!Config::get()->USER_VISIBILITY_UNKNOWN . "), 'no','yes') - WHERE Seminar_id = ? AND su.visible='unknown'"); - $st->execute([$this->course_id]); - } - } - -} -- GitLab