/**
  * Deletes the admission rule and all associated data.
  */
 public function delete()
 {
     if ($this->prio_exists) {
         $set_id = DBManager::get()->fetchColumn("SELECT set_id FROM courseset_rule WHERE rule_id = ? LIMIT 1", array($this->id));
         //Delete priorities
         AdmissionPriority::unsetAllPriorities($set_id);
     }
     parent::delete();
     // Delete rule data.
     $stmt = DBManager::get()->prepare("DELETE FROM `participantrestrictedadmissions`\n            WHERE `rule_id`=?");
     $stmt->execute(array($this->id));
 }
Пример #2
0
 public static function removeCourseFromSet($set_id, $course_id)
 {
     $db = DBManager::get();
     $ok = $db->execute("DELETE FROM seminar_courseset WHERE set_id=? AND seminar_id=? LIMIT 1", array($set_id, $course_id));
     if ($ok) {
         StudipLog::log('SEM_CHANGED_ACCESS', $course_id, null, 'Entfernung von Anmeldeset', sprintf('Anmeldeset: %s', $set_id));
         //Delete priorities
         AdmissionPriority::unsetAllPrioritiesForCourse($course_id);
     }
     return $ok;
 }
Пример #3
0
 /**
  * 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;
     }
 }
Пример #4
0
/**
* 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);
}
Пример #5
0
/**
 * Insert a user into a seminar with optional log-message and contingent
 *
 * @param string   $seminar_id
 * @param string   $user_id
 * @param string   $status       status of user in the seminar (user, autor, tutor, dozent)
 * @param boolean  $copy_studycourse  if true, the studycourse is copied from admission_seminar_user
 *                                    to seminar_user. Overrides the $contingent-parameter
 * @param string   $contingent   optional studiengang_id, if no id is given, no contingent is considered
 * @param string   $log_message  optional log-message. if no log-message is given a default one is used
 * @return void
 */
