Example #1
0
 /**
  * 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;
 }
Example #2
0
 /**
  * returns a sql-string appropriate for the searchtype of the current class
  *
  * @return string
  */
 private function getSQL()
 {
     switch ($this->search) {
         case "username":
             $this->extendedLayout = true;
             return "SELECT DISTINCT auth_user_md5.username, CONCAT(auth_user_md5.Vorname, \" \", auth_user_md5.Nachname), auth_user_md5.perms, auth_user_md5.username " . "FROM auth_user_md5 LEFT JOIN user_info ON (user_info.user_id = auth_user_md5.user_id) " . "WHERE (CONCAT(auth_user_md5.Vorname, \" \", auth_user_md5.Nachname) LIKE :input " . "OR CONCAT(auth_user_md5.Nachname, \" \", auth_user_md5.Vorname) LIKE :input " . "OR CONCAT(auth_user_md5.Nachname, \", \", auth_user_md5.Vorname) LIKE :input " . "OR auth_user_md5.username LIKE :input) AND " . get_vis_query() . " ORDER BY Vorname, Nachname";
         case "user_id":
             $this->extendedLayout = true;
             return "SELECT DISTINCT auth_user_md5.user_id, CONCAT(auth_user_md5.Vorname, \" \", auth_user_md5.Nachname), auth_user_md5.perms, auth_user_md5.username " . "FROM auth_user_md5 LEFT JOIN user_info ON (user_info.user_id = auth_user_md5.user_id) " . "WHERE (CONCAT(auth_user_md5.Vorname, \" \", auth_user_md5.Nachname) LIKE :input " . "OR CONCAT(auth_user_md5.Nachname, \" \", auth_user_md5.Vorname) LIKE :input " . "OR CONCAT(auth_user_md5.Nachname, \", \", auth_user_md5.Vorname) LIKE :input " . "OR auth_user_md5.username LIKE :input) AND " . get_vis_query() . " ORDER BY Vorname, Nachname";
         case "Seminar_id":
             return "SELECT DISTINCT seminare.Seminar_id, seminare.Name " . "FROM seminare " . "LEFT JOIN seminar_user ON (seminar_user.Seminar_id = seminare.Seminar_id AND seminar_user.status = 'dozent') " . "LEFT JOIN auth_user_md5 ON (auth_user_md5.user_id = seminar_user.user_id) " . "WHERE (seminare.Name LIKE :input " . "OR CONCAT(auth_user_md5.Vorname, ' ', auth_user_md5.Nachname) LIKE :input " . "OR seminare.VeranstaltungsNummer LIKE :input " . "OR seminare.Untertitel LIKE :input " . "OR seminare.Beschreibung LIKE :input " . "OR seminare.Ort LIKE :input " . "OR seminare.Sonstiges LIKE :input) " . "AND seminare.visible = 1 " . "AND seminare.status NOT IN ('" . implode("', '", studygroup_sem_types()) . "') " . (Config::get()->IMPORTANT_SEMNUMBER ? "ORDER BY seminare.VeranstaltungsNummer, seminare.Name" : "ORDER BY seminare.Name");
         case "Arbeitsgruppe_id":
             return "SELECT DISTINCT seminare.Seminar_id, seminare.Name " . "FROM seminare " . "LEFT JOIN seminar_user ON (seminar_user.Seminar_id = seminare.Seminar_id AND seminar_user.status = 'dozent') " . "LEFT JOIN auth_user_md5 ON (auth_user_md5.user_id = seminar_user.user_id) " . "WHERE (seminare.Name LIKE :input " . "OR CONCAT(auth_user_md5.Vorname, ' ', auth_user_md5.Nachname) LIKE :input " . "OR seminare.VeranstaltungsNummer LIKE :input " . "OR seminare.Untertitel LIKE :input " . "OR seminare.Beschreibung LIKE :input " . "OR seminare.Ort LIKE :input " . "OR seminare.Sonstiges LIKE :input) " . "AND seminare.visible = 1 " . "AND seminare.status IN ('" . implode("', '", studygroup_sem_types()) . "') " . "ORDER BY seminare.Name";
         case "Institut_id":
             return "SELECT DISTINCT Institute.Institut_id, Institute.Name " . "FROM Institute " . "LEFT JOIN range_tree ON (range_tree.item_id = Institute.Institut_id) " . "WHERE Institute.Name LIKE :input " . "OR Institute.Strasse LIKE :input " . "OR Institute.email LIKE :input " . "OR range_tree.name LIKE :input " . "ORDER BY Institute.Name";
     }
 }
