/** * Distribute seats for several courses in a course set. * No priorities are given. * * @param CourseSet $courseSet The course set containing the courses * that seats shall be distributed for. * @see CourseSet */ private function distributeByCourses($courseSet) { Log::DEBUG('start seat distribution for course set: ' . $courseSet->getId()); foreach ($courseSet->getCourses() as $course_id) { $course = Course::find($course_id); $free_seats = $course->getFreeSeats(); $claiming_users = AdmissionPriority::getPrioritiesByCourse($courseSet->getId(), $course->id); $factored_users = $courseSet->getUserFactorList(); //apply bonus/malus to users, exclude participants foreach (array_keys($claiming_users) as $user_id) { if (!$course->getParticipantStatus($user_id)) { $claiming_users[$user_id] = 1; if (isset($factored_users[$user_id])) { $claiming_users[$user_id] *= $factored_users[$user_id]; } Log::DEBUG(sprintf('user %s gets factor %s', $user_id, $claiming_users[$user_id])); } else { unset($claiming_users[$user_id]); Log::DEBUG(sprintf('user %s is already %s, ignoring', $user_id, $course->getParticipantStatus($user_id))); } } Log::DEBUG(sprintf('distribute %s seats on %s claiming in course %s', $free_seats, count($claiming_users), $course->id)); $claiming_users = $this->rollTheDice($claiming_users); Log::DEBUG('the die is cast: ' . print_r($claiming_users, 1)); $chosen_ones = array_slice(array_keys($claiming_users), 0, $free_seats); Log::DEBUG('chosen ones: ' . print_r($chosen_ones, 1)); $this->addUsersToCourse($chosen_ones, $course); if ($free_seats < count($claiming_users)) { if (!$course->admission_disable_waitlist) { $free_seats_waitlist = $course->admission_waitlist_max ?: count($claiming_users) - $free_seats; $waiting_list_ones = array_slice(array_keys($claiming_users), $free_seats, $free_seats_waitlist); Log::DEBUG('waiting list ones: ' . print_r($waiting_list_ones, 1)); $this->addUsersToWaitlist($waiting_list_ones, $course); } else { $free_seats_waitlist = 0; } if ($free_seats_waitlist + $free_seats < count($claiming_users)) { $remaining_ones = array_slice(array_keys($claiming_users), $free_seats_waitlist + $free_seats); Log::DEBUG('remaining ones: ' . print_r($remaining_ones, 1)); $this->notifyRemainingUsers($remaining_ones, $course); } } } }
/** * Exports member-list for a Stud.IP-lecture. * * This function gets the data of the members of a lecture and writes it into $data_object. * It calls output_data afterwards. * * @access public * @param string $inst_id Stud.IP-inst_id for export * @param string $ex_sem_id allows to choose which lecture is to be exported */ function export_teilis($inst_id, $ex_sem_id = "no") { global $range_id, $xml_file, $o_mode, $xml_names_person, $xml_groupnames_person, $xml_names_studiengaenge, $xml_groupnames_studiengaenge, $object_counter, $filter, $SEM_CLASS, $SEM_TYPE, $SessSemName; if ($filter == 'status') { $query = "SELECT statusgruppe_id, name\n FROM statusgruppen\n WHERE range_id = ?\n ORDER BY position ASC"; $statement = DBManager::get()->prepare($query); $statement->execute(array($ex_sem_id)); $gruppe = $statement->fetchGrouped(PDO::FETCH_COLUMN); $gruppe['no'] = _('keiner Funktion oder Gruppe zugeordnet'); } else { if (!in_array($filter, words('awaiting claiming'))) { if (!$SEM_CLASS[$SEM_TYPE[$SessSemName['art_num']]['class']]['workgroup_mode']) { $gruppe = array('dozent' => _('Lehrende'), 'tutor' => _('Tutor/-innen'), 'autor' => _('Studierende'), 'user' => _('Leser/-innen'), 'accepted' => _('Vorläufig akzeptierte Personen')); } else { $gruppe = array('dozent' => _('Leitung'), 'tutor' => _('Mitglieder'), 'autor' => _('Autor/-innen'), 'user' => _('Leser/-innen'), 'accepted' => _('Vorläufig akzeptierte Personen')); } } else { $gruppe[$filter] = _('Anmeldeliste'); } } $data_object .= xml_open_tag($xml_groupnames_person['group']); while (list($key1, $val1) = each($gruppe)) { $parameters = array(); if ($filter == 'status') { // Gruppierung nach Statusgruppen / Funktionen if ($key1 == 'no') { $query = "SELECT ui.*, aum.*, su.*, FROM_UNIXTIME(su.mkdate) AS registration_date,\n GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n FROM seminar_user AS su\n LEFT JOIN auth_user_md5 AS aum USING (user_id)\n LEFT JOIN user_info AS ui USING (user_id)\n LEFT JOIN user_studiengang USING (user_id)\n LEFT JOIN studiengaenge AS sg USING(studiengang_id)\n LEFT JOIN abschluss AS a USING (abschluss_id)\n WHERE seminar_id = :seminar_id\n GROUP BY aum.user_id\n ORDER BY Nachname"; $parameters[':seminar_id'] = $ex_sem_id; } else { $query = "SELECT DISTINCT ui.*, aum.*, su.*, FROM_UNIXTIME(su.mkdate) AS registration_date,\n GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n FROM statusgruppe_user\n LEFT JOIN seminar_user AS su USING (user_id)\n LEFT JOIN auth_user_md5 AS aum USING (user_id)\n LEFT JOIN user_info AS ui USING (user_id)\n LEFT JOIN user_studiengang USING(user_id)\n LEFT JOIN studiengaenge AS sg USING(studiengang_id)\n LEFT JOIN abschluss AS a USING (abschluss_id)\n WHERE statusgruppe_id = :statusgruppe_id AND seminar_id = :seminar_id\n GROUP BY aum.user_id\n ORDER BY Nachname"; $parameters[':seminar_id'] = $ex_sem_id; $parameters[':statusgruppe_id'] = $key1; } } else { if ($key1 == 'accepted') { $query = "SELECT ui.*, aum.*, asu.comment,\n FROM_UNIXTIME(asu.mkdate) AS registration_date,\n GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n FROM admission_seminar_user AS asu\n LEFT JOIN user_info AS ui USING (user_id)\n LEFT JOIN auth_user_md5 AS aum USING (user_id)\n LEFT JOIN user_studiengang USING (user_id)\n LEFT JOIN studiengaenge AS sg ON (user_studiengang.studiengang_id = sg.studiengang_id)\n LEFT JOIN abschluss AS a USING (abschluss_id)\n WHERE seminar_id = :seminar_id AND asu.status = 'accepted'\n GROUP BY aum.user_id\n ORDER BY Nachname"; $parameters[':seminar_id'] = $ex_sem_id; } elseif ($key1 == 'awaiting') { $query = "SELECT ui.*, aum.*, asu.comment,\n asu.position AS admission_position,\n GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n FROM admission_seminar_user AS asu\n LEFT JOIN user_info AS ui USING(user_id)\n LEFT JOIN auth_user_md5 AS aum USING(user_id)\n LEFT JOIN user_studiengang USING(user_id)\n LEFT JOIN studiengaenge AS sg ON (user_studiengang.studiengang_id = sg.studiengang_id)\n LEFT JOIN abschluss AS a USING (abschluss_id)\n WHERE asu.seminar_id = :seminar_id AND asu.status != 'accepted'\n GROUP BY aum.user_id ORDER BY position"; $parameters[':seminar_id'] = $ex_sem_id; } elseif ($key1 == 'claiming') { $cs = CourseSet::getSetForCourse($ex_sem_id); if (is_object($cs) && !$cs->hasAlgorithmRun()) { $parameters[':users'] = array_keys(AdmissionPriority::getPrioritiesByCourse($cs->getId(), $ex_sem_id)); } else { $parameters[':users'] = array(); } $query = "SELECT ui.*, aum.*, '' as comment,\n 0 AS admission_position,\n GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, user_studiengang.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n FROM auth_user_md5 AS aum\n INNER JOIN user_info AS ui USING(user_id)\n LEFT JOIN user_studiengang USING(user_id)\n LEFT JOIN studiengaenge AS sg ON (user_studiengang.studiengang_id = sg.studiengang_id)\n LEFT JOIN abschluss AS a USING (abschluss_id)\n WHERE aum.user_id IN (:users)\n GROUP BY aum.user_id ORDER BY Nachname"; } else { $query = "SELECT ui.*, aum.*, su.*, FROM_UNIXTIME(su.mkdate) AS registration_date,\n GROUP_CONCAT(CONCAT_WS(',', sg.name, a.name, us.semester) SEPARATOR '; ') AS nutzer_studiengaenge\n FROM seminar_user AS su\n LEFT JOIN auth_user_md5 AS aum USING ( user_id )\n LEFT JOIN user_info AS ui USING ( user_id )\n LEFT JOIN user_studiengang AS us USING(user_id)\n LEFT JOIN studiengaenge AS sg USING (studiengang_id)\n LEFT JOIN abschluss AS a USING (abschluss_id)\n WHERE seminar_id = :seminar_id AND su.status = :status\n GROUP BY aum.user_id\n ORDER BY " . ($key1 == 'dozent' ? 'position, ' : '') . "Nachname"; $parameters[':seminar_id'] = $ex_sem_id; $parameters[':status'] = $key1; } } $statement = DBManager::get()->prepare($query); $statement->execute($parameters); $data = $statement->fetchAll(PDO::FETCH_ASSOC); $data_object_tmp = ''; $object_counter_tmp = $object_counter; if (count($data) > 0) { $data_object_tmp .= xml_open_tag($xml_groupnames_person['subgroup1'], $val1); foreach ($data as $row) { // Nur Personen ausgeben, die entweder einer Gruppe angehoeren // oder zur Veranstaltung gehoeren und noch nicht ausgegeben wurden. if ($key1 != 'no' || $person_out[$row['user_id']] != true) { $object_counter += 1; $data_object_tmp .= xml_open_tag($xml_groupnames_person["object"], $row['username']); reset($xml_names_person); while (list($key, $val) = each($xml_names_person)) { if ($val == '') { $val = $key; } if ($row[$key] != '') { $data_object_tmp .= xml_tag($val, $row[$key]); } } // freie Datenfelder ausgeben $data_object_tmp .= export_datafields($row['user_id'], $xml_groupnames_person['childgroup1'], $xml_groupnames_person['childobject1'], 'user'); $data_object_tmp .= xml_close_tag($xml_groupnames_person['object']); $person_out[$row['user_id']] = true; } } $data_object_tmp .= xml_close_tag($xml_groupnames_person['subgroup1']); if ($object_counter_tmp != $object_counter) { $data_object .= $data_object_tmp; } } } $data_object .= xml_close_tag($xml_groupnames_person['group']); if (!in_array($filter, words('status awaiting accepted'))) { $query = "SELECT CONCAT_WS(',', studiengaenge.name, abschluss.name) AS name, COUNT(*) AS c\n FROM seminar_user\n INNER JOIN user_studiengang USING (user_id)\n LEFT JOIN studiengaenge USING (studiengang_id)\n LEFT JOIN abschluss USING (abschluss_id)\n WHERE seminar_id = ?\n GROUP BY name"; $statement = DBManager::get()->prepare($query); $statement->execute(array($ex_sem_id)); $studiengang_count = $statement->fetchGrouped(PDO::FETCH_COLUMN); if (count($studiengang_count) > 0) { $data_object .= xml_open_tag($xml_groupnames_studiengaenge["group"]); for ($i = 0; $i < count($studiengang_count); $i += 1) { // TODO: Is this really neccessary? while (list($key, $val) = each($studiengang_count)) { $data_object .= xml_open_tag($xml_groupnames_studiengaenge['object']); $data_object .= xml_tag($xml_names_studiengaenge['name'], $key); $data_object .= xml_tag($xml_names_studiengaenge['count'], $val); $data_object .= xml_close_tag($xml_groupnames_studiengaenge['object']); } } $data_object .= xml_close_tag($xml_groupnames_studiengaenge['group']); } } output_data($data_object, $o_mode); }
/** * Lets the user compose a message and send it. */ public function write_action() { PageLayout::setTitle(_("Neue Nachricht schreiben")); //collect possible default adressees $this->to = array(); $this->default_message = new Message(); if (Request::username("rec_uname")) { $user = new MessageUser(); $user->setData(array('user_id' => get_userid(Request::username("rec_uname")), 'snd_rec' => "rec")); $this->default_message->receivers[] = $user; } if (Request::getArray("rec_uname")) { foreach (Request::usernameArray("rec_uname") as $username) { $user = new MessageUser(); $user->setData(array('user_id' => get_userid($username), 'snd_rec' => "rec")); $this->default_message->receivers[] = $user; } } if (Request::option("group_id")) { $this->default_message->receivers = array(); $group = Statusgruppen::find(Request::option("group_id")); if ($group['range_id'] === $GLOBALS['user']->id || $GLOBALS['perm']->have_studip_perm("autor", $group['range_id'])) { foreach ($group->members as $member) { $user = new MessageUser(); $user->setData(array('user_id' => $member['user_id'], 'snd_rec' => "rec")); $this->default_message->receivers[] = $user; } } } if (Request::get('inst_id') && $GLOBALS['perm']->have_perm('admin')) { $query = "SELECT user_id FROM user_inst WHERE Institut_id = ? AND inst_perms != 'user'"; $this->default_message->receivers = DBManager::get()->fetchAll($query, array(Request::option('inst_id')), 'MessageUser::build'); } if (Request::get("filter") && Request::option("course_id")) { $course = new Course(Request::option('course_id')); if ($GLOBALS['perm']->have_studip_perm("tutor", Request::option('course_id')) || $course->getSemClass()['studygroup_mode']) { $this->default_message->receivers = array(); if (Request::get("filter") === 'claiming') { $cs = CourseSet::getSetForCourse(Request::option("course_id")); if (is_object($cs) && !$cs->hasAlgorithmRun()) { foreach (AdmissionPriority::getPrioritiesByCourse($cs->getId(), Request::option("course_id")) as $user_id => $p) { $this->default_message->receivers[] = MessageUser::build(array('user_id' => $user_id, 'snd_rec' => 'rec')); } } } else { $params = array(Request::option('course_id'), Request::option('who')); switch (Request::get("filter")) { case 'send_sms_to_all': $query = "SELECT b.user_id,'rec' as snd_rec FROM seminar_user a, auth_user_md5 b WHERE a.Seminar_id = ? AND a.user_id = b.user_id AND a.status = ? ORDER BY Nachname, Vorname"; break; case 'all': $query = "SELECT user_id,'rec' as snd_rec FROM seminar_user LEFT JOIN auth_user_md5 USING(user_id) WHERE Seminar_id = ? ORDER BY Nachname, Vorname"; break; case 'prelim': $query = "SELECT user_id,'rec' as snd_rec FROM admission_seminar_user LEFT JOIN auth_user_md5 USING(user_id) WHERE seminar_id = ? AND status='accepted' ORDER BY Nachname, Vorname"; break; case 'awaiting': $query = "SELECT user_id,'rec' as snd_rec FROM admission_seminar_user LEFT JOIN auth_user_md5 USING(user_id) WHERE seminar_id = ? AND status='awaiting' ORDER BY Nachname, Vorname"; break; case 'inst_status': $query = "SELECT b.user_id,'rec' as snd_rec FROM user_inst a, auth_user_md5 b WHERE a.Institut_id = ? AND a.user_id = b.user_id AND a.inst_perms = ? ORDER BY Nachname, Vorname"; break; } $this->default_message->receivers = DBManager::get()->fetchAll($query, $params, 'MessageUser::build'); } } } if (Request::option('prof_id') && Request::option('deg_id') && $GLOBALS['perm']->have_perm('root')) { $query = "SELECT DISTINCT user_id,'rec' as snd_rec\n FROM user_studiengang\n WHERE studiengang_id = ? AND abschluss_id = ?"; $this->default_message->receivers = DBManager::get()->fetchAll($query, array(Request::option('prof_id'), Request::option('deg_id')), 'MessageUser::build'); } if (Request::option('sd_id') && $GLOBALS['perm']->have_perm('root')) { $query = "SELECT DISTINCT user_id,'rec' as snd_rec\n FROM user_studiengang\n WHERE abschluss_id = ?"; $this->default_message->receivers = DBManager::get()->fetchAll($query, array(Request::option('sd_id')), 'MessageUser::build'); } if (Request::option('sp_id') && $GLOBALS['perm']->have_perm('root')) { $query = "SELECT DISTINCT user_id,'rec' as snd_rec\n FROM user_studiengang\n WHERE studiengang_id = ?"; $this->default_message->receivers = DBManager::get()->fetchAll($query, array(Request::option('sp_id')), 'MessageUser::build'); } if (!$this->default_message->receivers->count() && is_array($_SESSION['sms_data']['p_rec'])) { $this->default_message->receivers = DBManager::get()->fetchAll("SELECT user_id,'rec' as snd_rec FROM auth_user_md5 WHERE username IN(?) ORDER BY Nachname,Vorname", array($_SESSION['sms_data']['p_rec']), 'MessageUser::build'); unset($_SESSION['sms_data']); } if (Request::option("answer_to")) { $this->default_message->receivers = array(); $old_message = new Message(Request::option("answer_to")); if (!$old_message->permissionToRead()) { throw new AccessDeniedException("Message is not for you."); } if (!Request::get('forward')) { if (Request::option("quote") === $old_message->getId()) { if (Studip\Markup::isHtml($old_message['message'])) { $this->default_message['message'] = "<div>[quote]\n" . $old_message['message'] . "\n[/quote]</div>"; } else { $this->default_message['message'] = "[quote]\n" . $old_message['message'] . "\n[/quote]"; } } $this->default_message['subject'] = substr($old_message['subject'], 0, 4) === "RE: " ? $old_message['subject'] : "RE: " . $old_message['subject']; $user = new MessageUser(); $user->setData(array('user_id' => $old_message['autor_id'], 'snd_rec' => "rec")); $this->default_message->receivers[] = $user; $this->answer_to = $old_message->id; } else { $messagesubject = 'FWD: ' . $old_message['subject']; $message = _("-_-_ Weitergeleitete Nachricht _-_-"); $message .= "\n" . _("Betreff") . ": " . $old_message['subject']; $message .= "\n" . _("Datum") . ": " . strftime('%x %X', $old_message['mkdate']); $message .= "\n" . _("Von") . ": " . get_fullname($old_message['autor_id']); $num_recipients = $old_message->getNumRecipients(); if ($GLOBALS['user']->id == $old_message->autor_id) { $message .= "\n" . _("An") . ": " . ($num_recipients == 1 ? _('Eine Person') : sprintf(_('%s Personen'), $num_recipients)); } else { $message .= "\n" . _("An") . ": " . $GLOBALS['user']->getFullname() . ($num_recipients > 1 ? ' ' . sprintf(_('(und %d weitere)'), $num_recipients) : ''); } $message .= "\n\n"; if (Studip\Markup::isHtml($old_message['message'])) { $message = '<div>' . htmlReady($message, false, true) . '</div>' . $old_message['message']; } else { $message .= $old_message['message']; } if (count($old_message->attachments)) { Request::set('message_id', $old_message->getNewId()); foreach ($old_message->attachments as $attachment) { $attachment->range_id = 'provisional'; $attachment->seminar_id = $GLOBALS['user']->id; $attachment->autor_host = $_SERVER['REMOTE_ADDR']; $attachment->user_id = $GLOBALS['user']->id; $attachment->description = Request::option('message_id'); $new_attachment = $attachment->toArray(array('range_id', 'user_id', 'seminar_id', 'name', 'description', 'filename', 'filesize')); $new_attachment = StudipDocument::createWithFile(get_upload_file_path($attachment->getId()), $new_attachment); $this->default_attachments[] = array('icon' => GetFileIcon(getFileExtension($new_attachment['filename']))->asImg(['class' => "text-bottom"]), 'name' => $new_attachment['filename'], 'document_id' => $new_attachment->id, 'size' => relsize($new_attachment['filesize'], false)); } } $this->default_message['subject'] = $messagesubject; $this->default_message['message'] = $message; } } if (Request::get("default_body")) { $this->default_message['message'] = Request::get("default_body"); } if (Request::get("default_subject")) { $this->default_message['subject'] = Request::get("default_subject"); } $settings = UserConfig::get($GLOBALS['user']->id)->MESSAGING_SETTINGS; $this->mailforwarding = Request::get('emailrequest') ? true : $settings['request_mail_forward']; if (trim($settings['sms_sig'])) { if (Studip\Markup::isHtml($this->default_message['message']) || Studip\Markup::isHtml($settings['sms_sig'])) { if (!Studip\Markup::isHtml($this->default_message['message'])) { $this->default_message['message'] = '<div>' . nl2br($this->default_message['message']) . '</div>'; } $this->default_message['message'] .= '<br><br>--<br>'; if (Studip\Markup::isHtml($settings['sms_sig'])) { $this->default_message['message'] .= $settings['sms_sig']; } else { $this->default_message['message'] .= formatReady($settings['sms_sig']); } } else { $this->default_message['message'] .= "\n\n--\n" . $settings['sms_sig']; } } NotificationCenter::postNotification("DefaultMessageForComposerCreated", $this->default_message); }
/** * A person applies for a course. */ function apply_action() { $user_id = $GLOBALS['user']->id; $courseset = CourseSet::getSetForCourse($this->course_id); $this->course_name = PageLayout::getTitle(); if ($courseset) { $errors = $courseset->checkAdmission($user_id, $this->course_id); if (count($errors)) { $this->courseset_message = $courseset->toString(true); $this->admission_error = MessageBox::error(_("Die Anmeldung war nicht erfolgreich."), $errors); foreach ($courseset->getAdmissionRules() as $rule) { $admission_form .= $rule->getInput(); } if ($admission_form) { $this->admission_form = $admission_form; } } else { if ($courseset->isSeatDistributionEnabled()) { if ($courseset->hasAlgorithmRun()) { if ($courseset->getSeatDistributionTime()) { $msg = _("Die Plätze in dieser Veranstaltung wurden automatisch verteilt."); } if (StudipLock::get('enrolment' . $this->course_id)) { $course = Course::find($this->course_id); if ($course->getFreeSeats() && !$course->getNumWaiting()) { $enrol_user = true; } else { if ($course->isWaitlistAvailable()) { $seminar = new Seminar($course); if ($seminar->addToWaitlist($user_id, 'last')) { $msg_details[] = sprintf(_("Alle Plätze sind belegt, Sie wurden daher auf Platz %s der Warteliste gesetzt."), $maxpos); } } else { $this->admission_error = MessageBox::error(_("Die Anmeldung war nicht erfolgreich. Alle Plätze sind belegt und es steht keine Warteliste zur Verfügung.")); } } } else { $this->admission_error = MessageBox::error(_("Die Anmeldung war wegen technischer Probleme nicht erfolgreich. Bitte versuchen Sie es später noch einmal.")); } } else { $msg = _("Die Plätze in dieser Veranstaltung werden automatisch verteilt."); if ($limit = $courseset->getAdmissionRule('LimitedAdmission')) { $msg_details[] = sprintf(_("Diese Veranstaltung gehört zu einem Anmeldeset mit %s Veranstaltungen. Sie können maximal %s davon belegen. Bei der Verteilung werden die von Ihnen gewünschten Prioritäten berücksichtigt."), count($courseset->getCourses()), $limit->getMaxNumber()); $this->user_max_limit = $limit->getMaxNumberForUser($user_id); if (get_config('IMPORTANT_SEMNUMBER')) { $order = "ORDER BY VeranstaltungsNummer, Name"; } else { $order = "ORDER BY Name"; } $this->priocourses = Course::findMany($courseset->getCourses(), $order); $this->user_prio = AdmissionPriority::getPrioritiesByUser($courseset->getId(), $user_id); $this->max_limit = $limit->getMaxNumber(); $this->prio_stats = AdmissionPriority::getPrioritiesStats($courseset->getId()); $this->already_claimed = count($this->user_prio); } else { $this->priocourses = Course::find($this->course_id); $this->already_claimed = array_key_exists($this->course_id, AdmissionPriority::getPrioritiesByUser($courseset->getId(), $user_id)); } $msg_details[] = _("Zeitpunkt der automatischen Verteilung: ") . strftime("%x %X", $courseset->getSeatDistributionTime()); $this->num_claiming = count(AdmissionPriority::getPrioritiesByCourse($courseset->getId(), $this->course_id)); if ($this->already_claimed) { $msg_details[] = _("Sie sind bereits für die Verteilung angemeldet."); } } $this->courseset_message = MessageBox::info($msg, $msg_details); } else { $enrol_user = true; } } } else { $enrol_user = true; } if ($enrol_user) { $course = Seminar::GetInstance($this->course_id); if ($course->admission_prelim) { if (!$course->isStudygroup() && $course->admission_prelim_txt && !Request::submitted('apply')) { $this->admission_prelim_txt = $course->admission_prelim_txt; $this->admission_prelim_comment = Config::get()->ADMISSION_PRELIM_COMMENT_ENABLE; $this->admission_form = $this->render_template_as_string('course/enrolment/prelim'); } else { if (Request::get('admission_comment')) { $admission_comment = get_fullname() . ': ' . Request::get('admission_comment'); } else { $admission_comment = ''; } if ($course->addPreliminaryMember($user_id, $admission_comment)) { if ($course->isStudygroup()) { if (StudygroupModel::isInvited($user_id, $this->course_id)) { // an invitation exists, so accept the join request automatically $status = 'autor'; StudygroupModel::accept_user(get_username($user_id), $this->course_id); StudygroupModel::cancelInvitation(get_username($user_id), $this->course_id); $success = sprintf(_("Sie wurden in die Veranstaltung %s als %s eingetragen."), $course->getName(), get_title_for_status($status, 1)); PageLayout::postMessage(MessageBox::success($success)); } else { $success = sprintf(_("Sie wurden auf die Anmeldeliste der Studiengruppe %s eingetragen. Die Moderatoren der Studiengruppe können Sie jetzt freischalten."), $course->getName()); PageLayout::postMessage(MessageBox::success($success)); } } else { $success = sprintf(_("Sie wurden in die Veranstaltung %s vorläufig eingetragen."), $course->getName()); PageLayout::postMessage(MessageBox::success($success)); } } } } else { $status = 'autor'; if ($course->addMember($user_id, $status)) { $success = sprintf(_("Sie wurden in die Veranstaltung %s als %s eingetragen."), $course->getName(), get_title_for_status($status, 1)); PageLayout::postMessage(MessageBox::success($success)); $this->enrol_user = true; if (StudygroupModel::isInvited($user_id, $this->course_id)) { // delete an existing invitation StudygroupModel::cancelInvitation(get_username($user_id), $this->course_id); } } } unset($this->courseset_message); } StudipLock::release(); }
function change_course_set_action() { CSRFProtection::verifyUnsafeRequest(); if (Request::submitted('change_course_set_assign') && Request::get('course_set_assign') && !LockRules::Check($this->course_id, 'admission_type')) { $cs = new CourseSet(Request::option('course_set_assign')); if ($cs->isUserAllowedToAssignCourse($this->user_id, $this->course_id)) { CourseSet::addCourseToSet($cs->getId(), $this->course_id); $cs->load(); if (in_array($this->course_id, $cs->getCourses())) { PageLayout::postMessage(MessageBox::success(sprintf(_("Die Zuordnung zum Anmeldeset %s wurde durchgeführt."), htmlReady($cs->getName())))); } } } if (Request::submitted('change_course_set_unassign') && !LockRules::Check($this->course_id, 'admission_type')) { $this->response->add_header('X-Title', _('Anmelderegeln aufheben')); if ($this->course->getNumWaiting() && !Request::submitted('change_course_set_unassign_yes')) { $question = sprintf(_("In dieser Veranstaltung existiert eine Warteliste. Die bestehende Warteliste mit %s Einträgen wird gelöscht. Sind sie sicher?"), $this->course->getNumWaiting()); } $cs = CourseSet::getSetForCourse($this->course_id); if ($cs) { $priorities = AdmissionPriority::getPrioritiesByCourse($cs->getId(), $this->course_id); if (count($priorities) && !Request::submitted('change_course_set_unassign_yes')) { $question = sprintf(_("In dieser Veranstaltung existiert eine Anmeldeliste (Losverfahren am %s). Die bestehende Anmeldeliste mit %s Einträgen wird gelöscht. Sind sie sicher?"), strftime('%x %R', $cs->getSeatDistributionTime()), count($priorities)); } } if (!$question && $cs) { CourseSet::removeCourseFromSet($cs->getId(), $this->course_id); $cs->load(); if (!in_array($this->course_id, $cs->getCourses())) { PageLayout::postMessage(MessageBox::success(sprintf(_("Die Zuordnung zum Anmeldeset %s wurde aufgehoben."), htmlReady($cs->getName())))); } if (!count($cs->getCourses()) && $cs->isGlobal() && $cs->getUserid() != '') { $cs->delete(); } if ($this->course->getNumWaiting()) { $num_moved = 0; foreach ($this->course->admission_applicants->findBy('status', 'awaiting') as $applicant) { setTempLanguage($applicant->user_id); $message_body = sprintf(_('Die Warteliste der Veranstaltung **%s** wurde deaktiviert, Sie sind damit __nicht__ zugelassen worden.'), $this->course->name); $message_title = sprintf(_("Statusänderung %s"), $this->course->name); messaging::sendSystemMessage($applicant->user_id, $message_title, $message_body); restoreLanguage(); $num_moved += $applicant->delete(); } if ($num_moved) { PageLayout::postMessage(MessageBox::success(sprintf(_("%s Wartende wurden entfernt."), $num_moved))); } } } } if (!$question) { $this->redirect($this->url_for('/index')); } else { $this->request = array('change_course_set_unassign' => 1); $this->button_yes = 'change_course_set_unassign_yes'; PageLayout::postMessage(MessageBox::info($question)); $this->render_template('course/admission/_change_admission.php'); } }
function get_courses($seminare_condition) { global $perm, $user; list($institut_id, $all) = explode('_', $this->current_institut_id); // Prepare count statements $query = "SELECT count(*)\n FROM seminar_user\n WHERE seminar_id = ? AND status IN ('user', 'autor')"; $count0_statement = DBManager::get()->prepare($query); $query = "SELECT SUM(status = 'accepted') AS count2,\n SUM(status = 'awaiting') AS count3\n FROM admission_seminar_user\n WHERE seminar_id = ?\n GROUP BY seminar_id"; $count1_statement = DBManager::get()->prepare($query); $parameters = array(); $sql = "SELECT seminare.seminar_id,seminare.Name as course_name,seminare.VeranstaltungsNummer as course_number,\n admission_prelim, admission_turnout,seminar_courseset.set_id\n FROM seminar_courseset\n INNER JOIN courseset_rule csr ON csr.set_id=seminar_courseset.set_id AND csr.type='ParticipantRestrictedAdmission'\n INNER JOIN seminare ON seminar_courseset.seminar_id=seminare.seminar_id\n "; if ($institut_id == 'all' && $perm->have_perm('root')) { $sql .= "WHERE 1 {$seminare_condition} "; } elseif ($all == 'all') { $sql .= "INNER JOIN Institute USING (Institut_id)\n WHERE Institute.fakultaets_id = ? {$seminare_condition}\n "; $parameters[] = $institut_id; } else { $sql .= "WHERE seminare.Institut_id = ? {$seminare_condition}\n "; $parameters[] = $institut_id; } $sql .= "GROUP BY seminare.Seminar_id ORDER BY seminar_courseset.set_id, seminare.Name"; $statement = DBManager::get()->prepare($sql); $statement->execute($parameters); $csets = array(); $ret = array(); while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { $seminar_id = $row['seminar_id']; $ret[$seminar_id] = $row; $count0_statement->execute(array($seminar_id)); $count = $count0_statement->fetchColumn(); $ret[$seminar_id]['count_teilnehmer'] = $count; $count1_statement->execute(array($seminar_id)); $counts = $count1_statement->fetch(PDO::FETCH_ASSOC); $ret[$seminar_id]['count_prelim'] = (int) $counts['count2']; $ret[$seminar_id]['count_waiting'] = (int) $counts['count3']; if (!$csets[$row['set_id']]) { $csets[$row['set_id']] = new CourseSet($row['set_id']); } $cs = $csets[$row['set_id']]; $ret[$seminar_id]['cs_name'] = $cs->getName(); $ret[$seminar_id]['distribution_time'] = $cs->getSeatDistributionTime(); if ($ret[$seminar_id]['distribution_time'] < time() - 1000 && !$cs->hasAlgorithmRun()) { $this->not_distributed_coursesets[] = $cs->getName(); } if ($ta = $cs->getAdmissionRule('TimedAdmission')) { $ret[$seminar_id]['start_time'] = $ta->getStartTime(); $ret[$seminar_id]['end_time'] = $ta->getEndTime(); } if (!$cs->hasAlgorithmRun()) { $ret[$seminar_id]['count_claiming'] = count(AdmissionPriority::getPrioritiesByCourse($row['set_id'], $seminar_id)); } } return $ret; }
/** * @param string $sort_status * @param string $order_by * @return SimpleCollection */ function getAdmissionMembers($sort_status = 'autor', $order_by = 'nachname asc') { $cs = CourseSet::getSetForCourse($this->course_id); $claiming = array(); 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'] = $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,\n " . $GLOBALS['_fullname_sql']['full_rev'] . " as fullname\n FROM admission_seminar_user asu INNER JOIN auth_user_md5 USING(user_id)\n INNER JOIN user_info USING(user_id)\n WHERE seminar_id = ? ORDER BY position, nachname ASC"; $st = DBManager::get()->prepare($query); $st->execute(array($this->course_id)); $application_members = SimpleCollection::createFromArray(array_merge($claiming, $st->fetchAll(PDO::FETCH_ASSOC))); $filtered_members = array(); 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, strpos($order_by, 'nachname') === false ? SORT_NUMERIC : SORT_LOCALE_STRING); } } return $filtered_members; }
public static function getWaitingList($user_id) { $claiming = DBManager::get()->fetchAll("SELECT set_id, priorities.seminar_id,'claiming' as status, seminare.Name, seminare.Ort\n FROM priorities\n INNER JOIN seminare USING(seminar_id)\n WHERE user_id = ?", array($user_id)); $csets = array(); foreach ($claiming as $k => $claim) { if (!$csets[$claim['set_id']]) { $csets[$claim['set_id']] = new CourseSet($claim['set_id']); } $cs = $csets[$claim['set_id']]; if (!$cs->hasAlgorithmRun()) { $claiming[$k]['admission_endtime'] = $cs->getSeatDistributionTime(); $num_claiming = count(AdmissionPriority::getPrioritiesByCourse($claim['set_id'], $claim['seminar_id'])); $free = Course::find($claim['seminar_id'])->getFreeSeats(); if ($free <= 0) { $claiming[$k]['admission_chance'] = 0; } else { if ($free >= $num_claiming) { $claiming[$k]['admission_chance'] = 100; } else { $claiming[$k]['admission_chance'] = round($free / $num_claiming * 100); } } } else { unset($claiming[$k]); } } $stmt = DBManager::get()->prepare("SELECT admission_seminar_user.*, seminare.status as sem_status, " . "seminare.Name, seminare.Ort " . "FROM admission_seminar_user " . "INNER JOIN seminare USING(seminar_id) " . "WHERE user_id = ? " . "ORDER BY admission_seminar_user.status, name"); $stmt->execute(array($user_id)); $waitlists = array_merge($claiming, $stmt->fetchAll()); return $waitlists; }