function insert_seminar_user($seminar_id, $user_id, $status, $copy_studycourse = false, $contingent = false, $log_message = false) {
    // get the seminar-object
    $sem = Seminar::GetInstance($seminar_id);

    $admission_status = '';
    $admission_comment = '';
    $mkdate = time();

    $stmt = DBManager::get()->prepare("SELECT * FROM admission_seminar_user
            WHERE seminar_id = ? AND user_id = ?");
    $stmt->execute(array($seminar_id, $user_id));
    if ($data = $stmt->fetch(PDO::FETCH_ASSOC)) {
        // copy the studycourse from admission_seminar_user
        if ($copy_studycourse && $data['studiengang_id']) {
            $contingent = $data['studiengang_id'];
        }
        $admission_status = $data['status'];
        $admission_comment = ($data['comment'] == NULL) ? '' : $data['comment'];
        $mkdate = $data['mkdate'];
    }

    // check if there are places left in the submitted contingent (if any)
    //ignore if preliminary
    if ($admission_status != 'accepted' && $contingent && $sem->isAdmissionEnabled() && !$sem->getFreeAdmissionSeats($contingent)) {
        return false;
    }

    // get coloured group as used on meine_seminare
    $colour_group = $sem->getDefaultGroup();

    // LOGGING
    // if no log message is submitted use a default one
    if (!$log_message) {
        $log_message = 'Wurde in die Veranstaltung eingetragen, admission_status: '. $admission_status . ' Kontingent: ' . $contingent;
    }
    log_event('SEM_USER_ADD', $seminar_id, $user_id, $status, $log_message);

    // actually insert the user into the seminar
    $stmt = DBManager::get()->prepare('INSERT IGNORE INTO seminar_user
        (Seminar_id, user_id, status, comment, gruppe, mkdate)
        VALUES (?, ?, ?, ?, ?, ?)');
    $stmt->execute(array($seminar_id, $user_id, $status, $admission_comment, $colour_group, $mkdate));

    NotificationCenter::postNotification('UserDidEnterCourse', $seminar_id, $user_id);

    if ($admission_status) {
        // 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, $seminar_id));

        //renumber the waiting/accepted/lot list, a user was deleted from it
        renumber_admission($seminar_id);
    }
    $cs = $sem->getCourseSet();
    if ($cs) {
        $prio_delete = AdmissionPriority::unsetPriority($cs->getId(), $user_id, $sem->getId());
    }

    removeScheduleEntriesMarkedAsVirtual($user_id, $seminar_id);

    // reload the seminar, the contingents have changed
    $sem->restore();

    return true;
}
Пример #6
0
 /**
  * adds user with given id as preliminary member to course
  *
  * @param string $user_id
  * @return integer 1 if successfull
  */
 public function addPreliminaryMember($user_id, $comment = '')
 {
     $new_admission_member = new AdmissionApplication();
     $new_admission_member->user_id = $user_id;
     $new_admission_member->position = 0;
     $new_admission_member->status = 'accepted';
     $new_admission_member->comment = $comment;
     $this->course->admission_applicants[] = $new_admission_member;
     $ok = $new_admission_member->store();
     if ($ok && $this->isStudygroup()) {
         StudygroupModel::applicationNotice($this->getId(), $user_id);
     }
     $cs = $this->getCourseSet();
     if ($cs) {
         $prio_delete = AdmissionPriority::unsetPriority($cs->getId(), $user_id, $this->getId());
     }
     // LOGGING
     StudipLog::log('SEM_USER_ADD', $this->getId(), $user_id, 'accepted', 'Vorläufig akzeptiert');
     return $ok;
 }
Пример #7
0
 /**
  * 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);
 }
Пример #8
0
 /**
  * Distribute seats for several courses in a course set using the given
  * user priorities.
  *
  * @param CourseSet $courseSet The course set containing the courses
  * that seats shall be distributed for.
  * @see CourseSet
  */
 private function distributeByPriorities($courseSet)
 {
     Log::DEBUG('start seat distribution for course set: ' . $courseSet->getId());
     $limited_admission = $courseSet->getAdmissionRule('LimitedAdmission');
     //all users with their priorities
     $claiming_users = AdmissionPriority::getPriorities($courseSet->getId());
     //all users which have bonus/malus
     $factored_users = $courseSet->getUserFactorList();
     //all users with their max number of courses
     $max_seats_users = array_combine(array_keys($claiming_users), array_map(function ($u) use($limited_admission) {
         return $limited_admission->getMaxNumberForUser($u);
     }, array_keys($claiming_users)));
     //unlucky users get a bonus for the next round
     $bonus_users = array();
     //users / courses für later waitlist distribution
     $waiting_users = array();
     //number of already distributed seats for users
     $distributed_users = array();
     $prio_mapper = function ($users, $course_id) use($claiming_users) {
         $mapper = function ($u) use($course_id) {
             return isset($u[$course_id]) ? $u[$course_id] : null;
         };
         return array_filter(array_map($mapper, array_intersect_key($claiming_users, array_flip($users))));
     };
     //sort courses by highest count of prio 1 applicants
     $stats = AdmissionPriority::getPrioritiesStats($courseSet->getId());
     $courses = array_map(function ($a) {
         return $a['h'];
     }, $stats);
     arsort($courses, SORT_NUMERIC);
     $max_prio = AdmissionPriority::getPrioritiesMax($courseSet->getId());
     //count already manually distributed places
     $distributed_users = $this->countParticipatingUsers(array_keys($courses), array_keys($claiming_users));
     Log::DEBUG('already distributed users: ' . print_r($distributed_users, 1));
     //walk through all prios with all courses
     foreach (range(1, $max_prio) as $current_prio) {
         foreach (array_keys($courses) as $course_id) {
             $current_claiming = array();
             $course = Course::find($course_id);
             $free_seats = $course->getFreeSeats();
             //find users with current prio for this course, if they still need a place
             foreach ($claiming_users as $user_id => $prio_courses) {
                 if ($prio_courses[$course_id] == $current_prio && $distributed_users[$user_id] < $max_seats_users[$user_id]) {
                     //exclude participants
                     if (!$course->getParticipantStatus($user_id)) {
                         $current_claiming[$user_id] = 1;
                         if (isset($factored_users[$user_id])) {
                             $current_claiming[$user_id] *= $factored_users[$user_id];
                         }
                     } else {
                         Log::DEBUG(sprintf('user %s is already %s in course %s, ignoring', $user_id, $course->getParticipantStatus($user_id), $course->id));
                     }
                 }
             }
             //give maximum bonus to users which were unlucky before
             foreach (array_keys($current_claiming) as $user_id) {
                 if ($bonus_users[$user_id] > 0) {
                     $current_claiming[$user_id] = $bonus_users[$user_id] * count($current_claiming) + 1;
                     $bonus_users[$user_id]--;
                 }
             }
             Log::DEBUG(sprintf('distribute %s seats on %s claiming with prio %s in course %s', $free_seats, count($current_claiming), $current_prio, $course->id));
             Log::DEBUG('users to distribute: ' . print_r($current_claiming, 1));
             $current_claiming = $this->rollTheDice($current_claiming);
             Log::DEBUG('the die is cast: ' . print_r($current_claiming, 1));
             $chosen_ones = array_slice(array_keys($current_claiming), 0, $free_seats);
             Log::DEBUG('chosen ones: ' . print_r($chosen_ones, 1));
             $this->addUsersToCourse($chosen_ones, $course, $prio_mapper($chosen_ones, $course->id));
             foreach ($chosen_ones as $one) {
                 $distributed_users[$one]++;
             }
             if ($free_seats < count($current_claiming)) {
                 $remaining_ones = array_slice(array_keys($current_claiming), $free_seats);
                 foreach ($remaining_ones as $one) {
                     $bonus_users[$one]++;
                     $waiting_users[$current_prio][$course_id][] = $one;
                 }
             }
         }
     }
     //distribute to waitlists if applicable
     Log::DEBUG('waiting list: ' . print_r($waiting_users, 1));
     foreach ($waiting_users as $current_prio => $current_prio_waiting_courses) {
         foreach ($current_prio_waiting_courses as $course_id => $users) {
             $users = array_filter($users, function ($user_id) use($distributed_users, $max_seats_users) {
                 return $distributed_users[$user_id] < $max_seats_users[$user_id];
             });
             $course = Course::find($course_id);
             Log::DEBUG(sprintf('distribute waitlist of %s with prio %s in course %s', count($users), $current_prio, $course->id));
             if (!$course->admission_disable_waitlist) {
                 if ($course->admission_waitlist_max) {
                     $free_seats_waitlist = $course->admission_waitlist_max - $course->getNumWaiting();
                     $free_seats_waitlist = $free_seats_waitlist < 0 ? 0 : $free_seats_waitlist;
                 } else {
                     $free_seats_waitlist = count($users);
                 }
                 $waiting_list_ones = array_slice($users, 0, $free_seats_waitlist);
                 Log::DEBUG('waiting list ones: ' . print_r($waiting_list_ones, 1));
                 $this->addUsersToWaitlist($waiting_list_ones, $course, $prio_mapper($waiting_list_ones, $course->id));
                 foreach ($waiting_list_ones as $one) {
                     $distributed_users[$one]++;
                 }
             } else {
                 $free_seats_waitlist = 0;
             }
             if ($free_seats_waitlist < count($users)) {
                 $remaining_ones = array_slice($users, $free_seats_waitlist);
                 Log::DEBUG('remaining ones: ' . print_r($remaining_ones, 1));
                 $this->notifyRemainingUsers($remaining_ones, $course, $prio_mapper($remaining_ones, $course->id));
             }
         }
     }
 }
Пример #9
0
 /**
  * Prioritize courses.
  */
 function claim_action()
 {
     CSRFProtection::verifyUnsafeRequest();
     $user_id = $GLOBALS['user']->id;
     $courseset = CourseSet::getSetForCourse($this->course_id);
     if ($courseset->isSeatDistributionEnabled() && !count($courseset->checkAdmission($user_id, $this->course_id))) {
         if ($limit = $courseset->getAdmissionRule('LimitedAdmission')) {
             $admission_user_limit = Request::int('admission_user_limit');
             if ($admission_user_limit && $admission_user_limit <= $limit->getMaxNumber()) {
                 $limit->setCustomMaxNumber($user_id, $admission_user_limit);
             }
             $admission_prio = Request::getArray('admission_prio');
             $max_prio = max($admission_prio);
             $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::postMessage(MessageBox::info(_("Sie dürfen jede Priorität nur einmal auswählen. Überprüfen Sie bitte Ihre Auswahl!")));
             }
             $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];
                 $change_with = array_search($prio_to_move - 1, $admission_prio);
                 $admission_prio[$order_up] = $prio_to_move - 1;
                 $admission_prio[$change_with] = $prio_to_move;
             }
             if ($order_down = key(Request::getArray('admission_prio_order_down'))) {
                 $prio_to_move = $admission_prio[$order_down];
                 $change_with = array_search($prio_to_move + 1, $admission_prio);
                 $admission_prio[$order_down] = $prio_to_move + 1;
                 $admission_prio[$change_with] = $prio_to_move;
             }
             if ($delete = key(Request::getArray('admission_prio_delete'))) {
                 unset($admission_prio[$delete]);
                 $changed = 1;
                 $admission_prio = array_map(function ($a) {
                     static $c = 1;
                     return $c++;
                 }, $admission_prio);
             }
             foreach ($admission_prio as $course_id => $p) {
                 $changed += AdmissionPriority::setPriority($courseset->getId(), $user_id, $course_id, $p);
             }
             if ($changed || $old_prio_count && !count($admission_prio)) {
                 if (count(AdmissionPriority::getPrioritiesByUser($courseset->getId(), $user_id))) {
                     PageLayout::postMessage(MessageBox::success(_("Ihre Priorisierung wurde gespeichert.")));
                 } else {
                     PageLayout::postMessage(MessageBox::success(_("Ihre Anmeldung zur Platzvergabe wurde zurückgezogen.")));
                 }
             }
         } else {
             if (Request::int('courseset_claimed')) {
                 if (AdmissionPriority::setPriority($courseset->getId(), $user_id, $this->course_id, 1)) {
                     PageLayout::postMessage(MessageBox::success(_("Ihre Anmeldung zur Platzvergabe wurde gespeichert.")));
                 }
             } else {
                 if (AdmissionPriority::unsetPriority($courseset->getId(), $user_id, $this->course_id)) {
                     PageLayout::postMessage(MessageBox::success(_("Ihre Anmeldung zur Platzvergabe wurde zurückgezogen.")));
                 }
             }
         }
     }
     $this->redirect($this->url_for('/apply/' . $this->course_id));
 }
