* @author Michael Riehemann * @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2 * @category Stud.IP * @package admin * @since 2.1 */ class Admin_AutoinsertController extends AuthenticatedController { /** * Common tasks for all actions. */ public function before_filter(&$action, &$args) { parent::before_filter($action, $args); // user must have root permission $GLOBALS['perm']->check('root'); Navigation::activateItem('/admin/user/auto_insert'); PageLayout::setTitle(_('Automatisiertes Eintragen verwalten')); PageLayout::setHelpKeyword('Admins.AutomatisiertesEintragen'); } /** * Maintenance view for the auto insert parameters * */ public function index_action($group = 'by_course') { // search seminars if (Request::submitted('suchen')) { if (Request::get('sem_search')) { $this->sem_search = Request::get('sem_search'); $this->sem_select = Request::option('sem_select'); $search = new SeminarSearch(); $this->seminar_search = $search->getResults (Request::get('sem_search'), ['search_sem_sem' => Request::option('sem_select')] ); if (count($this->seminar_search) == 0) { PageLayout::postInfo(_('Es wurden keine Veranstaltungen gefunden.')); } } else { PageLayout::postError(_('Bitte geben Sie einen Suchparameter ein.')); } } $entries = AutoInsert::getAllSeminars(); $this->auto_sems = []; if ($group == 'by_course') { foreach ($entries as $entry) { $this->auto_sems[$entry['seminar_id']][$entry['range_type']][] = $entry; } } else if ($group == 'by_type') { } $this->range_types = AutoInsert::getRangeTypes(); $this->grouping = $group; $domains = []; $domains[] = [ 'id' => 'keine', 'name' => _('Ohne Domäne'), ]; foreach (UserDomain::getUserDomains() as $domain) { $domains[] = $domain; } $this->userdomains = $domains; $this->degrees = Degree::findBySQL("1 ORDER BY `name`"); $this->subjects = Fach::findBySQL("1 ORDER BY `name`"); $views = new ViewsWidget(); $views->addLink( _('nach Veranstaltung'), $this->link_for('admin/autoinsert/index/by_course') )->setActive($group == 'by_course'); $views->addLink( _('nach Art der Zuordnung'), $this->link_for('admin/autoinsert/index/by_type') )->setActive($group == 'by_type'); Sidebar::get()->addWidget($views); $links = new ActionsWidget(); $links->addLink( _('Benutzergruppen manuell eintragen'), $this->manualURL(), Icon::create('visibility-visible') ); Sidebar::get()->addWidget($links); } /** * Create a new seminar for auto insert */ public function new_action() { if (Request::submitted('anlegen')) { $sem_id = Request::option('sem_id'); $entries = Request::getArray('rechte'); if (empty($entries)) { PageLayout::postError(_('Mindestens ein Eintrag sollte selektiert werden!')); } else { foreach ($entries as $type => $assignments) { switch ($type) { // Old behaviour: domain assignments case 'domain': foreach ($assignments as $id => $rechte) { if ($id === 'keine') $id = ''; if (!AutoInsert::checkSeminar($sem_id, $id)) { AutoInsert::saveSeminar($sem_id, $rechte, $id, $type); PageLayout::postSuccess(_('Die Zuordnung wurde erfolgreich gespeichert!')); } else { PageLayout::postError(_('Das Seminar wird bereits zu diesem Zweck verwendet!')); } } break; // Institute assignments with permission level case 'institute': foreach ($assignments as $rechte) { $id = Request::option('institute_id'); if (!AutoInsert::checkSeminar($sem_id, $id, $type)) { AutoInsert::saveSeminar($sem_id, $rechte, $id, $type); PageLayout::postSuccess(_('Die Zuordnung wurde erfolgreich gespeichert!')); } else { PageLayout::postError(_('Das Seminar wird bereits zu diesem Zweck verwendet!')); } } break; // Degree and subject assignments case 'degree': case 'subject': foreach ($assignments as $id) { if (!AutoInsert::checkSeminar($sem_id, $id, $type)) { AutoInsert::saveSeminar($sem_id, '', $id, $type); PageLayout::postSuccess(_('Die Zuordnung wurde erfolgreich gespeichert!')); } else { PageLayout::postError(_('Das Seminar wird bereits zu diesem Zweck verwendet!')); } } break; // Semester of study assignments case 'semester': if (!AutoInsert::checkSeminar($sem_id, $assignments, $type)) { AutoInsert::saveSeminar($sem_id, '', $assignments, $type); PageLayout::postSuccess(_('Die Zuordnung wurde erfolgreich gespeichert!')); } else { PageLayout::postError(_('Das Seminar wird bereits zu diesem Zweck verwendet!')); } break; } } } } $this->redirect('admin/autoinsert'); } /** * Edit a rule * * @param string $seminar_id */ public function edit_action($seminar_id) { $domain = Request::get('domain_id'); $status = Request::get('status'); $remove = Request::get('remove'); if ($domain === 'keine') $domain = ''; AutoInsert::updateSeminar($seminar_id, $domain, $status, $remove); PageLayout::postSuccess(_('Die Statusgruppenanpassung wurde erfolgreich übernommen!')); $this->redirect('admin/autoinsert'); } /** * Removes a seminar from the auto-insert list, with modal dialog * * @param string $seminar_id */ public function delete_action($seminar_id, $type, $range_id) { if (!Request::get('back')) { if (Request::int('delete') === 1) { if (AutoInsert::deleteSeminar($seminar_id, $type, $range_id)) { PageLayout::postSuccess(_('Die Zuordnung der Veranstaltung wurde gelöscht!')); } } else { $this->flash['course'] = $seminar_id; $this->flash['type'] = $type; $this->flash['range'] = $range_id; } } $this->redirect('admin/autoinsert'); } /** * Maintenance view for the manual insert parameters * */ public function manual_action() { PageLayout::setTitle(_('Manuelles Eintragen von Nutzergruppen in Veranstaltungen')); if (Request::submitted('submit')) { $filters = array_filter(Request::getArray('filter')); if (!Request::get('sem_id') || Request::get('sem_id') == 'false') { PageLayout::postError(_('Ungültiger Aufruf')); } elseif (!count($filters)) { PageLayout::postError(_('Keine Filterkriterien gewählt')); } else { $seminar = Seminar::GetInstance(Request::option('sem_id')); $group = select_group($seminar->getSemesterStartTime()); $userlookup = new UserLookup(); foreach ($filters as $type => $values) { $userlookup->setFilter($type, $values); } $user_ids = $userlookup->execute(); $real_users = 0; foreach ($user_ids as $user_id) { if (!AutoInsert::checkAutoInsertUser(Request::option('sem_id'), $user_id)) { $seminar->addMember($user_id); $real_users += AutoInsert::saveAutoInsertUser(Request::option('sem_id'), $user_id); } } //messagebox $text = sprintf( _('Es wurden %u von %u möglichen Personen in die Veranstaltung %s eingetragen.'), $real_users, count($user_ids), sprintf( '%s', URLHelper::getLink('dispatch.php/course/details/', ['cid' => $seminar->getId()]), htmlReady($seminar->getName() ) ) ); $details = [_('Etwaige Abweichungen der Personenzahlen enstehen durch bereits vorhandene bzw. wieder ausgetragene Personen.')]; if ($real_users > 0) { PageLayout::postSuccess($text, $details); } else { PageLayout::postInfo($text, $details); } $this->redirect('admin/autoinsert/manual'); } } $this->sem_id = Request::option('sem_id'); $this->sem_search = Request::get('sem_search'); $this->sem_select = Request::option('sem_select'); $this->filtertype = Request::getArray('filtertype'); $this->filter = Request::getArray('filter'); if (count(Request::getArray('remove_filter'))) { $this->filtertype = array_diff($this->filtertype, array_keys(Request::getArray('remove_filter'))); } elseif (Request::submitted('add_filter')) { array_push($this->filtertype, Request::get('add_filtertype')); } if (Request::get('sem_search') and Request::get('sem_select')) { if (Request::get('sem_search')) { $search = new SeminarSearch('number-name'); $this->seminar_search = $search->getResults(Request::get('sem_search'), ['search_sem_sem' => $this->sem_select]); if (count($this->seminar_search) == 0) { PageLayout::postInfo(_('Es wurden keine Veranstaltungen gefunden.')); } } else { PageLayout::postError(_('Im Suchfeld wurde nichts eingetragen!')); } } $this->values = []; foreach ($this->filtertype as $type) { $this->values[$type] = UserLookup::getValuesForType($type); } $this->available_filtertypes = [ 'fach' => _('Studienfach'), 'abschluss' => _('Studienabschluss'), 'fachsemester' => _('Studienfachsemester'), 'institut' => _('Einrichtung'), 'status' => _('Statusgruppe'), 'domain' => _('Domäne') ]; $links = new ActionsWidget(); $links->addLink(_('Übersicht'), $this->indexURL(), Icon::create('edit')); Sidebar::Get()->addWidget($links); } /** * Count how many user a insert */ public function manual_count_action() { $filters = array_filter(Request::getArray('filter')); if (empty($filters)) { $data = ['error' => _('Keine Filterkriterien gewählt')]; } else { $userlookup = new UserLookup(); foreach ($filters as $type => $values) { $userlookup->setFilter($type, $values); } $data = ['users' => count($userlookup->execute())]; } $this->set_content_type('application/json;charset=utf-8'); return $this->render_text(json_encode($data)); } }