/**
* Exports lecture-data.
*
* This function gets the data of the lectures at an institute 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 if only a specific lecture is to be exported
*/
function export_sem($inst_id, $ex_sem_id = 'all')
{
    global $range_id, $xml_file, $o_mode, $xml_names_lecture, $xml_groupnames_lecture, $object_counter, $SEM_TYPE, $SEM_CLASS, $filter, $ex_sem, $ex_sem_class, $ex_person_details, $persons;
    $ex_only_homeinst = Request::int('ex_only_homeinst', 0);
    // Prepare user count statement
    $query = "SELECT COUNT(user_id)\n              FROM seminar_user\n              WHERE seminar_id = ? AND status = 'autor'";
    $count_statement = DBManager::get()->prepare($query);
    // Prepare inner statement
    $query = "SELECT seminar_user.position,\n                     auth_user_md5.user_id, auth_user_md5.username, auth_user_md5.Vorname, auth_user_md5.Nachname,\n                     user_info.title_front, user_info.title_rear\n              FROM seminar_user\n              LEFT JOIN user_info USING (user_id)\n              LEFT JOIN auth_user_md5 USING (user_id)\n              WHERE seminar_user.status = 'dozent' AND seminar_user.Seminar_id = ?\n              ORDER BY seminar_user.position";
    $inner_statement = DBManager::get()->prepare($query);
    // Prepare (build) and execute outmost query
    switch ($filter) {
        case "seminar":
            $order = " seminare.Name";
            break;
        case "status":
            $order = "seminare.status, seminare.Name";
            $group = "FIRSTGROUP";
            $group_tab_zelle = "status";
            $do_group = true;
            break;
        default:
            $order = "seminare.status, seminare.Name";
            $group = "FIRSTGROUP";
            $group_tab_zelle = "status";
            $do_group = true;
    }
    $parameters = array();
    if (isset($ex_sem) && ($semester = Semester::find($ex_sem))) {
        $addquery = " AND seminare.start_time <= :begin AND (:begin <= (seminare.start_time + seminare.duration_time) OR seminare.duration_time = -1) ";
        $parameters[':begin'] = $semester->beginn;
    }
    if ($ex_sem_id != 'all') {
        if ($ex_sem_id == 'root') {
            $addquery .= " AND EXISTS (SELECT * FROM seminar_sem_tree WHERE seminar_sem_tree.seminar_id = seminare.Seminar_id) ";
        } else {
            if (!is_array($ex_sem_id)) {
                $ex_sem_id = array($ex_sem_id);
            }
            $ex_sem_id = array_flip($ex_sem_id);
        }
    }
    if (!$GLOBALS['perm']->have_perm('root') && !$GLOBALS['perm']->have_studip_perm('admin', $inst_id)) {
        $addquery .= " AND visible = 1 ";
    }
    if (count($ex_sem_class) > 0) {
        $allowed_sem_types = array();
        foreach (array_keys($ex_sem_class) as $semclassid) {
            $allowed_sem_types += array_keys(SeminarCategories::get($semclassid)->getTypes());
        }
        $addquery .= " AND seminare.status IN (:status) ";
        $parameters[':status'] = $allowed_sem_types;
    } else {
        $addquery .= " AND seminare.status NOT IN (:status) ";
        $parameters[':status'] = studygroup_sem_types() ?: '';
    }
    if ($ex_only_homeinst) {
        $query = "SELECT seminare.*,Seminar_id as seminar_id, Institute.Name AS heimateinrichtung\n                  FROM seminare\n                  LEFT JOIN Institute USING (Institut_id)\n                  WHERE Institut_id = :institute_id {$addquery}\n                  ORDER BY " . $order;
        $parameters[':institute_id'] = $inst_id;
    } else {
        $query = "SELECT seminare.*,Seminar_id as seminar_id, Institute.Name AS heimateinrichtung\n                  FROM seminar_inst\n                  LEFT JOIN seminare USING (Seminar_id)\n                  LEFT JOIN Institute ON seminare.Institut_id = Institute.Institut_id\n                  WHERE seminar_inst.Institut_id = :institute_id {$addquery}\n                  ORDER BY " . $order;
        $parameters[':institute_id'] = $inst_id;
    }
    $statement = DBManager::get()->prepare($query);
    $statement->execute($parameters);
    $data = $statement->fetchAll(PDO::FETCH_ASSOC);
    $data_object .= xml_open_tag($xml_groupnames_lecture['group']);
    foreach ($data as $row) {
        if (is_array($ex_sem_id) && !isset($ex_sem_id[$row['seminar_id']])) {
            continue;
        }
        $group_string = '';
        if ($do_group && $group != $row[$group_tab_zelle]) {
            if ($group != 'FIRSTGROUP') {
                $group_string .= xml_close_tag($xml_groupnames_lecture['subgroup1']);
            }
            if ($group_tab_zelle == 'status') {
                $group_string .= xml_open_tag($xml_groupnames_lecture['subgroup1'], $SEM_TYPE[$row[$group_tab_zelle]]['name']);
            } else {
                $group_string .= xml_open_tag($xml_groupnames_lecture['subgroup1'], $row[$group_tab_zelle]);
            }
            $group = $row[$group_tab_zelle];
            if ($do_subgroup && $subgroup == $row[$subgroup_tab_zelle]) {
                $subgroup = "NEXTGROUP";
            }
        }
        if ($do_subgroup && $subgroup != $row[$subgroup_tab_zelle]) {
            if ($subgroup != 'FIRSTGROUP') {
                $group_string = xml_close_tag($xml_groupnames_lecture['subgroup2']) . $group_string;
            }
            $group_string .= xml_open_tag($xml_groupnames_lecture['subgroup2'], $row[$subgroup_tab_zelle]);
            $subgroup = $row[$subgroup_tab_zelle];
        }
        $data_object .= $group_string;
        $object_counter += 1;
        $data_object .= xml_open_tag($xml_groupnames_lecture['object'], $row['seminar_id']);
        $sem_obj = new Seminar($row['seminar_id']);
        while (list($key, $val) = each($xml_names_lecture)) {
            if ($val == '') {
                $val = $key;
            }
            if ($key == 'status') {
                $data_object .= xml_tag($val, $SEM_TYPE[$row[$key]]['name']);
            } elseif ($key == 'ort') {
                $data_object .= xml_tag($val, $sem_obj->getDatesTemplate('dates/seminar_export_location'));
            } elseif ($key == 'bereich' && $SEM_CLASS[$SEM_TYPE[$row['status']]['class']]['bereiche']) {
                $data_object .= xml_open_tag($xml_groupnames_lecture['childgroup3']);
                $pathes = get_sem_tree_path($row['seminar_id']);
                if (is_array($pathes)) {
                    foreach ($pathes as $path_name) {
                        $data_object .= xml_tag($val, $path_name);
                    }
                } else {
                    $data_object .= xml_tag($val, 'n.a.');
                }
                $data_object .= xml_close_tag($xml_groupnames_lecture['childgroup3']);
            } elseif ($key == 'admission_turnout') {
                $data_object .= xml_open_tag($val, $row['admission_type'] ? _('max.') : _('erw.'));
                $data_object .= $row[$key];
                $data_object .= xml_close_tag($val);
            } elseif ($key == 'teilnehmer_anzahl_aktuell') {
                $count_statement->execute(array($row['seminar_id']));
                $count = $count_statement->fetchColumn();
                $count_statement->closeCursor();
                $data_object .= xml_tag($val, $count);
            } elseif ($key == 'metadata_dates') {
                $data_object .= xml_open_tag($xml_groupnames_lecture['childgroup1']);
                $vorb = vorbesprechung($row['seminar_id'], 'export');
                if ($vorb != false) {
                    $data_object .= xml_tag($val[0], $vorb);
                }
                if (($first_date = SeminarDB::getFirstDate($row['seminar_id'])) && count($first_date)) {
                    $really_first_date = new SingleDate($first_date[0]);
                    $data_object .= xml_tag($val[1], $really_first_date->getDatesExport());
                }
                $data_object .= xml_tag($val[2], $sem_obj->getDatesExport());
                $data_object .= xml_close_tag($xml_groupnames_lecture["childgroup1"]);
            } elseif ($key == 'Institut_id') {
                $data_object .= xml_tag($val, $row['heimateinrichtung'], array('key' => $row[$key]));
            } elseif ($row[$key] != '') {
                $data_object .= xml_tag($val, $row[$key]);
            }
        }
        $data_object .= "<" . $xml_groupnames_lecture['childgroup2'] . ">\n";
        $inner_statement->execute(array($row['seminar_id']));
        while ($inner = $inner_statement->fetch(PDO::FETCH_ASSOC)) {
            if ($ex_person_details) {
                $persons[$inner['user_id']] = true;
            }
            $content_string = $inner['Vorname'] . ' ' . $inner['Nachname'];
            if ($inner['title_front'] != '') {
                $content_string = $inner['title_front'] . ' ' . $content_string;
            }
            if ($inner['title_rear'] != '') {
                $content_string .= ', ' . $inner['title_rear'];
            }
            $data_object .= xml_tag($xml_groupnames_lecture['childobject2'], $content_string, array('key' => $inner['username']));
        }
        $data_object .= xml_close_tag($xml_groupnames_lecture['childgroup2']);
        // freie Datenfelder ausgeben
        $data_object .= export_datafields($row['seminar_id'], $xml_groupnames_lecture['childgroup4'], $xml_groupnames_lecture['childobject4'], 'sem', $row['status']);
        $data_object .= xml_close_tag($xml_groupnames_lecture['object']);
        reset($xml_names_lecture);
        output_data($data_object, $o_mode);
        $data_object = '';
    }
    if ($do_subgroup && $subgroup != 'FIRSTGROUP') {
        $data_object .= xml_close_tag($xml_groupnames_lecture['subgroup2']);
    }
    if ($do_group && $group != 'FIRSTGROUP') {
        $data_object .= xml_close_tag($xml_groupnames_lecture['subgroup1']);
    }
    $data_object .= xml_close_tag($xml_groupnames_lecture['group']);
    output_data($data_object, $o_mode);
}
Example #4
0
 /**
  * globally deactivates the studygroups
  *
  * @return void
  */
 function deactivate_action()
 {
     global $perm;
     $perm->check("root");
     PageLayout::setHelpKeyword('Admin.Studiengruppen');
     $query = "SELECT COUNT(*) FROM seminare WHERE status IN (?)";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array(studygroup_sem_types()));
     if (($count = $statement->fetchColumn()) != 0) {
         $this->flash['messages'] = array('error' => array('title' => sprintf(_("Sie können die Studiengruppen nicht deaktivieren, da noch %s Studiengruppen vorhanden sind!"), $count)));
     } else {
         Config::get()->store("STUDYGROUPS_ENABLE", false);
         $this->flash['success'] = _("Die Studiengruppen wurden deaktiviert.");
     }
     $this->redirect('course/studygroup/globalmodules');
 }