Пример #10
0
 public function applicants_message_action($set_id)
 {
     $courseset = new CourseSet($set_id);
     $applicants = AdmissionPriority::getPriorities($set_id);
     $_SESSION['sms_data'] = array();
     $_SESSION['sms_data']['p_rec'] = User::findAndMapMany(function ($u) {
         return $u->username;
     }, array_unique(array_keys($applicants)));
     $this->redirect(URLHelper::getURL('dispatch.php/messages/write', array('default_subject' => _("Anmeldung:") . ' ' . $courseset->getName(), 'emailrequest' => 1)));
 }
Пример #11
0
 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');
     }
 }
Пример #12
0
 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;
 }
Пример #13
0
 /**
  * @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;
 }
Пример #14
0
 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;
 }
Пример #15
0
 public function execute($last_result, $parameters = array())
 {
     $verbose = $parameters['verbose'];
     $sets = DbManager::get()->fetchFirst("SELECT DISTINCT cr.set_id FROM courseset_rule cr INNER JOIN coursesets USING(set_id)\n                          WHERE type = 'ParticipantRestrictedAdmission' AND algorithm_run = 0");
     if (count($sets)) {
         if ($verbose) {
             echo date('r') . ' - Starting seat distribution ' . chr(10);
             $old_logger = Log::get()->getHandler();
             $old_log_level = Log::get()->getLogLevel();
             @mkdir($GLOBALS['TMP_PATH'] . '/seat_distribution_logs');
             $logfile = $GLOBALS['TMP_PATH'] . '/seat_distribution_logs/' . date('Y-m-d-H-i') . '_seat_distribution.log';
             if (is_dir($GLOBALS['TMP_PATH'] . '/seat_distribution_logs')) {
                 Log::get()->setHandler($logfile);
                 Log::get()->setLogLevel(Log::DEBUG);
                 echo 'logging to ' . $logfile . chr(10);
             } else {
                 echo 'could not create directory ' . $GLOBALS['TMP_PATH'] . '/seat_distribution_logs' . chr(10);
             }
         }
         foreach ($sets as $set_id) {
             $courseset = new CourseSet($set_id);
             if ($courseset->isSeatDistributionEnabled() && !$courseset->hasAlgorithmRun() && $courseset->getSeatDistributionTime() < time()) {
                 if ($verbose) {
                     echo ++$i . ' ' . $courseset->getId() . ' : ' . $courseset->getName() . chr(10);
                     $applicants = AdmissionPriority::getPriorities($set_id);
                     $courses = SimpleCollection::createFromArray(Course::findMany($courseset->getCourses()))->toGroupedArray('seminar_id', words('name veranstaltungsnummer'));
                     $captions = array(_("Nachname"), _("Vorname"), _("Nutzername"), _('Nutzer-ID'), _('Veranstaltung-ID'), _("Veranstaltung"), _("Nummer"), _("Priorität"));
                     $data = array();
                     $users = User::findEachMany(function ($user) use($courses, $applicants, &$data) {
                         $app_courses = $applicants[$user->id];
                         asort($app_courses);
                         foreach ($app_courses as $course_id => $prio) {
                             $row = array();
                             $row[] = $user->nachname;
                             $row[] = $user->vorname;
                             $row[] = $user->username;
                             $row[] = $user->id;
                             $row[] = $course_id;
                             $row[] = $courses[$course_id]['name'];
                             $row[] = $courses[$course_id]['veranstaltungsnummer'];
                             $row[] = $prio;
                             $data[] = $row;
                         }
                     }, array_keys($applicants), 'ORDER BY Nachname');
                     $applicants_file = $GLOBALS['TMP_PATH'] . '/seat_distribution_logs/applicants_' . $set_id . '.csv';
                     if (array_to_csv($data, $applicants_file, $captions)) {
                         echo 'applicants written to ' . $applicants_file . chr(10);
                     }
                 }
                 $courseset->distributeSeats();
             }
         }
         if ($verbose) {
             Log::get()->setHandler($old_logger);
             Log::get()->setLogLevel($old_log_level);
         }
     } else {
         if ($verbose) {
             echo date('r') . ' - Nothing to do' . chr(10);
         }
     }
 }