/** * create xml_header * * This function creates a xml-header for output. * Its contents are Name of University, Stud.IP-Version, Range of Export (e.g. "root"), and temporal range. * * @access public * @return string xml-header */ function xml_header() { global $UNI_NAME_CLEAN, $SOFTWARE_VERSION, $ex_type, $ex_sem, $range_name, $range_id; $semester = $ex_sem ? Semester::find($ex_sem) : Semester::findCurrent(); $xml_tag_string = "<" . "?xml version=\"1.0\" encoding=\"utf-8\"?>\n"; $xml_tag_string .= "<studip version=\"" . xml_escape ($SOFTWARE_VERSION) . "\" logo=\"". xml_escape (Assets::image_path('logos/logo2b.png')) . "\""; if ($range_id == "root") $xml_tag_string .= " range=\"" . _("Alle Einrichtungen") . "\""; elseif ($range_name != "") $xml_tag_string .= " range=\"" . xml_escape ($range_name) . "\""; if ($UNI_NAME_CLEAN != "") $xml_tag_string .= " uni=\"" . xml_escape ($UNI_NAME_CLEAN) . "\""; if ($semester) $xml_tag_string .= " zeitraum=\"" . xml_escape ($semester->name) . "\" semester_id=\"" . xml_escape ($semester->getId()) . "\""; $xml_tag_string .= ">\n"; return $xml_tag_string; }
/** * Populates and renders the widget according to the previously made * settings. */ public function render($variables = array()) { $current_id = Request::get($this->template_variables['name']); if (!$current_id && !$this->include_all) { $current_id = Semester::findCurrent()->id; } if ($this->include_all) { $element = new SelectElement(0, _('Alle Semester'), !$current_id); $this->addElement($element); } $semesters = array_reverse(Semester::getAll()); foreach ($semesters as $semester) { $element = new SelectElement($semester->id, $semester->name, $current_id && $semester->id == $current_id); $this->addElement($element); } return parent::render($variables); }
function AssignEventList($begin = 0, $end = 0, $resource_id='', $range_id='', $user_id='', $sort = TRUE, $filter = FALSE, $day_of_week = false){ global $RELATIVE_PATH_RESOURCES, $user; $semester = Semester::findCurrent(); if (!$begin) $begin = $semester->beginn; if (!$end ) $end = $semester->ende; $this->dow = $day_of_week; $this->begin = $begin; $this->end = $end; $this->filter = $filter; $this->resource_id = $resource_id; $this->range_id = $range_id; $this->user_id = $user_id; $this->restore(); if($sort) $this->sort(); }
public function map($format, $value) { switch ($format) { case "name": $semester = Semester::findOneByName($value); return $semester ? $semester['beginn'] : null; break; case "timestamp": if (!is_numeric($value)) { $value = strtotime($value); } $semester = Semester::findByTimestamp($value); return $semester ? $semester['beginn'] : null; break; case "current": $semester = Semester::findCurrent(); return $semester ? $semester['beginn'] : null; case "next": $semester = Semester::findCurrent(); return $semester ? $semester['beginn'] : null; } }
/** * Fetches courses at the given institutes. * @param Array $instituteIds IDs of institutes to check * @param String $coursesetId Get also courses assigned to the given courseset * @param Array $selectedCourses Courses that have already been selected manually * @param String $semester_id Get only courses belonging to the given semester * @param mixed $filter Fetch only courses fulfilling a search string or of a certain lecturer? * * @return Array Found courses. */ public function getInstCourses($instituteIds, $coursesetId = '', $selectedCourses = array(), $semester_id = null, $filter = false) { // Get semester dates for course sorting. $currentSemester = $semester_id ? Semester::find($semester_id) : Semester::findCurrent(); $db = DBManager::get(); $courses = array(); if ($filter === true) { $query = "SELECT su.`Seminar_id` FROM `seminar_user` su\n INNER JOIN `seminare` s USING(`Seminar_id`)\n WHERE s.status NOT IN(?) AND s.`start_time` <= ? AND (? <= (s.`start_time` + s.`duration_time`) OR s.`duration_time` = -1)\n AND su.`user_id`=?"; $parameters = array(studygroup_sem_types(), $currentSemester->beginn, $currentSemester->beginn, $GLOBALS['user']->id); if (get_config('DEPUTIES_ENABLE')) { $query .= " UNION SELECT s.`Seminar_id` FROM `seminare` s\n INNER JOIN `deputies` d ON (s.`Seminar_id`=d.`range_id`)\n WHERE s.`start_time` <= ? AND (? <= (s.`start_time` + s.`duration_time`) OR s.`duration_time` = -1)\n AND d.`user_id`=?"; $parameters = array_merge($parameters, array($currentSemester->beginn, $currentSemester->beginn, $GLOBALS['user']->id)); } $courses = $db->fetchFirst($query, $parameters); } elseif (strlen($filter) > 1) { $courses = $db->fetchFirst("SELECT DISTINCT s.seminar_id FROM seminare s\n INNER JOIN seminar_user su ON s.seminar_id=su.seminar_id AND su.status='dozent'\n INNER JOIN auth_user_md5 aum USING(user_id)\n WHERE s.status NOT IN(:studygroup_types) AND s.start_time <= :sembegin AND (:sembegin <= (s.start_time + s.duration_time) OR s.duration_time = -1)\n AND s.Institut_id IN(:institutes)\n AND (s.name LIKE :filter OR s.Veranstaltungsnummer LIKE :filter OR Nachname LIKE :filter)", array('studygroup_types' => studygroup_sem_types() ? studygroup_sem_types() : array(''), 'sembegin' => $currentSemester->beginn, 'institutes' => $instituteIds, 'filter' => '%' . $filter . '%')); } //filter courses from other sets out if (count($courses)) { $found = DBManager::get()->fetchFirst("SELECT DISTINCT seminar_id FROM seminar_courseset\n LEFT JOIN courseset_rule USING(set_id)\n WHERE type NOT IN ('LockedAdmission','PasswordAdmission')\n AND seminar_id IN(?)", array($courses)); $courses = array_diff($courses, $found); } if ($coursesetId) { $courses = array_merge($courses, $db->fetchFirst("SELECT seminar_id FROM seminar_courseset sc\n WHERE set_id = ?", array($coursesetId))); } if ($selectedCourses) { $courses = array_merge($courses, $selectedCourses); } $data = array(); $callable = function ($course) use(&$data, $coursesetId) { $data[$course->id] = array('seminar_id' => $course->Seminar_id, 'VeranstaltungsNummer' => $course->VeranstaltungsNummer, 'Name' => $course->Name . ($course->duration_time == -1 ? ' ' . _('(unbegrenzt)') : ''), 'admission_turnout' => $course->admission_turnout, 'visible' => $course->visible); $data[$course->id]['admission_type'] = DBManager::get()->fetchColumn("SELECT type FROM seminar_courseset\n INNER JOIN courseset_rule USING (set_id)\n WHERE type IN ('LockedAdmission','PasswordAdmission')\n AND seminar_id = ? " . ($coursesetId ? "AND set_id <> ?" : ""), $coursesetId ? array($course->id, $coursesetId) : array($course->id)); }; Course::findEachMany($callable, array_unique($courses), "ORDER BY start_time DESC, VeranstaltungsNummer ASC, Name ASC"); return $data; }
/** * Creates an array with all seminars * * @return array */ function getDozentSeminars() { $semester = $courses = array(); $semester[] = Semester::findNext(); $semester[] = Semester::findCurrent(); $semester[] = Semester::findByTimestamp(Semester::findCurrent()->beginn - 1); if (Config::get()->IMPORTANT_SEMNUMBER) { $field = 'veranstaltungsnummer'; } else { $field = 'name'; } $allcourses = new SimpleCollection(Course::findBySQL("INNER JOIN seminar_user USING(Seminar_id) WHERE user_id=? AND seminar_user.status='dozent' AND seminare.visible=1", array($this->current_user->id))); foreach (array_filter($semester) as $one) { $courses[$one->name] = $allcourses->filter(function ($c) use($one) { return $c->start_time <= $one->beginn && ($one->beginn <= $c->start_time + $c->duration_time || $c->duration_time == -1); })->orderBy($field); if (!$courses[$one->name]->count()) { unset($courses[$one->name]); } } return $courses; }
function up() { $db = DBManager::get(); // assign conditions to admission rules $db->exec("CREATE TABLE IF NOT EXISTS `admission_condition` (\n `rule_id` VARCHAR(32) NOT NULL ,\n `filter_id` VARCHAR(32) NOT NULL ,\n `mkdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`rule_id`, `filter_id`) )\n ENGINE = MyISAM"); // "chance adjustment" in seat distribution $db->exec("CREATE TABLE IF NOT EXISTS `admissionfactor` (\n `list_id` VARCHAR(32) NOT NULL ,\n `name` VARCHAR(255) NOT NULL ,\n `factor` DECIMAL(5,2) NOT NULL DEFAULT 1,\n `owner_id` VARCHAR(32) NOT NULL ,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`list_id`) )\n ENGINE = MyISAM"); // available admission rules. $db->exec("CREATE TABLE IF NOT EXISTS `admissionrules` (\n `id` int(11) NOT NULL AUTO_INCREMENT,\n `ruletype` VARCHAR(255) UNIQUE NOT NULL,\n `active` TINYINT(1) NOT NULL DEFAULT 0,\n `mkdate` INT(11) NOT NULL DEFAULT 0,\n PRIMARY KEY (`id`)\n ) ENGINE = MyISAM"); // Create entries for default admission rule types. $db->exec("INSERT IGNORE INTO `admissionrules`\n (`ruletype`, `active`, `mkdate`) VALUES\n ('ConditionalAdmission', 1, UNIX_TIMESTAMP()),\n ('LimitedAdmission', 1, UNIX_TIMESTAMP()),\n ('LockedAdmission', 1, UNIX_TIMESTAMP()),\n ('PasswordAdmission', 1, UNIX_TIMESTAMP()),\n ('TimedAdmission', 1, UNIX_TIMESTAMP()),\n ('ParticipantRestrictedAdmission', 1, UNIX_TIMESTAMP());"); // Admission rules can be available globally or only at selected institutes. $db->exec("CREATE TABLE IF NOT EXISTS `admissionrule_inst` (\n `rule_id` VARCHAR(32) NOT NULL,\n `institute_id` VARCHAR(32) NOT NULL,\n `mkdate` INT(11) NOT NULL DEFAULT 0,\n PRIMARY KEY (`rule_id`, `institute_id`)\n ) ENGINE = MyISAM"); // admission rules specifying conditions for access $db->exec("CREATE TABLE IF NOT EXISTS `conditionaladmissions` (\n `rule_id` VARCHAR(32) NOT NULL ,\n `message` TEXT NULL ,\n `start_time` INT NOT NULL DEFAULT 0,\n `end_time` INT NOT NULL DEFAULT 0,\n `mkdate` INT NOT NULL DEFAULT 0,\n `conditions_stopped` TINYINT(1) NOT NULL DEFAULT 0 ,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`rule_id`) )\n ENGINE = MyISAM"); // assign course sets to factor lists $db->exec("CREATE TABLE IF NOT EXISTS `courseset_factorlist` (\n `set_id` VARCHAR(32) NOT NULL ,\n `factorlist_id` VARCHAR(32) NOT NULL ,\n `mkdate` INT NOT NULL DEFAULT 0 ,\n PRIMARY KEY (`set_id`, `factorlist_id`) )\n ENGINE = MyISAM"); // assign course sets to institutes $db->exec("CREATE TABLE IF NOT EXISTS `courseset_institute` (\n `set_id` VARCHAR(32) NOT NULL ,\n `institute_id` VARCHAR(32) NOT NULL ,\n `mkdate` INT NULL ,\n `chdate` INT NULL ,\n PRIMARY KEY (`set_id`, `institute_id`),\n INDEX `institute_id` (`institute_id`,`set_id`))\n ENGINE = MyISAM"); // assign admission rules to course sets $db->exec("CREATE TABLE IF NOT EXISTS `courseset_rule` (\n `set_id` VARCHAR(32) NOT NULL ,\n `rule_id` VARCHAR(32) NOT NULL ,\n `type` VARCHAR(255) NULL ,\n `mkdate` INT NULL ,\n PRIMARY KEY (`set_id`, `rule_id`),\n INDEX `type` (`type`,`set_id`))\n ENGINE = MyISAM"); // sets of courses with common admission rules $db->exec("CREATE TABLE IF NOT EXISTS `coursesets` (\n `set_id` VARCHAR(32) NOT NULL ,\n `user_id` VARCHAR(32) NOT NULL ,\n `name` VARCHAR(255) NOT NULL ,\n `infotext` TEXT NOT NULL ,\n `algorithm` VARCHAR(255) NOT NULL ,\n `algorithm_run` TINYINT(1) NOT NULL DEFAULT 0 ,\n `private` TINYINT(1) NOT NULL DEFAULT 0,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`set_id`) ,\n INDEX `set_user` (`user_id`, `set_id`) )\n ENGINE = MyISAM"); // admission rules with max number of courses to register for $db->exec("CREATE TABLE IF NOT EXISTS `limitedadmissions` (\n `rule_id` VARCHAR(32) NOT NULL ,\n `message` TEXT NOT NULL ,\n `start_time` INT NOT NULL DEFAULT 0,\n `end_time` INT NOT NULL DEFAULT 0,\n `maxnumber` INT NOT NULL DEFAULT 0,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`rule_id`) )\n ENGINE = MyISAM"); // admission rules that completely lock access to courses $db->exec("CREATE TABLE IF NOT EXISTS `lockedadmissions` (\n `rule_id` VARCHAR(32) NOT NULL ,\n `message` TEXT NOT NULL ,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`rule_id`) )\n ENGINE = MyISAM"); // admission rules that specify a password for course access $db->exec("CREATE TABLE IF NOT EXISTS `passwordadmissions` (\n `rule_id` VARCHAR(32) NOT NULL ,\n `message` TEXT NULL ,\n `start_time` INT NOT NULL DEFAULT 0,\n `end_time` INT NOT NULL DEFAULT 0,\n `password` VARCHAR(255) NULL ,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`rule_id`) )\n ENGINE = MyISAM"); // priorities for course assignment $db->exec("CREATE TABLE IF NOT EXISTS `priorities` (\n `user_id` VARCHAR(32) NOT NULL ,\n `set_id` VARCHAR(32) NOT NULL ,\n `seminar_id` VARCHAR(32) NOT NULL ,\n `priority` INT NOT NULL DEFAULT 0,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`user_id`, `set_id`, `seminar_id`) ,\n INDEX `user_rule_priority` (`user_id` ASC, `priority` ASC, `set_id` ASC) )\n ENGINE = MyISAM"); // assign courses to course sets $db->exec("CREATE TABLE IF NOT EXISTS `seminar_courseset` (\n `set_id` VARCHAR(32) NOT NULL ,\n `seminar_id` VARCHAR(32) NOT NULL ,\n `mkdate` INT NOT NULL DEFAULT 0 ,\n PRIMARY KEY (`set_id`, `seminar_id`),\n INDEX `seminar_id` (`seminar_id`, `set_id` ) )\n ENGINE = MyISAM"); // admission rules concerning time $db->exec("CREATE TABLE IF NOT EXISTS `timedadmissions` (\n `rule_id` VARCHAR(32) NOT NULL ,\n `message` TEXT NOT NULL ,\n `start_time` INT NOT NULL DEFAULT 0,\n `end_time` INT NOT NULL DEFAULT 0,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`rule_id`) ,\n INDEX `start_time` (`start_time` ASC) ,\n INDEX `end_time` (`end_time` ASC) ,\n INDEX `start_end` (`start_time` ASC, `end_time` ASC) )\n ENGINE = MyISAM"); $db->exec("CREATE TABLE IF NOT EXISTS `participantrestrictedadmissions` (\n `rule_id` varchar(32),\n `message` text NOT NULL,\n `distribution_time` int(11) NOT NULL DEFAULT 0,\n `mkdate` int(11) NOT NULL DEFAULT 0,\n `chdate` int(11) NOT NULL DEFAULT 0,\n PRIMARY KEY (`rule_id`)\n ) ENGINE=MyISAM"); // assign users to lists with different factor in seat distribution $db->exec("CREATE TABLE IF NOT EXISTS `user_factorlist` (\n `list_id` VARCHAR(32) NULL ,\n `user_id` VARCHAR(32) NULL ,\n `mkdate` INT NULL ,\n PRIMARY KEY (`list_id`, `user_id`) )\n ENGINE = MyISAM"); // filters for users $db->exec("CREATE TABLE IF NOT EXISTS `userfilter` (\n `filter_id` VARCHAR(32) NOT NULL ,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`filter_id`) )\n ENGINE = MyISAM"); // several fields form a user filter $db->exec("CREATE TABLE IF NOT EXISTS `userfilter_fields` (\n `field_id` VARCHAR(32) NOT NULL ,\n `filter_id` VARCHAR(32) NOT NULL ,\n `type` VARCHAR(255) NOT NULL ,\n `value` VARCHAR(255) NOT NULL ,\n `compare_op` VARCHAR(255) NOT NULL ,\n `mkdate` INT NOT NULL DEFAULT 0,\n `chdate` INT NOT NULL DEFAULT 0,\n PRIMARY KEY (`field_id`) )\n ENGINE = MyISAM"); // user defined max number of courses to register for $db->exec("CREATE TABLE IF NOT EXISTS `userlimits` (\n `rule_id` VARCHAR(32) NOT NULL ,\n `user_id` VARCHAR(32) NOT NULL ,\n `maxnumber` INT NULL ,\n `mkdate` INT NULL ,\n `chdate` INT NULL ,\n PRIMARY KEY (`rule_id`, `user_id`) )\n ENGINE = MyISAM"); $cs_insert = $db->prepare("INSERT INTO coursesets (set_id,user_id,name,infotext,algorithm,private,mkdate,chdate)\n VALUES (?,?,?,?,'',?,?,?)"); $cs_i_insert = $db->prepare("INSERT INTO courseset_institute (set_id,institute_id,mkdate,chdate) VALUES (?,?,UNIX_TIMESTAMP(),UNIX_TIMESTAMP())"); $cs_r_insert = $db->prepare("INSERT INTO courseset_rule (set_id,rule_id,type,mkdate) VALUES (?,?,?,UNIX_TIMESTAMP())"); $s_cs_insert = $db->prepare("INSERT INTO seminar_courseset (set_id,seminar_id,mkdate) VALUES (?,?,UNIX_TIMESTAMP())"); $password_insert = $db->prepare("INSERT INTO passwordadmissions (rule_id,message,password,mkdate,chdate) VALUES (?,'Das Passwort ist falsch',?,UNIX_TIMESTAMP(),UNIX_TIMESTAMP())"); $locked_insert = $db->prepare("INSERT INTO lockedadmissions (rule_id,message,mkdate,chdate) VALUES (?,'Die Anmeldung ist gesperrt',UNIX_TIMESTAMP(),UNIX_TIMESTAMP())"); $hasher = new PasswordHash(8, false); $user_id = $GLOBALS['user']->id; //mit pw wandeln $pw_admission = $db->fetchAll("SELECT seminar_id, name, passwort, institut_id, chdate FROM seminare WHERE admission_type = 0 AND Lesezugriff = 2"); foreach ($pw_admission as $course) { $new_pwd = $hasher->HashPassword($course['passwort']); $rule_id = md5(uniqid('passwordadmissions', 1)); $password_insert->execute(array($rule_id, $new_pwd)); $set_id = md5(uniqid('coursesets', 1)); $name = 'Anmeldung mit Passwort: ' . $course['name']; $info = 'Erzeugt durch Migration 128 ' . strftime('%X %x'); $cs_insert->execute(array($set_id, $user_id, $name, $info, 1, $course['chdate'], $course['chdate'])); $cs_r_insert->execute(array($set_id, $rule_id, 'PasswordAdmission')); $s_cs_insert->execute(array($set_id, $course['seminar_id'])); } //ein globales set für alle gesperrten $locked_set_id = md5(uniqid('coursesets', 1)); $name = 'Anmeldung gesperrt (global)'; $info = ''; $cs_insert->execute(array($locked_set_id, '', $name, $info, 1, time(), time())); $locked_rule_id = md5(uniqid('lockedadmissions', 1)); $locked_insert->execute(array($locked_rule_id)); $cs_r_insert->execute(array($locked_set_id, $locked_rule_id, 'LockedAdmission')); //locked wandeln $locked_admission = $db->fetchAll("SELECT seminar_id, name, institut_id FROM seminare WHERE admission_type = 3"); foreach ($locked_admission as $course) { $s_cs_insert->execute(array($locked_set_id, $course['seminar_id'])); } // Lade Daten des aktuellen Semesters. $semester = Semester::findCurrent(); $now = time(); $preserve_waitlists = array(); //gruppierte wandeln $grouped_admission = $db->fetchAll("SELECT seminar_id, seminare.name, start_time, duration_time, institut_id, admission_type, admission_starttime,\n admission_endtime, admission_endtime_sem, admission_group.name as a_name, admission_group, admission_group.chdate\n FROM seminare INNER JOIN admission_group ON group_id = admission_group\n WHERE admission_type IN (1, 2) ORDER BY admission_group, admission_starttime, VeranstaltungsNummer"); foreach ($grouped_admission as $course) { if ($group_id != $course['admission_group']) { $group_id = $course['admission_group']; $group_type = $course['admission_type']; $group_inst = array($course['institut_id']); $group_name = $course['a_name'] ?: ++$g; /* * Check, ob Anmeldeverfahren in der Vergangenheit schon * abgeschlossen wurde. Hier extra ausführlich, damit es * verständlich bleibt. */ // Veranstaltungen, die (auch implizit) im aktuellen oder kommenden Semestern liegen. if (($course['start_time'] + $course['duration_time'] >= $semester->beginn || $course['duration_time'] == -1) && ($course['admission_disable_waitlist'] == 0 || $course['admission_starttime'] > $now || $course['admission_endtime'] > $now || $course['admission_endtime_sem'] > $now || $course['admission_endtime_sem'] == -1)) { // Erzeuge ein Anmeldeset mit den vorhandenen Einstellungen der Veranstaltung. $cs = $this->buildCourseset($course, true); $cs->setName('Beschränkte Teilnehmeranzahl: Gruppe ' . $group_name)->setInfoText('Erzeugt durch Migration 128 ' . strftime('%X %x'))->addInstitute($course['institut_id'])->setPrivate(true)->setUserId($user_id)->store(); $set_id = $cs->getId(); // Losen oder Anmeldezeitraum vorbei => sperren. // Veranstaltungen in vergangenen Semestern werden einfach gesperrt. } else { $group_type = 3; $rule_id = md5(uniqid('lockedadmissions', 1)); $locked_insert->execute(array($rule_id)); $set_id = md5(uniqid('coursesets', 1)); $name = 'Anmeldung gesperrt: Gruppe ' . $group_name; $info = 'Erzeugt durch Migration 128 ' . strftime('%X %x'); $cs_insert->execute(array($set_id, $user_id, $name, $info, 1, $course['chdate'], $course['chdate'])); $cs_i_insert->execute(array($set_id, $course['institut_id'])); $cs_r_insert->execute(array($set_id, $rule_id, 'LockedAdmission')); } } // Veranstaltung mit Losverfahren if ($group_type == 1) { // Losliste übernehmen $db->execute("INSERT INTO priorities (user_id, set_id, seminar_id, priority, mkdate, chdate)\n SELECT user_id, ?, seminar_id, 1, mkdate, UNIX_TIMESTAMP()\n FROM admission_seminar_user WHERE status = 'claiming' AND seminar_id = ?", array($set_id, $course['seminar_id'])); // Chronologische Anmeldung } else { if ($group_type == 2) { $preserve_waitlists[] = $course['seminar_id']; } } // weitere Einrichtungen zuordnen if ($group_type != 3 && !in_array($course['institut_id'], $group_inst)) { $cs_i_insert->execute(array($set_id, $course['institut_id'])); $group_inst[] = $course['institut_id']; } $s_cs_insert->execute(array($set_id, $course['seminar_id'])); } $admission = $db->fetchAll("SELECT seminar_id, seminare.name, start_time, duration_time, institut_id, admission_type, admission_starttime, admission_endtime, admission_endtime_sem\n FROM seminare left join admission_group on(group_id=admission_group) WHERE admission_type in (1, 2) AND group_id is null"); foreach ($admission as $course) { /* * Check, ob Anmeldeverfahren in der Vergangenheit schon * abgeschlossen wurde. Hier extra ausführlich, damit es * verständlich bleibt. */ // Veranstaltungen, die (auch implizit) im aktuellen oder kommenden Semestern liegen. if (($course['start_time'] + $course['duration_time'] >= $semester->beginn || $course['duration_time'] == -1) && ($course['admission_disable_waitlist'] == 0 || $course['admission_starttime'] > $now || $course['admission_endtime'] > $now || $course['admission_endtime_sem'] > $now || $course['admission_endtime_sem'] == -1)) { // Erzeuge ein Anmeldeset mit den vorhandenen Einstellungen der Veranstaltung. $cs = $this->buildCourseset($course, false); $cs->setName('Beschränkte Teilnehmeranzahl: ' . $course['name'])->setInfoText('Erzeugt durch Migration 128 ' . strftime('%X %x'))->setPrivate(true)->setUserId($user_id)->store(); $set_id = $cs->getId(); // Veranstaltung mit Losverfahren if ($course['admission_type'] == 1) { // Losliste übernehmen $db->execute("INSERT INTO priorities (user_id, set_id, seminar_id, priority, mkdate, chdate)\n SELECT user_id, ?, seminar_id, 1, mkdate, UNIX_TIMESTAMP()\n FROM admission_seminar_user WHERE status = 'claiming' AND seminar_id = ?", array($set_id, $course['seminar_id'])); // Chronologische Anmeldung } else { $preserve_waitlists[] = $course['seminar_id']; } // Losen oder Anmeldezeitraum vorbei => sperren. // Veranstaltungen in vergangenen Semestern werden einfach gesperrt. } else { $set_id = $locked_set_id; } $s_cs_insert->execute(array($set_id, $course['seminar_id'])); } $db->exec("UPDATE seminare SET Lesezugriff=1,Schreibzugriff=1 WHERE Lesezugriff=3"); $db->exec("UPDATE seminare SET Lesezugriff=1,Schreibzugriff=1 WHERE Lesezugriff=2"); // Übernehme Veranstaltungen ohne Anmeldeverfahren, aber mit Anmeldezeitraum in der Zukunft. $now = time(); $admission = $db->fetchAll("SELECT `seminar_id`,`seminare`.`name`,`institut_id`,`admission_starttime`,`admission_endtime_sem`\n FROM `seminare` WHERE `admission_type`=0 AND (`admission_starttime`>:now OR `admission_endtime_sem`>:now)", array('now' => $now)); foreach ($admission as $course) { // Erzeuge ein Anmeldeset mit den vorhandenen Einstellungen der Veranstaltung. $cs = new CourseSet(); $rule = new TimedAdmission(); if ($course['admission_starttime'] != -1) { $rule->setStartTime($course['admission_starttime']); } if ($course['admission_endtime_sem'] != -1) { $rule->setEndTime($course['admission_endtime_sem']); } $cs->setName('Anmeldezeitraum: ' . $course['name'])->setInfoText('Erzeugt durch Migration 128 ' . strftime('%X %x'))->addCourse($course['seminar_id'])->addAdmissionRule($rule)->setPrivate(true)->setUserId($user_id)->store(); } //Warte und Anmeldelisten löschen $db->exec("DELETE FROM admission_seminar_user WHERE status = 'claiming'"); $db->execute("DELETE FROM admission_seminar_user WHERE status = 'awaiting' AND seminar_id NOT IN(?)", array($preserve_waitlists)); $db->exec("DROP TABLE admission_seminar_studiengang"); $db->exec("DROP TABLE admission_group"); $db->exec("ALTER TABLE `seminare` DROP `Passwort`"); $db->exec("ALTER TABLE `seminare` DROP `admission_endtime`"); $db->exec("ALTER TABLE `seminare` DROP `admission_type`"); $db->exec("ALTER TABLE `seminare` DROP `admission_selection_take_place`"); $db->exec("ALTER TABLE `seminare` DROP `admission_group`"); $db->exec("ALTER TABLE `seminare` DROP `admission_starttime`"); $db->exec("ALTER TABLE `seminare` DROP `admission_endtime_sem`"); $db->exec("ALTER TABLE `seminare` DROP `admission_enable_quota`"); $db->exec("ALTER TABLE `seminare` ADD `admission_waitlist_max` INT UNSIGNED NOT NULL DEFAULT '0'"); $db->exec("ALTER TABLE `seminare` ADD `admission_disable_waitlist_move` TINYINT UNSIGNED NOT NULL DEFAULT '0'"); $db->exec("ALTER TABLE `seminar_user` DROP `admission_studiengang_id`"); $db->exec("ALTER TABLE `admission_seminar_user` DROP `studiengang_id`"); try { $db->exec("ALTER TABLE `seminar_user` DROP INDEX `Seminar_id`"); $db->exec("ALTER TABLE `seminar_user` DROP INDEX `user_id`"); } catch (PDOException $e) { } $db->exec("ALTER TABLE `seminar_user` ADD INDEX (`user_id`, `Seminar_id`, `status`)"); SimpleORMap::expireTableScheme(); // Insert global configuration: who may edit course sets? $db->exec("INSERT IGNORE INTO `config`\n (`config_id`, `parent_id`, `field`, `value`, `is_default`,\n `type`, `range`, `section`, `position`, `mkdate`, `chdate`,\n `description`, `comment`, `message_template`)\n VALUES\n (MD5('ALLOW_DOZENT_COURSESET_ADMIN'), '',\n 'ALLOW_DOZENT_COURSESET_ADMIN', '0', '1', 'boolean', 'global',\n 'coursesets', '0', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(),\n 'Sollen Lehrende einrichtungsweite Anmeldesets anlegen und bearbeiten dürfen?',\n '', '')"); // Insert global configuration: who may edit course sets? $db->exec("INSERT IGNORE INTO `config`\n (`config_id`, `parent_id`, `field`, `value`, `is_default`,\n `type`, `range`, `section`, `position`, `mkdate`, `chdate`,\n `description`, `comment`, `message_template`)\n VALUES\n (MD5('ENABLE_COURSESET_FCFS'), '',\n 'ENABLE_COURSESET_FCFS', '0', '1', 'boolean', 'global',\n 'coursesets', '0', UNIX_TIMESTAMP(), UNIX_TIMESTAMP(),\n 'Soll first-come-first-served (Windhundverfahren) bei der Anmeldung erlaubt sein?',\n '', '')"); }
/** * Seminar group administration - cluster your seminars by colors or * change grouping mechanism */ public function groups_action($sem = null, $studygroups = false) { if ($GLOBALS['perm']->have_perm('admin')) { throw new AccessDeniedException(); } $this->title = _('Meine Veranstaltungen') . ' - ' . _('Farbgruppierungen'); if (Request::isXhr()) { $this->set_layout(null); $this->response->add_header('Content-Type', 'text/html;charset=Windows-1252'); header('X-Title: ' . $this->title); } else { PageLayout::setTitle($this->title); PageLayout::setHelpKeyword('Basis.VeranstaltungenOrdnen'); Navigation::activateItem('/browse/my_courses/list'); } $this->current_semester = $sem ?: Semester::findCurrent()->semester_id; $this->semesters = SemesterData::GetSemesterArray(); $forced_grouping = Config::get()->MY_COURSES_FORCE_GROUPING; if ($forced_grouping == 'not_grouped') { $forced_grouping = 'sem_number'; } $no_grouping_allowed = $forced_grouping == 'sem_number' || !in_array($forced_grouping, getValidGroupingFields()); $group_field = $GLOBALS['user']->cfg->MY_COURSES_GROUPING ?: $forced_grouping; $groups = array(); $add_fields = ''; $add_query = ''; if ($group_field == 'sem_tree_id') { $add_fields = ', sem_tree_id'; $add_query = "LEFT JOIN seminar_sem_tree sst ON (sst.seminar_id=seminare.Seminar_id)"; } else { if ($group_field == 'dozent_id') { $add_fields = ', su1.user_id as dozent_id'; $add_query = "LEFT JOIN seminar_user as su1 ON (su1.seminar_id=seminare.Seminar_id AND su1.status='dozent')"; } } $dbv = DbView::getView('sem_tree'); $query = "SELECT seminare.VeranstaltungsNummer AS sem_nr, seminare.Name, seminare.Seminar_id,\n seminare.status AS sem_status, seminar_user.gruppe, seminare.visible,\n {$dbv->sem_number_sql} AS sem_number,\n {$dbv->sem_number_end_sql} AS sem_number_end {$add_fields}\n FROM seminar_user\n JOIN semester_data sd\n LEFT JOIN seminare USING (Seminar_id)\n {$add_query}\n WHERE seminar_user.user_id = ?"; if (Config::get()->MY_COURSES_ENABLE_STUDYGROUPS && !$studygroups) { $query .= " AND seminare.status != 99"; } if ($studygroups) { $query .= " AND seminare.status = 99"; } if (get_config('DEPUTIES_ENABLE')) { $query .= " UNION " . getMyDeputySeminarsQuery('gruppe', $dbv->sem_number_sql, $dbv->sem_number_end_sql, $add_fields, $add_query); } $query .= " ORDER BY sem_nr ASC"; $statement = DBManager::get()->prepare($query); $statement->execute(array($GLOBALS['user']->id)); while ($row = $statement->fetch(PDO::FETCH_ASSOC)) { $my_sem[$row['Seminar_id']] = array('obj_type' => 'sem', 'sem_nr' => $row['sem_nr'], 'name' => $row['Name'], 'visible' => $row['visible'], 'gruppe' => $row['gruppe'], 'sem_status' => $row['sem_status'], 'sem_number' => $row['sem_number'], 'sem_number_end' => $row['sem_number_end']); if ($group_field) { fill_groups($groups, $row[$group_field], array('seminar_id' => $row['Seminar_id'], 'sem_nr' => $row['sem_nr'], 'name' => $row['Name'], 'gruppe' => $row['gruppe'])); } } if ($group_field == 'sem_number') { correct_group_sem_number($groups, $my_sem); } else { add_sem_name($my_sem); } sort_groups($group_field, $groups); // Ensure that a seminar is never in multiple groups $sem_ids = array(); foreach ($groups as $group_id => $seminars) { foreach ($seminars as $index => $seminar) { if (in_array($seminar['seminar_id'], $sem_ids)) { unset($seminars[$index]); } else { $sem_ids[] = $seminar['seminar_id']; } } if (empty($seminars)) { unset($groups[$group_id]); } else { $groups[$group_id] = $seminars; } } $this->studygroups = $studygroups; $this->no_grouping_allowed = $no_grouping_allowed; $this->groups = $groups; $this->group_names = get_group_names($group_field, $groups); $this->group_field = $group_field; $this->my_sem = $my_sem; }
/** * Sets the start semester for the given course. * * @param String $course_id Id of the course */ public function setSemester_action($course_id) { $current_semester = Semester::findCurrent(); $start_semester = Semester::find(Request::get('startSemester')); if (Request::int('endSemester') != -1) { $end_semester = Semester::find(Request::get('endSemester')); } else { $end_semester = -1; } $course = Seminar::GetInstance($course_id); if ($start_semester == $end_semester) { $end_semester = 0; } if ($end_semester != 0 && $end_semester != -1 && $start_semester->beginn >= $end_semester->beginn) { PageLayout::postMessage(MessageBox::error(_('Das Startsemester liegt nach dem Endsemester!'))); } else { $course->setStartSemester($start_semester->beginn); if ($end_semester != -1) { $course->setEndSemester($end_semester->beginn); } else { $course->setEndSemester($end_semester); } //$course->removeAndUpdateSingleDates(); // If the new duration includes the current semester, we set the semester-chooser to the current semester if ($current_semester->beginn >= $course->getStartSemester() && $current_semester->beginn <= $course->getEndSemesterVorlesEnde()) { $course->setFilter($current_semester->beginn); } else { // otherwise we set it to the first semester $course->setFilter($course->getStartSemester()); } } $course->store(); SeminarCycleDate::removeOutRangedSingleDates($course->getStartSemester(), $course->getEndSemesterVorlesEnde(), $course->id); $cycles = SeminarCycleDate::findBySeminar_id($course->seminar_id); foreach ($cycles as $cycle) { $new_dates = $cycle->createTerminSlots($start_semester->beginn); foreach ($new_dates as $semester_id => $dates) { foreach ($dates['dates'] as $date) { $date->store(); } } } $messages = $course->getStackedMessages(); foreach ($messages as $type => $msg) { PageLayout::postMessage(MessageBox::$type($msg['title'], $msg['details'])); } if (Request::submitted('save_close')) { $this->relocate(str_replace('_', '/', Request::get('origin')), array('cid' => $course_id)); } else { $this->redirect($this->url_for('course/timesrooms/index', array('cid' => $course_id))); } }
public static function getPreparedCourses($sem = "all", $params = array()) { $semesters = self::getSelectedSemesters($sem); $current_semester_nr = SemesterData::GetSemesterIndexById(@Semester::findCurrent()->id); $min_sem_key = min($semesters); $max_sem_key = max($semesters); $group_field = $params['group_field']; $courses = self::getCourses($min_sem_key, $max_sem_key, $params); $show_semester_name = UserConfig::get($GLOBALS['user']->id)->SHOWSEM_ENABLE; $sem_courses = array(); $param_array = 'name seminar_id visible veranstaltungsnummer start_time duration_time status visible '; $param_array .= 'chdate admission_binding modules admission_prelim'; if (!empty($courses)) { // filtering courses $modules = new Modules(); $member_ships = User::findCurrent()->course_memberships->toGroupedArray('seminar_id', 'status gruppe'); foreach ($courses as $index => $course) { // export object to array for simple handling $_course = $course->toArray($param_array); $_course['start_semester'] = $course->start_semester->name; $_course['end_semester'] = $course->end_semester->name; $_course['sem_class'] = $course->getSemClass(); $_course['obj_type'] = 'sem'; if ($group_field == 'sem_tree_id') { $_course['sem_tree'] = $course->study_areas->toArray(); } $user_status = @$member_ships[$course->id]['status']; if (!$user_status && Config::get()->DEPUTIES_ENABLE && isDeputy($GLOBALS['user']->id, $course->id)) { $user_status = 'dozent'; $is_deputy = true; } else { $is_deputy = false; } // get teachers only if grouping selected (for better performance) if ($group_field == 'dozent_id') { $teachers = new SimpleCollection($course->getMembersWithStatus('dozent')); $teachers->filter(function ($a) use(&$_course) { return $_course['teachers'][] = $a->user->getFullName('no_title_rev'); }); } $_course['last_visitdate'] = object_get_visit($course->id, 'sem', 'last'); $_course['visitdate'] = object_get_visit($course->id, 'sem', ''); $_course['user_status'] = $user_status; $_course['gruppe'] = !$is_deputy ? @$member_ships[$course->id]['gruppe'] : self::getDeputieGroup($course->id); $_course['sem_number_end'] = $course->duration_time == -1 ? $max_sem_key : SemesterData::GetSemesterIndexById($course->end_semester->id); $_course['sem_number'] = SemesterData::GetSemesterIndexById($course->start_semester->id); $_course['modules'] = $modules->getLocalModules($course->id, 'sem', $course->modules, $course->status); $_course['name'] = $course->name; $_course['temp_name'] = $course->name; $_course['number'] = $course->veranstaltungsnummer; $_course['is_deputy'] = $is_deputy; if ($show_semester_name && $course->duration_time != 0 && !$course->getSemClass()->offsetGet('studygroup_mode')) { $_course['name'] .= ' (' . $course->getFullname('sem-duration-name') . ')'; } // add the the course to the correct semester self::getObjectValues($_course); if ($course->duration_time == -1) { if ($current_semester_nr >= $min_sem_key && $current_semester_nr <= $max_sem_key) { $sem_courses[$current_semester_nr][$course->id] = $_course; } else { $sem_courses[$max_sem_key][$course->id] = $_course; } } else { for ($i = $min_sem_key; $i <= $max_sem_key; $i++) { if ($i >= $_course['sem_number'] && $i <= $_course['sem_number_end']) { $sem_courses[$i][$course->id] = $_course; } } } } } else { return null; } if (empty($sem_courses)) { return null; } if ($params['main_navigation']) { return $sem_courses; } krsort($sem_courses); // grouping if ($group_field == 'sem_number' && !$params['order_by']) { foreach ($sem_courses as $index => $courses) { uasort($courses, function ($a, $b) { if (Config::get()->IMPORTANT_SEMNUMBER) { return $a['gruppe'] == $b['gruppe'] ? strcmp($a['number'], $b['number']) : $a['gruppe'] - $b['gruppe']; } else { return $a['gruppe'] == $b['gruppe'] ? strcmp($a['temp_name'], $b['temp_name']) : $a['gruppe'] - $b['gruppe']; } }); $sem_courses[$index] = $courses; } } // Group by teacher if ($group_field == 'dozent_id') { self::groupByTeacher($sem_courses); } // Group by Sem Status if ($group_field == 'sem_status') { self::groupBySemStatus($sem_courses); } // Group by colors if ($group_field == 'gruppe') { self::groupByGruppe($sem_courses); } // Group by sem_tree if ($group_field == 'sem_tree_id') { self::groupBySemTree($sem_courses); } return !empty($sem_courses) ? $sem_courses : false; }
if (!$_SESSION['_language']) { $_SESSION['_language'] = $DEFAULT_LANGUAGE; } // else use system default } // user init starts here if ($auth->is_authenticated() && is_object($user) && $user->id != "nobody") { if ($_SESSION['SessionStart'] > UserConfig::get($user->id)->CURRENT_LOGIN_TIMESTAMP) { // just logged in // store old CURRENT_LOGIN in LAST_LOGIN and set CURRENT_LOGIN to start of session UserConfig::get($user->id)->store('LAST_LOGIN_TIMESTAMP', UserConfig::get($user->id)->CURRENT_LOGIN_TIMESTAMP); UserConfig::get($user->id)->store('CURRENT_LOGIN_TIMESTAMP', $_SESSION['SessionStart']); //find current semester and store it in $_SESSION['_default_sem'] $current_sem = Semester::findByTimestamp(time() + get_config('SEMESTER_TIME_SWITCH') * 7 * 24 * 60 * 60); if (!$current_sem) { $current_sem = Semester::findCurrent(); } $_SESSION['_default_sem'] = $current_sem->semester_id; //redirect user to another page if he want to, redirect is deferred to allow plugins to catch the UserDidLogin notification if (UserConfig::get($user->id)->PERSONAL_STARTPAGE > 0 && $i_page == "index.php" && !$perm->have_perm("root")) { $seminar_open_redirected = TRUE; } $user_did_login = true; } } // init of output via I18N $_language_path = init_i18n($_SESSION['_language']); //force reload of config to get translated data list($save_sem_class, $save_sem_type) = array($GLOBALS['SEM_CLASS'], $GLOBALS['SEM_TYPE']); include 'config.inc.php'; list($GLOBALS['SEM_CLASS'], $GLOBALS['SEM_TYPE']) = array($save_sem_class, $save_sem_type);
function get_result() { global $_fullname_sql, $SEM_TYPE, $SEM_CLASS; if ($this->sem_browse_data['group_by'] == 1) { if (!is_object($this->sem_tree)) { $the_tree = TreeAbstract::GetInstance("StudipSemTree", false); } else { $the_tree = $this->sem_tree->tree; } if ($this->sem_browse_data['start_item_id'] != 'root' && ($this->sem_browse_data['level'] == "vv" || $this->sem_browse_data['level'] == "sbb")) { $allowed_ranges = $the_tree->getKidsKids($this->sem_browse_data['start_item_id']); $allowed_ranges[] = $this->sem_browse_data['start_item_id']; $sem_tree_query = " AND sem_tree_id IN('" . join("','", $allowed_ranges) . "') "; } $add_fields = "seminar_sem_tree.sem_tree_id AS bereich,"; $add_query = "LEFT JOIN seminar_sem_tree ON (seminare.Seminar_id = seminar_sem_tree.seminar_id {$sem_tree_query})"; } else { if ($this->sem_browse_data['group_by'] == 4) { $add_fields = "Institute.Name AS Institut,Institute.Institut_id,"; $add_query = "LEFT JOIN seminar_inst ON (seminare.Seminar_id = seminar_inst.Seminar_id)\n LEFT JOIN Institute ON (Institute.Institut_id = seminar_inst.institut_id)"; } else { $add_fields = ""; $add_query = ""; } } $dbv = DbView::getView('sem_tree'); $query = "SELECT seminare.Seminar_id,VeranstaltungsNummer, seminare.status, IF(seminare.visible=0,CONCAT(seminare.Name, ' " . _("(versteckt)") . "'), seminare.Name) AS Name,\n {$add_fields}" . $_fullname_sql['full'] . " AS fullname, auth_user_md5.username,\n " . $dbv->sem_number_sql . " AS sem_number, " . $dbv->sem_number_end_sql . " AS sem_number_end, seminar_user.position AS position FROM seminare\n LEFT JOIN seminar_user ON (seminare.Seminar_id=seminar_user.Seminar_id AND seminar_user.status='dozent')\n LEFT JOIN auth_user_md5 USING (user_id)\n LEFT JOIN user_info USING (user_id)\n {$add_query}\n WHERE seminare.Seminar_id IN('" . join("','", array_keys($this->sem_browse_data['search_result'])) . "')"; $db = new DB_Seminar($query); $snap = new DbSnapshot($db); $group_field = $this->group_by_fields[$this->sem_browse_data['group_by']]['group_field']; $data_fields[0] = "Seminar_id"; if ($this->group_by_fields[$this->sem_browse_data['group_by']]['unique_field']) { $data_fields[1] = $this->group_by_fields[$this->sem_browse_data['group_by']]['unique_field']; } $group_by_data = $snap->getGroupedResult($group_field, $data_fields); $sem_data = $snap->getGroupedResult("Seminar_id"); if ($this->sem_browse_data['group_by'] == 0) { $group_by_duration = $snap->getGroupedResult("sem_number_end", array("sem_number", "Seminar_id")); foreach ($group_by_duration as $sem_number_end => $detail) { if ($sem_number_end != -1 && ($detail['sem_number'][$sem_number_end] && count($detail['sem_number']) == 1)) { continue; } else { $current_semester_index = SemesterData::GetInstance()->GetSemesterIndexById(Semester::findCurrent()->semester_id); foreach ($detail['Seminar_id'] as $seminar_id => $foo) { $start_sem = key($sem_data[$seminar_id]["sem_number"]); if ($sem_number_end == -1) { if ($this->sem_number === false) { $sem_number_end = $current_semester_index && isset($this->search_obj->sem_dates[$current_semester_index + 1]) ? $current_semester_index + 1 : count($this->search_obj->sem_dates) - 1; } else { $sem_number_end = $this->sem_number[0]; } } for ($i = $start_sem; $i <= $sem_number_end; ++$i) { if ($this->sem_number === false || is_array($this->sem_number) && in_array($i, $this->sem_number)) { if ($group_by_data[$i] && !$tmp_group_by_data[$i]) { foreach ($group_by_data[$i]['Seminar_id'] as $id => $bar) { $tmp_group_by_data[$i]['Seminar_id'][$id] = true; } } $tmp_group_by_data[$i]['Seminar_id'][$seminar_id] = true; } } } } } if (is_array($tmp_group_by_data)) { if ($this->sem_number !== false) { unset($group_by_data); } foreach ($tmp_group_by_data as $start_sem => $detail) { $group_by_data[$start_sem] = $detail; } } } //release memory unset($snap); unset($tmp_group_by_data); foreach ($group_by_data as $group_field => $sem_ids) { foreach ($sem_ids['Seminar_id'] as $seminar_id => $foo) { $name = strtolower(key($sem_data[$seminar_id]["Name"])); $name = str_replace("ä", "ae", $name); $name = str_replace("ö", "oe", $name); $name = str_replace("ü", "ue", $name); if (Config::get()->IMPORTANT_SEMNUMBER && key($sem_data[$seminar_id]['VeranstaltungsNummer'])) { $name = key($sem_data[$seminar_id]['VeranstaltungsNummer']) . ' ' . $name; } $group_by_data[$group_field]['Seminar_id'][$seminar_id] = $name; } uasort($group_by_data[$group_field]['Seminar_id'], 'strnatcmp'); } switch ($this->sem_browse_data["group_by"]) { case 0: krsort($group_by_data, SORT_NUMERIC); break; case 1: uksort($group_by_data, create_function('$a,$b', '$the_tree = TreeAbstract::GetInstance("StudipSemTree", false); $the_tree->buildIndex(); return (int)($the_tree->tree_data[$a]["index"] - $the_tree->tree_data[$b]["index"]); ')); break; case 3: uksort($group_by_data, create_function('$a,$b', 'global $SEM_CLASS,$SEM_TYPE; return strnatcasecmp($SEM_TYPE[$a]["name"]." (". $SEM_CLASS[$SEM_TYPE[$a]["class"]]["name"].")", $SEM_TYPE[$b]["name"]." (". $SEM_CLASS[$SEM_TYPE[$b]["class"]]["name"].")");')); break; default: uksort($group_by_data, 'strnatcasecmp'); break; } return array($group_by_data, $sem_data); }
/** * Configure a new or existing course set. */ public function configure_action($coursesetId = '') { if ($GLOBALS['perm']->have_perm('root')) { if ($coursesetId) { // Load course set data. $this->courseset = new CourseSet($coursesetId); $this->myInstitutes = array(); $selectedInstitutes = $this->courseset->getInstituteIds(); foreach ($selectedInstitutes as $id => $selected) { $this->myInstitutes[$id] = new Institute($id); } $this->selectedInstitutes = $this->myInstitutes; $selectedCourses = $this->courseset->getCourses(); if (!$this->instant_course_set_view) { $allCourses = CoursesetModel::getInstCourses(array_keys($this->selectedInstitutes), $coursesetId, array(), $this->courseset->getSemester()); $this->selectedSemester = $this->courseset->getSemester(); } } else { $this->myInstitutes = array(); $this->selectedInstitutes = array(); $allCourses = array(); $selectedCourses = array(); $this->selectedSemester = Semester::findCurrent()->semester_id; } Config::get()->AJAX_AUTOCOMPLETE_DISABLED = false; $this->instSearch = QuickSearch::get("institute_id", new StandardSearch("Institut_id"))->withoutButton()->render(); } else { $this->myInstitutes = array(); $myInstitutes = Institute::getMyInstitutes(); foreach ($myInstitutes as $institute) { $this->myInstitutes[$institute['Institut_id']] = $institute; } if ($coursesetId) { // Load course set data. $this->courseset = new CourseSet($coursesetId); $selectedInstitutes = $this->courseset->getInstituteIds(); $this->selectedInstitutes = array(); foreach ($selectedInstitutes as $id => $selected) { $this->selectedInstitutes[$id] = new Institute($id); } $selectedCourses = $this->courseset->getCourses(); if (!$this->instant_course_set_view) { $allCourses = CoursesetModel::getInstCourses(array_keys($this->selectedInstitutes), $coursesetId, array(), $this->courseset->getSemester(), $this->onlyOwnCourses); $this->selectedSemester = $this->courseset->getSemester(); } } else { $this->selectedSemester = Semester::findCurrent()->semester_id; $this->selectedInstitutes = $this->myInstitutes; $allCourses = CoursesetModel::getInstCourses(array_keys($this->myInstitutes), $coursesetId, array(), $this->selectedSemester, $this->onlyOwnCourses); $selectedCourses = array(); } } // If an institute search has been conducted, we need to consider parameters from flash. if ($this->flash['name'] || $this->flash['institutes'] || $this->flash['courses'] || $this->flash['rules'] || $this->flash['userlists'] || $this->flash['infotext'] || $this->flash['semester']) { if (!$this->courseset) { $this->courseset = new CourseSet($coursesetId); } if ($this->flash['name']) { $this->courseset->setName($this->flash['name']); } if ($this->flash['institutes']) { $institutes = $this->flash['institutes']; $this->courseset->setInstitutes($institutes); if ($GLOBALS['perm']->have_perm('root')) { $this->myInstitutes = array(); foreach ($institutes as $id) { $this->myInstitutes[$id] = new Institute($id); $this->selectedInstitutes[$id] = $this->myInstitutes[$id]; } } $selectedCourses = $this->courseset->getCourses(); $allCourses = CoursesetModel::getInstCourses(array_flip($institutes), $coursesetId, $selectedCourses, $this->selectedSemester, $this->onlyOwnCourses); } if ($this->flash['courses']) { $courses = $this->flash['courses']; $this->courseset->setCourses($courses); $selectedCourses = $courses; } if ($this->flash['rules']) { $this->courseset->setAdmissionRules($this->flash['rules']); } if ($this->flash['userlists']) { $this->courseset->setUserlists($this->flash['userlists']); } if ($this->flash['infotext']) { $this->courseset->setInfoText($this->flash['infotext']); } if ($this->flash['private']) { $this->courseset->setPrivate($this->flash['private']); } } // Fetch all lists with special user chances. $this->myUserlists = AdmissionUserList::getUserLists($GLOBALS['user']->id); $fac = $this->get_template_factory(); $tpl = $fac->open('admission/courseset/instcourses'); $tpl->set_attribute('allCourses', $allCourses); $tpl->set_attribute('selectedCourses', $selectedCourses); $this->coursesTpl = $tpl->render(); $tpl = $fac->open('admission/courseset/institutes'); if ($coursesetId) { $tpl->set_attribute('courseset', $this->courseset); } $tpl->set_attribute('instSearch', $this->instSearch); $tpl->set_attribute('selectedInstitutes', $this->selectedInstitutes); $tpl->set_attribute('myInstitutes', $this->myInstitutes); $tpl->set_attribute('controller', $this); if ($GLOBALS['perm']->have_perm('admin') || $GLOBALS['perm']->have_perm('dozent') && get_config('ALLOW_DOZENT_COURSESET_ADMIN')) { $tpl->set_attribute('rights', true); } else { $tpl->set_attribute('rights', false); } $this->instTpl = $tpl->render(); }
function getCurrentSemesterData() { $ret = Semester::findCurrent(); return $ret ? $ret->toArray() : false; }
if (!CheckParamXML()) { $infobox = array( array ("kategorie" => _("Information:"), "eintrag" => array ( array ( "icon" => Icon::create('info', 'clickable'), "text" => _("Die Parametern, mit denen diese Seite aufgerufen wurde, sind fehlerhaft.") ) ) ) ); } if ($ex_sem == 'current'){ $ex_sem = Semester::findCurrent()->getId(); } if ($o_mode != "direct") { if (!(is_dir( $TMP_PATH."/export" ))) { mkdir($TMP_PATH . "/export"); chmod ($TMP_PATH . "/export", 0777); } $xml_file_id = md5(uniqid(rand())) . ".xml"; $xml_file = fopen($TMP_PATH."/export/" . $xml_file_id, "w"); } if ($o_mode == 'direct'){ header("Content-type: text/xml; charset=utf-8");
/** * returns latest semester id from assigned courses * if no courses are assigned current semester * * @return string id of semester */ public function getSemester() { $db = DBManager::get(); $timestamp = $db->fetchColumn("SELECT MAX(start_time + duration_time)\n FROM seminare WHERE duration_time <> -1\n AND seminar_id IN(?)", array($this->getCourses())); $semester = Semester::findByTimestamp($timestamp); if (!$semester) { $semester = Semester::findCurrent(); } return $semester->id; }
$export_pagecontent .= "<option"; if ($ex_type=="veranstaltung") $export_pagecontent .= " selected"; $export_pagecontent .= " value=\"veranstaltung\">" . _("Veranstaltungsdaten") . "</option>"; $export_pagecontent .= "<option"; if ($ex_type=="person") { $export_pagecontent .= " selected"; } $export_pagecontent .= " value=\"person\">" . _("MitarbeiterInnendaten") . "</option>"; $export_pagecontent .= "</select><br><br><br><br>"; $export_pagecontent .="<b>". _("Aus welchem Semester sollen die Daten exportiert werden (für Veranstaltungsexport): ") . "</b><br>"; if (!isset($ex_sem)) { $ex_sem = (Semester::findCurrent() ? Semester::findCurrent()->getId() : null); } $export_pagecontent .= SemesterData::GetSemesterSelector(array('name' => 'ex_sem'), $ex_sem, 'semester_id', true); $export_pagecontent .= "<br><br>"; $export_pagecontent .="<b>". _("Welche Arten von Veranstaltungen sollen exportiert werden? ") . "</b><br>"; if (!count($ex_sem_class)) { $ex_sem_class[1] = 1; } foreach (SeminarCategories::getAll() as $sem_class) { if(!$sem_class->studygroup_mode){ $export_pagecontent .= "<input type=\"checkbox\" name=\"ex_sem_class[$sem_class->id]\" value=\"1\""; if (isset($ex_sem_class[$sem_class->id])) $export_pagecontent .= " checked"; $export_pagecontent .= "> " . htmlready($sem_class->name) . " ";
/** * Searchs for studip areas using given search term * * @param string $term search term * @return array area data */ function search_area($term) { global $perm; $result = array(); if (strlen($term) < 3) { PageLayout::postMessage(MessageBox::error(_('Der Suchbegriff muss mindestens drei Zeichen lang sein.'))); return $result; } elseif ($term == '__THIS_SEMESTER__') { $nr = 0; $current_semester = Semester::findCurrent(); $query = "SELECT seminare.Name AS sem_name, seminare.Seminar_id, seminare.visible\n FROM seminar_user LEFT JOIN seminare USING (Seminar_id)\n WHERE seminar_user.user_id = :user_id AND seminar_user.status IN('tutor', 'dozent')\n AND seminare.start_time <= :start\n AND (:start <= (seminare.start_time + seminare.duration_time)\n OR seminare.duration_time = -1)"; if (get_config('DEPUTIES_ENABLE')) { $query .= " UNION SELECT CONCAT(seminare.Name, ' [" . _("Vertretung") . "]') AS sem_name, seminare.Seminar_id,\n seminare.visible\n FROM deputies JOIN seminare ON (deputies.range_id=seminare.Seminar_id)\n WHERE deputies.user_id = :user_id\n AND seminare.start_time <= :start\n AND (:start <= (seminare.start_time + seminare.duration_time)\n OR seminare.duration_time = -1)"; } $query .= " ORDER BY sem_name ASC"; $statement = DBManager::get()->prepare($query); $statement->bindValue(':user_id', $GLOBALS['auth']->auth['uid']); $statement->bindValue(':start', $current_semester["beginn"]); $statement->execute(); $seminars = $statement->fetchAll(PDO::FETCH_ASSOC); foreach ($seminars as $key => $sem) { $tmp_result[$sem['Seminar_id']] = array('name' => $sem['sem_name'], 'type' => 'sem'); } $term = ''; } elseif ($term == '__MY_INSTITUTES__') { $term = ''; if ($perm->have_perm('root')) { $tmp_result['studip'] = array('name' => 'Stud.IP', 'type' => 'global'); } $inst_list = Institute::getMyInstitutes(); if (count($inst_list)) { foreach ($inst_list as $data) { $tmp_result[$data['Institut_id']] = array('name' => $data['Name'], 'type' => $data['is_fak'] ? 'fak' : 'inst'); } } } else { $tmp_result = search_range($term, true); // add users if (stripos(get_fullname(), $term) !== false) { $tmp_result[$GLOBALS['auth']->auth['uid']] = array('name' => get_fullname(), 'type' => 'user'); } if (isDeputyEditAboutActivated()) { $query = "SELECT DISTINCT a.user_id " . "FROM deputies d " . "JOIN auth_user_md5 a ON (d.range_id = a.user_id) " . "JOIN user_info u ON (a.user_id=u.user_id) " . "WHERE d.user_id = ? " . "AND CONCAT(u.title_front, ' ', a.Vorname, ' ', a.Nachname, ', ', u.title_rear) LIKE CONCAT('%',?,'%')"; $statement = DBManager::get()->prepare($query); $statement->execute(array($GLOBALS['auth']->auth['uid'], $term)); while ($data = $statement->fetch(PDO::FETCH_ASSOC)) { $tmp_result[$data['user_id']] = array('name' => get_fullname($data['user_id']), 'type' => 'user'); } } } // workaround: apply search term (ignored by search_range below admin) if (count($tmp_result) and !$GLOBALS['perm']->have_perm('admin') and $term) { foreach ($tmp_result as $id => $data) { if (stripos($data['name'], $term) === false) { unset($tmp_result[$id]); } } } // prepare result if (count($tmp_result)) { foreach ($tmp_result as $id => $data) { $result[$data['type'] == 'fak' ? 'inst' : $data['type']][$id] = $data['name']; } } elseif ($term) { PageLayout::postMessage(MessageBox::error(_('Zu diesem Suchbegriff wurden keine Bereiche gefunden.'))); } return $result; }