Example #5
0
 /**
  * Processes a finished wizard step by saving the gathered values to
  * session.
  * @param int $step_number the step we are at.
  * @param String $temp_id temporary ID for the course to create
  */
 public function process_action($step_number, $temp_id)
 {
     $this->temp_id = $temp_id;
     // Get request data and store it in session.
     $iterator = Request::getInstance()->getIterator();
     $values = array();
     while ($iterator->valid()) {
         $values[$iterator->key()] = $iterator->current();
         $iterator->next();
     }
     if ($this->steps[$step_number]['classname']) {
         $this->setStepValues($this->steps[$step_number]['classname'], $values);
     }
     // Back or forward button clicked -> set next step accordingly.
     if (Request::submitted('back')) {
         $next_step = $this->getNextRequiredStep($step_number, 'down');
     } else {
         if (Request::submitted('next')) {
             // Validate given data.
             if ($this->getStep($step_number)->validate($this->getValues())) {
                 $next_step = $this->getNextRequiredStep($step_number, 'up');
                 /*
                  * Validation failed -> stay on current step. Error messages are
                  * provided via the called step class validation method.
                  */
             } else {
                 $next_step = $step_number;
             }
             // The "create" button was clicked -> create course.
         } else {
             if (Request::submitted('create')) {
                 $_SESSION['coursewizard'][$this->temp_id]['copy_basic_data'] = Request::submitted('copy_basic_data');
                 if ($this->getValues()) {
                     if ($this->course = $this->createCourse()) {
                         // A studygroup has been created.
                         if (in_array($this->course->status, studygroup_sem_types() ?: array())) {
                             $message = MessageBox::success(sprintf(_('Die Studien-/Arbeitsgruppe "%s" wurde angelegt. ' . 'Sie können Sie direkt hier weiter verwalten.'), $this->course->name));
                             $target = $this->url_for('course/studygroup/edit/' . $this->course->id . '?cid=' . $this->course->id);
                             // "Normal" course.
                         } else {
                             if (Request::int('dialog')) {
                                 $message = MessageBox::success(sprintf(_('Die Veranstaltung "%s" wurde angelegt.'), $this->course->getFullname()));
                                 $target = $this->url_for('admin/courses');
                             } else {
                                 $message = MessageBox::success(sprintf(_('Die Veranstaltung "%s" wurde angelegt. Sie können Sie direkt hier weiter verwalten.'), $this->course->getFullname()));
                                 $target = $this->url_for('course/management?cid=' . $this->course->id);
                             }
                         }
                         PageLayout::postMessage($message);
                         $this->redirect($target);
                     } else {
                         PageLayout::postMessage(MessageBox::error(sprintf(_('Die Veranstaltung "%s" konnte nicht angelegt werden.'), $this->course->getFullname())));
                     }
                 } else {
                     PageLayout::postMessage(MessageBox::error(_('Die angegebene Veranstaltung wurde bereits angelegt.')));
                     $this->redirect('course/wizard');
                 }
                 $stop = true;
                 /*
                  * Something other than "back", "next" or "create" was clicked,
                  * e.g. QuickSearch
                  * -> stay on current step and process given values.
                  */
             } else {
                 $stepclass = $this->steps[$step_number]['classname'];
                 $result = $this->getStep($step_number)->alterValues($this->getValues());
                 $_SESSION['coursewizard'][$temp_id][$stepclass] = $result;
                 $next_step = $step_number;
             }
         }
     }
     if (!$stop) {
         // We are after the last step -> all done, show summary.
         if ($next_step >= sizeof($this->steps)) {
             $this->redirect($this->url_for('course/wizard/summary', $next_step, $temp_id));
             // Redirect to next step.
         } else {
             $this->redirect($this->url_for('course/wizard/step', $next_step, $this->temp_id));
         }
     }
 }
