/** * This action remove a user from course * @param $course_id */ public function decline_action($course_id, $waiting = null) { $current_seminar = Seminar::getInstance($course_id); $ticket_check = Seminar_Session::check_ticket(Request::option('studipticket')); if (LockRules::Check($course_id, 'participants')) { $lockdata = LockRules::getObjectRule($course_id); PageLayout::postMessage(MessageBox::error(sprintf(_("Sie können sich nicht von der Veranstaltung <b>%s</b> abmelden."), htmlReady($current_seminar->name)))); if ($lockdata['description']) { PageLayout::postMessage(MessageBox::info(formatLinks($lockdata['description']))); } $this->redirect('my_courses/index'); return; } if (Request::option('cmd') == 'back') { $this->redirect('my_courses/index'); return; } if (Request::option('cmd') != 'kill' && Request::option('cmd') != 'kill_admission') { if ($current_seminar->admission_binding && Request::get('cmd') != 'suppose_to_kill_admission' && !LockRules::Check($current_seminar->getId(), 'participants')) { PageLayout::postMessage(MessageBox::error(sprintf(_("Die Veranstaltung <b>%s</b> ist als <b>bindend</b> angelegt.\n Wenn Sie sich abmelden wollen, müssen Sie sich an die Lehrende der Veranstaltung wenden."), htmlReady($current_seminar->name)))); $this->redirect('my_courses/index'); return; } if (Request::get('cmd') == 'suppose_to_kill') { // check course admission list(, $admission_end_time) = @array_values($current_seminar->getAdmissionTimeFrame()); $admission_enabled = $current_seminar->isAdmissionEnabled(); $admission_locked = $current_seminar->isAdmissionLocked(); if ($admission_enabled || $admission_locked || (int) $current_seminar->admission_prelim == 1) { $message = sprintf(_('Wollen Sie sich von der teilnahmebeschränkten Veranstaltung "%s" wirklich abmelden? Sie verlieren damit die Berechtigung für die Veranstaltung und müssen sich ggf. neu anmelden!'), $current_seminar->name); } else { if (isset($admission_end_time) && $admission_end_time < time()) { $message = sprintf(_('Wollen Sie sich von der teilnahmebeschränkten Veranstaltung "%s" wirklich abmelden? Der Anmeldzeitraum ist abgelaufen und Sie können sich nicht wieder anmelden!'), $current_seminar->name); } else { $message = sprintf(_('Wollen Sie sich von der Veranstaltung "%s" wirklich abmelden?'), $current_seminar->name); } } $this->flash['cmd'] = 'kill'; } else { if (admission_seminar_user_get_position($GLOBALS['user']->id, $course_id) === false) { $message = sprintf(_('Wollen Sie sich von der Anmeldeliste der Veranstaltung "%s" wirklich abmelden?'), $current_seminar->name); } else { $message = sprintf(_('Wollen Sie sich von der Warteliste der Veranstaltung "%s" wirklich abmelden? Sie verlieren damit die bereits erreichte Position und müssen sich ggf. neu anmelden!'), $current_seminar->name); } $this->flash['cmd'] = 'kill_admission'; } $this->flash['decline_course'] = true; $this->flash['course_id'] = $course_id; $this->flash['message'] = $message; $this->flash['studipticket'] = Seminar_Session::get_ticket(); $this->redirect('my_courses/index'); return; } else { if (!LockRules::Check($course_id, 'participants') && $ticket_check && Request::option('cmd') != 'back' && Request::get('cmd') != 'kill_admission') { $query = "DELETE FROM seminar_user WHERE user_id = ? AND Seminar_id = ?"; $statement = DBManager::get()->prepare($query); $statement->execute(array($GLOBALS['user']->id, $course_id)); if ($statement->rowCount() == 0) { PageLayout::postMessage(MessageBox::error(_('In der ausgewählten Veranstaltung wurde die gesuchten Personen nicht gefunden und konnte daher nicht ausgetragen werden.'))); } else { // LOGGING StudipLog::log('SEM_USER_DEL', $course_id, $GLOBALS['user']->id, 'Hat sich selbst ausgetragen'); // enable others to do something after the user has been deleted NotificationCenter::postNotification('UserDidLeaveCourse', $course_id, $GLOBALS['user']->id); // Delete from statusgroups RemovePersonStatusgruppeComplete(get_username(), $course_id); // Are successor available update_admission($course_id); PageLayout::postMessage(MessageBox::success(sprintf(_("Erfolgreich von Veranstaltung <b>%s</b> abgemeldet."), htmlReady($current_seminar->name)))); } } else { // LOGGING StudipLog::log('SEM_USER_DEL', $course_id, $GLOBALS['user']->id, 'Hat sich selbst aus der Warteliste ausgetragen'); if ($current_seminar->isAdmissionEnabled()) { $prio_delete = AdmissionPriority::unsetPriority($current_seminar->getCourseSet()->getId(), $GLOBALS['user']->id, $course_id); } $query = "DELETE FROM admission_seminar_user WHERE user_id = ? AND seminar_id = ?"; $statement = DBManager::get()->prepare($query); $statement->execute(array($GLOBALS['user']->id, $course_id)); if ($statement->rowCount() || $prio_delete) { //Warteliste neu sortieren renumber_admission($course_id); //Pruefen, ob es Nachruecker gibt update_admission($course_id); PageLayout::postMessage(MessageBox::success(sprintf(_("Der Eintrag in der Anmelde- bzw. Warteliste der Veranstaltung <b>%s</b> wurde aufgehoben.\n Wenn Sie an der Veranstaltung teilnehmen wollen, müssen Sie sich erneut bewerben."), htmlReady($current_seminar->name)))); } } $this->redirect('my_courses/index'); return; } }
/** * This function updates an admission procedure * * The function checks, if user could be insert to the seminar. * The User gets a message, if he is inserted to the seminar * * @param string seminar_id the seminar_id of the seminar to calculate * @param boolean send_message should a system-message be send? * */ function normal_update_admission($seminar_id, $send_message = TRUE) { $messaging=new messaging; //Daten holen / Abfrage ob ueberhaupt begrenzt $seminar = Seminar::GetInstance($seminar_id); if($seminar->isAdmissionEnabled()){ $sem_preliminary = ($seminar->admission_prelim == 1); $cs = $seminar->getCourseSet(); //Veranstaltung einfach auffuellen (nach Lostermin und Ende der Kontingentierung) if (!$seminar->admission_disable_waitlist_move && $cs->hasAlgorithmRun()) { //anzahl der freien Plaetze holen $count = (int)$seminar->getFreeAdmissionSeats(); //Studis auswaehlen, die jetzt aufsteigen koennen $query = "SELECT user_id, username FROM admission_seminar_user LEFT JOIN auth_user_md5 USING (user_id) WHERE seminar_id = ? AND status = 'awaiting' ORDER BY position LIMIT " . (int)$count; $statement = DBManager::get()->prepare($query); $statement->execute(array($seminar->getId())); $temp = $statement->fetchAll(PDO::FETCH_ASSOC); foreach ($temp as $row) { //ok, here ist the "colored-group" meant (for grouping on meine_seminare), not the grouped seminars as above! $group = select_group($seminar->getSemesterStartTime()); if (!$sem_preliminary) { $query = "INSERT INTO seminar_user (user_id, Seminar_id, status, gruppe, mkdate) VALUES (?, ?, 'autor', ?, UNIX_TIMESTAMP())"; $statement = DBManager::get()->prepare($query); $statement->execute(array( $row['user_id'], $seminar->getId(), $group )); $affected = $statement->rowCount(); NotificationCenter::postNotification('UserDidEnterCourse', $seminar->getId(), $row['user_id']); } else { $query = "UPDATE admission_seminar_user SET status = 'accepted' WHERE user_id = ? AND seminar_id = ?"; $statement = DBManager::get()->prepare($query); $statement->execute(array( $row['user_id'], $seminar->getId() )); $affected = $statement->rowCount(); } if ($affected > 0) { $log_message = 'Wurde automatisch aus der Warteliste in die Veranstaltung eingetragen.'; StudipLog::log('SEM_USER_ADD', $seminar->getId(), $row['user_id'], $sem_preliminary ? 'accepted' : 'autor', $log_message); if (!$sem_preliminary) { $query = "DELETE FROM admission_seminar_user WHERE user_id = ? AND seminar_id = ?"; $statement = DBManager::get()->prepare($query); $statement->execute(array( $row['user_id'], $seminar->getId() )); $affected = $statement->rowCount(); } else { $affected = 0; } //User benachrichtigen if (($sem_preliminary || $affected > 0) && $send_message) { setTempLanguage($row['user_id']); if (!$sem_preliminary) { $message = sprintf (_('Sie sind in die Veranstaltung **%s (%s)** eingetragen worden, da für Sie ein Platz frei geworden ist. Ab sofort finden Sie die Veranstaltung in der Übersicht Ihrer Veranstaltungen. Damit sind Sie auch für die Präsenzveranstaltung zugelassen.'), $seminar->getName(), $seminar->getFormattedTurnus(true)); } else { $message = sprintf (_('Sie haben den Status vorläufig akzeptiert in der Veranstaltung **%s (%s)** erhalten, da für Sie ein Platz freigeworden ist.'), $seminar->getName(), $seminar->getFormattedTurnus(true)); } $subject = sprintf(_("Teilnahme an der Veranstaltung %s"),$seminar->getName()); restoreLanguage(); $messaging->insert_message($message, $row['username'], '____%system%____', FALSE, FALSE, '1', FALSE, $subject, true); } } } //Warteposition der restlichen User neu eintragen renumber_admission($seminar_id, FALSE); } $seminar->restore(); } }
/** * adds a user to the seminar with the given status * @param user_id string: ID of the user * @param status string: status of the user for the seminar "user", "autor", "tutor", "dozent" * @param force bool: if false (default) the user will only be upgraded and not degraded in his/her status */ public function addMember($user_id, $status = 'autor', $force = false) { if (in_array(get_global_perm($user_id), array("admin", "root"))) { $this->createError(_("Admin und Root dürfen nicht Mitglied einer Veranstaltung sein.")); return false; } $db = DBManager::get(); $rangordnung = array_flip(array('user', 'autor', 'tutor', 'dozent')); if ($rangordnung[$status] > $rangordnung['autor'] && SeminarCategories::getByTypeId($this->status)->only_inst_user) { //überprüfe, ob im richtigen Institut: $user_institute_stmt = $db->prepare( "SELECT Institut_id " . "FROM user_inst " . "WHERE user_id = :user_id " . ""); $user_institute_stmt->execute(array('user_id' => $user_id)); $user_institute = $user_institute_stmt->fetchAll(PDO::FETCH_COLUMN, 0); if (!in_array($this->institut_id, $user_institute) && !count(array_intersect($user_institute, $this->getInstitutes()))) { $this->createError(_("Einzutragender Nutzer stammt nicht einem beteiligten Institut an.")); return false; } } if (!$force) { $query = "SELECT status FROM seminar_user WHERE user_id = ? AND Seminar_id = ?"; $statement = DBManager::get()->prepare($query); $statement->execute(array($user_id, $this->id)); $old_status = $statement->fetchColumn(); } $query = "SELECT MAX(position) + 1 FROM seminar_user WHERE status = ? AND Seminar_id = ?"; $statement = DBManager::get()->prepare($query); $statement->execute(array($status, $this->id)); $new_position = $statement->fetchColumn(); $query = "SELECT COUNT(*) FROM seminar_user WHERE Seminar_id = ? AND status = 'dozent'"; $statement = DBManager::get()->prepare($query); $statement->execute(array($this->id)); $numberOfTeachers = $statement->fetchColumn(); if (!$old_status) { $query = "INSERT INTO seminar_user (Seminar_id, user_id, status, position, gruppe, visible, mkdate) VALUES (?, ?, ?, ?, ?, ?, UNIX_TIMESTAMP())"; $statement = DBManager::get()->prepare($query); $statement->execute(array( $this->id, $user_id, $status, $new_position ?: 0, (int)select_group($this->getSemesterStartTime()), in_array($status, words('tutor dozent')) ? 'yes' : 'unknown', )); // delete the entries, user is now in the seminar $stmt = DBManager::get()->prepare('DELETE FROM admission_seminar_user WHERE user_id = ? AND seminar_id = ?'); $stmt->execute(array($user_id, $this->getId())); if ($stmt->rowCount()) { //renumber the waiting/accepted/lot list, a user was deleted from it renumber_admission($this->getId()); } $cs = $this->getCourseSet(); if ($cs) { $prio_delete = AdmissionPriority::unsetPriority($cs->getId(), $user_id, $this->getId()); } removeScheduleEntriesMarkedAsVirtual($user_id, $this->getId()); NotificationCenter::postNotification("CourseDidGetMember", $this, $user_id); NotificationCenter::postNotification('UserDidEnterCourse', $this->id, $user_id); StudipLog::log('SEM_USER_ADD', $this->id, $user_id, $status, 'Wurde in die Veranstaltung eingetragen'); $this->course->resetRelation('members'); $this->course->resetRelation('admission_applicants'); return $this; } elseif (($force || $rangordnung[$old_status] < $rangordnung[$status]) && ($old_status !== "dozent" || $numberOfTeachers > 1)) { $query = "UPDATE seminar_user SET status = ?, visible = IFNULL(?, visible), position = ? WHERE Seminar_id = ? AND user_id = ?"; $statement = DBManager::get()->prepare($query); $statement->execute(array( $status, in_array($status, words('tutor dozent')) ? 'yes' : null, $new_position, $this->id, $user_id, )); if ($old_status === 'dozent') { $query = "SELECT termin_id FROM termine WHERE range_id = ?"; $statement = DBManager::get()->prepare($query); $statement->execute(array($this->id)); $termine = $statement->fetchAll(PDO::FETCH_COLUMN); $query = "DELETE FROM termin_related_persons WHERE range_id = ? AND user_id = ?"; $statement = DBManager::get()->prepare($query); foreach ($termine as $termin_id) { $statement->execute(array($termin_id, $user_id)); } } NotificationCenter::postNotification("CourseDidChangeMember", $this, $user_id); $this->course->resetRelation('members'); $this->course->resetRelation('admission_applicants'); return $this; } else { if ($old_status === "dozent" && $numberOfTeachers <= 1) { $this->createError(sprintf(_("Die Veranstaltung muss wenigstens <b>einen/eine</b> VeranstaltungsleiterIn (%s) eingetragen haben!"), get_title_for_status('dozent', 1, $this->status)) . ' ' . _("Tragen Sie zunächst einen anderen ein, um diesen herabzustufen.")); } return false; } }
public function addMember($user_id, $accepted = null, $consider_contingent = null, $cmd = 'add_user') { global $perm, $SEM_CLASS, $SEM_TYPE; $user = UserModel::getUser($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); // create fullname of user of given user informations $fullname = $user['Vorname'] . ' ' . $user['Nachname']; if ($admission_user) { setTempLanguage($user_id); if ($cmd == 'add_user') { $message = sprintf(_('Sie wurden vom einem/einer %s oder Admin in die Veranstaltung **%s** eingetragen.'), get_title_for_status('dozent', 1), $this->course_title); } else { if (!$accepted) { $message = sprintf(_('Sie wurden vom einem/einer %s oder Admin aus der Warteliste in die Veranstaltung **%s** aufgenommen und sind damit zugelassen.'), get_title_for_status('dozent', 1), $this->course_title); } else { $message = sprintf(_('Sie wurden von einem/einer %s oder Admin vom Status **vorläufig akzeptiert** auf "**teilnehmend** in der Veranstaltung **%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(_('%s wurde in die Veranstaltung mit dem Status <b>%s</b> eingetragen.'), $fullname, $status)); } else { if (!$accepted) { $msg = MessageBox::success(sprintf(_('%s wurde aus der Anmelde bzw. Warteliste mit dem Status <b>%s</b> in die Veranstaltung eingetragen.'), $fullname, $status)); } else { $msg = MessageBox::success(sprintf(_('%s wurde mit dem Status <b>%s</b> endg?ltig akzeptiert und damit in die Veranstaltung aufgenommen.'), $fullname, $status)); } } } else { if ($consider_contingent) { $msg = MessageBox::error(_('Es stehen keine weiteren Plätze mehr im Teilnehmerkontingent 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; }