Example #6
0
 /**
  * Provides a dialog to move or copy selected users to another course.
  */
 public function select_course_action()
 {
     if (Request::submitted('submit')) {
         CSRFProtection::verifyUnsafeRequest();
         $this->flash['users_to_send'] = Request::getArray('users');
         $this->flash['target_course'] = Request::option('course_id');
         $this->flash['move'] = Request::int('move');
         $this->redirect('course/members/send_to_course');
     } else {
         global $perm;
         if ($perm->have_perm('root')) {
             $parameters = array('semtypes' => studygroup_sem_types() ?: array(), 'exclude' => array($GLOBALS['SessSemName'][1]));
         } else {
             if ($perm->have_perm('admin')) {
                 $parameters = array('semtypes' => studygroup_sem_types() ?: array(), 'institutes' => array_map(function ($i) {
                     return $i['Institut_id'];
                 }, Institute::getMyInstitutes()), 'exclude' => array($GLOBALS['SessSemName'][1]));
             } else {
                 $parameters = array('userid' => $GLOBALS['user']->id, 'semtypes' => studygroup_sem_types() ?: array(), 'exclude' => array($GLOBALS['SessSemName'][1]));
             }
         }
         $coursesearch = MyCoursesSearch::get('Seminar_id', $GLOBALS['perm']->get_perm(), $parameters);
         $this->search = QuickSearch::get('course_id', $coursesearch)->setInputStyle('width:100%')->withButton()->render();
         $this->course_id = Request::option('course_id');
         $this->course_id_parameter = Request::get('course_id_parameter');
         if (!empty($this->flash['users']) || Request::getArray('users')) {
             $users = $this->flash['users'] ?: Request::getArray('users');
             // create a usable array
             foreach ($this->flash['users'] as $user => $val) {
                 if ($val) {
                     $this->users[] = $user;
                 }
             }
             if (Request::isXhr()) {
                 $this->response->add_header('X-Title', _('Zielveranstaltung auswählen'));
             }
         } else {
             if (Request::isXhr()) {
                 $this->response->add_header('X-Dialog-Close', '1');
                 $this->render_nothing();
             } else {
                 $this->redirect('course/members/index');
             }
         }
     }
 }
Example #7
0
 /**
  * Delete an existing user from the database and tidy up
  *
  * @access   public
  * @param    bool delete all documents belonging to the user
  * @return   bool Removal successful?
  */
 function deleteUser($delete_documents = true)
 {
     global $perm;
     // Do we have permission to do so?
     if (!$perm->have_perm("admin")) {
         $this->msg .= "error§" . _("Sie haben keine Berechtigung Accounts zu löschen.") . "§";
         return FALSE;
     }
     if (!$perm->have_perm("root")) {
         if ($this->user_data['auth_user_md5.perms'] == "root") {
             $this->msg .= "error§" . _("Sie haben keine Berechtigung <em>Root-Accounts</em> zu löschen.") . "§";
             return FALSE;
         }
         if ($this->user_data['auth_user_md5.perms'] == "admin" && !$this->adminOK()) {
             $this->msg .= "error§" . _("Sie haben keine Berechtigung diesen Admin-Account zu löschen.") . "§";
             return FALSE;
         }
     }
     $status = studygroup_sem_types();
     // active dozent?
     if (empty($status)) {
         $active_count = 0;
     } else {
         $query = "SELECT SUM(c) AS count FROM (\n                          SELECT COUNT(*) AS c\n                          FROM seminar_user AS su1\n                          INNER JOIN seminar_user AS su2 ON (su1.seminar_id = su2.seminar_id AND su2.status = 'dozent')\n                          INNER JOIN seminare ON (su1.seminar_id = seminare.seminar_id AND seminare.status NOT IN (?))\n                          WHERE su1.user_id = ? AND su1.status = 'dozent'\n                          GROUP BY su1.seminar_id\n                          HAVING c = 1\n                          ORDER BY NULL\n                      ) AS sub";
         $statement = DBManager::get()->prepare($query);
         $statement->execute(array(studygroup_sem_types(), $this->user_data['auth_user_md5.user_id']));
         $active_count = $statement->fetchColumn();
     }
     if ($active_count) {
         $this->msg .= sprintf("error§" . _("<em>%s</em> ist Lehrkraft in %s aktiven Veranstaltungen und kann daher nicht gelöscht werden.") . "§", $this->user_data['auth_user_md5.username'], $active_count);
         return FALSE;
         //founder of studygroup?
     } elseif (get_config('STUDYGROUPS_ENABLE')) {
         $status = studygroup_sem_types();
         if (empty($status)) {
             $group_ids = array();
         } else {
             $query = "SELECT Seminar_id\n                          FROM seminare AS s\n                          LEFT JOIN seminar_user AS su USING (Seminar_id)\n                          WHERE su.status = 'dozent' AND su.user_id = ? AND s.status IN (?)";
             $statement = DBManager::get()->prepare($query);
             $statement->execute(array($this->user_data['auth_user_md5.user_id'], studygroup_sem_types()));
             $group_ids = $statement->fetchAll(PDO::FETCH_COLUMN);
         }
         foreach ($group_ids as $group_id) {
             $sem = Seminar::GetInstance($group_id);
             if (StudygroupModel::countMembers($group_id) > 1) {
                 // check whether there are tutors or even autors that can be promoted
                 $tutors = $sem->getMembers('tutor');
                 $autors = $sem->getMembers('autor');
                 if (count($tutors) > 0) {
                     $new_founder = current($tutors);
                     StudygroupModel::promote_user($new_founder['username'], $sem->getId(), 'dozent');
                     continue;
                 } elseif (count($autors) > 0) {
                     $new_founder = current($autors);
                     StudygroupModel::promote_user($new_founder['username'], $sem->getId(), 'dozent');
                     continue;
                 }
                 // since no suitable successor was found, we are allowed to remove the studygroup
             } else {
                 $sem->delete();
             }
             unset($sem);
         }
     }
     // store user preferred language for sending mail
     $user_language = getUserLanguagePath($this->user_data['auth_user_md5.user_id']);
     // delete documents of this user
     if ($delete_documents) {
         // Remove private file space of this user
         if (Config::get()->PERSONALDOCUMENT_ENABLE) {
             $root_dir = new RootDirectory($this->user_data['auth_user_md5.user_id']);
             $root_dir->delete();
         }
         // Remove other files
         $temp_count = 0;
         $query = "SELECT dokument_id FROM dokumente WHERE user_id = ?";
         $statement = DBManager::get()->prepare($query);
         $statement->execute(array($this->user_data['auth_user_md5.user_id']));
         while ($document_id = $statement->fetchColumn()) {
             if (delete_document($document_id)) {
                 $temp_count++;
             }
         }
         if ($temp_count) {
             $this->msg .= "info§" . sprintf(_("%s Dokumente gelöscht."), $temp_count) . "§";
         }
         // delete empty folders of this user
         $temp_count = 0;
         $query = "SELECT COUNT(*) FROM folder WHERE range_id = ?";
         $count_content = DBManager::get()->prepare($query);
         $query = "DELETE FROM folder WHERE folder_id = ?";
         $delete_folder = DBManager::get()->prepare($query);
         $query = "SELECT folder_id FROM folder WHERE user_id = ? ORDER BY mkdate DESC";
         $statement = DBManager::get()->prepare($query);
         $statement->execute(array($this->user_data['auth_user_md5.user_id']));
         while ($folder_id = $statement->fetchColumn()) {
             $count_content->execute(array($folder_id));
             $count = $count_content->fetchColumn();
             $count_content->closeCursor();
             if (!$count && !doc_count($folder_id)) {
                 $delete_folder->execute(array($folder_id));
                 $temp_count += $delete_folder->rowCount();
             }
         }
         if ($temp_count) {
             $this->msg .= "info§" . sprintf(_("%s leere Ordner gelöscht."), $temp_count) . "§";
         }
         // folder left?
         $query = "SELECT COUNT(*) FROM folder WHERE user_id = ?";
         $statement = DBManager::get()->prepare($query);
         $statement->execute(array($this->user_data['auth_user_md5.user_id']));
         $count = $statement->fetchColumn();
         if ($count) {
             $this->msg .= sprintf("info§" . _("%s Ordner konnten nicht gelöscht werden, da sie noch Dokumente anderer BenutzerInnen enthalten.") . "§", $count);
         }
     }
     // kill all the ressources that are assigned to the user (and all the linked or subordinated stuff!)
     if (Config::get()->RESOURCES_ENABLE) {
         $killAssign = new DeleteResourcesUser($this->user_data['auth_user_md5.user_id']);
         $killAssign->delete();
     }
     $this->re_sort_position_in_seminar_user();
     // delete user from seminars (postings will be preserved)
     $query = "DELETE FROM seminar_user WHERE user_id = ?";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     if (($db_ar = $statement->rowCount()) > 0) {
         $this->msg .= "info§" . sprintf(_("%s Einträge aus Veranstaltungen gelöscht."), $db_ar) . "§";
     }
     // delete user from waiting lists
     $query = "SELECT seminar_id FROM admission_seminar_user WHERE user_id = ?";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     $seminar_ids = $statement->fetchAll(PDO::FETCH_COLUMN);
     $query = "DELETE FROM admission_seminar_user WHERE user_id = ?";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     if (($db_ar = $statement->rowCount()) > 0) {
         $this->msg .= "info§" . sprintf(_("%s Einträge aus Wartelisten gelöscht."), $db_ar) . "§";
         array_map('update_admission', $seminar_ids);
     }
     // delete user from instituts
     $this->logInstUserDel($this->user_data['auth_user_md5.user_id']);
     $query = "DELETE FROM user_inst WHERE user_id = ?";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     if (($db_ar = $statement->rowCount()) > 0) {
         $this->msg .= "info§" . sprintf(_("%s Einträge aus MitarbeiterInnenlisten gelöscht."), $db_ar) . "§";
     }
     // delete user from Statusgruppen
     if ($db_ar = RemovePersonFromAllStatusgruppen(get_username($this->user_data['auth_user_md5.user_id'])) > 0) {
         $this->msg .= "info§" . sprintf(_("%s Einträge aus Funktionen / Gruppen gelöscht."), $db_ar) . "§";
     }
     // delete user from archiv
     $query = "DELETE FROM archiv_user WHERE user_id = ?";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     if (($db_ar = $statement->rowCount()) > 0) {
         $this->msg .= "info§" . sprintf(_("%s Einträge aus den Zugriffsberechtigungen für das Archiv gelöscht."), $db_ar) . "§";
     }
     // delete all personal news from this user
     if ($db_ar = StudipNews::DeleteNewsByAuthor($this->user_data['auth_user_md5.user_id'])) {
         $this->msg .= "info§" . sprintf(_("%s Einträge aus den Ankündigungen gelöscht."), $db_ar) . "§";
     }
     if ($db_ar = StudipNews::DeleteNewsRanges($this->user_data['auth_user_md5.user_id'])) {
         $this->msg .= "info§" . sprintf(_("%s Verweise auf Ankündigungen gelöscht."), $db_ar) . "§";
     }
     //delete entry in news_rss_range
     StudipNews::UnsetRssId($this->user_data['auth_user_md5.user_id']);
     // delete 'Studiengaenge'
     $query = "DELETE FROM user_studiengang WHERE user_id = ?";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     if (($db_ar = $statement->rowCount()) > 0) {
         $this->msg .= "info§" . sprintf(_("%s Zuordnungen zu Studiengängen gelöscht."), $db_ar) . "§";
     }
     // delete all private appointments of this user
     if (get_config('CALENDAR_ENABLE')) {
         $appkills = CalendarEvent::deleteBySQL('range_id = ?', array($this->user_data['auth_user_md5.user_id']));
         if ($appkills) {
             $this->msg .= "info§" . sprintf(_("%s Einträge aus den Terminen gelöscht."), $appkills) . "§";
         }
         // delete membership in group calendars
         if (get_config('CALENDAR_GROUP_ENABLE')) {
             $membershipkills = CalendarUser::deleteBySQL('owner_id = :user_id OR user_id = :user_id', array(':user_id' => $this->user_data['auth_user_md5.user_id']));
             if ($membershipkills) {
                 $this->msg .= 'info§' . sprintf(_('%s Verknüpfungen mit Gruppenterminkalendern gelöscht.'));
             }
         }
     }
     // delete all messages send or received by this user
     $messaging = new messaging();
     $messaging->delete_all_messages($this->user_data['auth_user_md5.user_id']);
     // delete user from all foreign adressbooks and empty own adressbook
     $buddykills = Contact::deleteBySQL('user_id = ?', array($this->user_data['auth_user_md5.user_id']));
     if ($buddykills > 0) {
         $this->msg .= "info§" . sprintf(_("%s Einträge aus Adressbüchern gelöscht."), $buddykills) . "§";
     }
     $contactkills = Contact::deleteBySQL('owner_id = ?', array($this->user_data['auth_user_md5.user_id']));
     if ($contactkills) {
         $this->msg .= sprintf(_('Adressbuch mit %d Einträgen gelöscht.'), $contactkills);
     }
     // delete users groups
     Statusgruppen::deleteBySQL('range_id = ?', array($this->user_data['auth_user_md5.user_id']));
     // remove user from any groups
     StatusgruppeUser::deleteBySQL('user_id = ?', array($this->user_data['auth_user_md5.user_id']));
     // delete all blubber entrys
     $query = "DELETE FROM blubber WHERE user_id = ?";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     if (($db_ar = $statement->rowCount()) > 0) {
         $this->msg .= "info§" . sprintf(_("%s Blubber gelöscht."), $db_ar) . "§";
     }
     // delete the datafields
     $localEntries = DataFieldEntry::removeAll($this->user_data['auth_user_md5.user_id']);
     UserConfigEntry::deleteByUser($this->user_data['auth_user_md5.user_id']);
     // delete all remaining user data
     $queries = array("DELETE FROM kategorien WHERE range_id = ?", "DELETE FROM user_info WHERE user_id = ?", "DELETE FROM user_visibility WHERE user_id = ?", "DELETE FROM user_online WHERE user_id = ?", "DELETE FROM auto_insert_user WHERE user_id = ?", "DELETE FROM roles_user WHERE userid = ?", "DELETE FROM schedule WHERE user_id = ?", "DELETE FROM schedule_seminare WHERE user_id = ?", "DELETE FROM termin_related_persons WHERE user_id = ?", "DELETE FROM user_userdomains WHERE user_id = ?");
     foreach ($queries as $query) {
         DBManager::get()->prepare($query)->execute(array($this->user_data['auth_user_md5.user_id']));
     }
     object_kill_visits($this->user_data['auth_user_md5.user_id']);
     object_kill_views($this->user_data['auth_user_md5.user_id']);
     // delete picture
     $avatar = Avatar::getAvatar($this->user_data["auth_user_md5.user_id"]);
     if ($avatar->is_customized()) {
         $avatar->reset();
         $this->msg .= "info§" . _("Bild gelöscht.") . "§";
     }
     // delete visibility settings
     Visibility::removeUserPrivacySettings($this->user_data['auth_user_md5.user_id']);
     //delete connected users
     if (get_config('ELEARNING_INTERFACE_ENABLE')) {
         if (ELearningUtils::initElearningInterfaces()) {
             foreach ($GLOBALS['connected_cms'] as $cms) {
                 if ($cms->auth_necessary && $cms->user instanceof ConnectedUser) {
                     $user_auto_create = $cms->USER_AUTO_CREATE;
                     $cms->USER_AUTO_CREATE = false;
                     $userclass = strtolower(get_class($cms->user));
                     $connected_user = new $userclass($cms->cms_type, $this->user_data['auth_user_md5.user_id']);
                     if ($ok = $connected_user->deleteUser()) {
                         if ($connected_user->is_connected) {
                             $this->msg .= "info§" . sprintf(_("Der verknüpfte Nutzer %s wurde im System %s gelöscht."), $connected_user->login, $connected_user->cms_type) . "§";
                         }
                     }
                     $cms->USER_AUTO_CREATE = $user_auto_create;
                 }
             }
         }
     }
     // delete deputy entries if necessary
     $query = "DELETE FROM deputies WHERE ? IN (user_id, range_id)";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     $deputyEntries = $statement->rowCount();
     if ($deputyEntries) {
         $this->msg .= "info§" . sprintf(_("%s Einträge in den Vertretungseinstellungen gelöscht."), $deputyEntries) . "§";
     }
     // delete Stud.IP account
     $query = "DELETE FROM auth_user_md5 WHERE user_id = ?";
     $statement = DBManager::get()->prepare($query);
     $statement->execute(array($this->user_data['auth_user_md5.user_id']));
     if (!$statement->rowCount()) {
         $this->msg .= "error§<em>" . _("Fehler:") . "</em> " . $query . "§";
         return FALSE;
     } else {
         $this->msg .= "msg§" . sprintf(_("Benutzer \"%s\" gelöscht."), $this->user_data['auth_user_md5.username']) . "§";
     }
     log_event("USER_DEL", $this->user_data['auth_user_md5.user_id'], NULL, sprintf("%s %s (%s)", $this->user_data['auth_user_md5.Vorname'], $this->user_data['auth_user_md5.Nachname'], $this->user_data['auth_user_md5.username']));
     //log with Vorname Nachname (username) as info string
     // Can we reach the email?
     if ($this->checkMail($this->user_data['auth_user_md5.Email'])) {
         // include language-specific subject and mailbody
         $Zeit = date("H:i:s, d.m.Y", time());
         include "locale/{$user_language}/LC_MAILS/delete_mail.inc.php";
         // send mail
         StudipMail::sendMessage($this->user_data['auth_user_md5.Email'], $subject, $mailbody);
     }
     unset($this->user_data);
     return TRUE;
 }
Example #8
0
 /**
  * Checks for a given seminar_id whether a course is a studygroup
  *
  * @param   string id of a seminar
  *
  * @return  array studygroup
  */
 function isStudygroup($sem_id)
 {
     $sql = "SELECT *\n                FROM seminare\n                WHERE Seminar_id = ? AND status IN (?)";
     $stmt = DBManager::get()->prepare($sql);
     $stmt->execute(array($sem_id, studygroup_sem_types()));
     return $stmt->fetch();
 }