Forked from
Stud.IP / Stud.IP
3006 commits behind the upstream repository.
-
David Siegfried authored
Closes #1638 Merge request studip/studip!1052
David Siegfried authoredCloses #1638 Merge request studip/studip!1052
Code owners
Assign users and groups as approvers for specific file changes. Learn more.
basicdata.php 35.38 KiB
<?php
# Lifter010: TODO
/*
* studygroup.php - contains Course_BasicdataController
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of
* the License, or (at your option) any later version.
*
* @author Rasmus Fuhse <fuhse@data-quest.de>
* @license http://www.gnu.org/licenses/gpl-2.0.html GPL version 2
* @category Stud.IP
* @since 2.0
*/
class Course_BasicdataController extends AuthenticatedController
{
public $msg = [];
/**
* Set up the list of input fields. Some fields may be locked for
* some reasons (lock rules, insufficient permissions etc.). This
* method does not return anything, it just sets up $this->attributes
* and $this->descriptions.
*
* @param Seminar $sem
*/
private function setupInputFields($sem)
{
$course_id = $sem->getId();
$data = $sem->getData();
$this->attributes = [];
$this->attributes[] = [
'title' => _("Name der Veranstaltung"),
'name' => "course_name",
'must' => true,
'type' => 'text',
'i18n' => true,
'value' => $data['name'],
'locked' => LockRules::Check($course_id, 'Name')
];
$this->attributes[] = [
'title' => _("Untertitel der Veranstaltung"),
'name' => "course_subtitle",
'type' => 'text',
'i18n' => true,
'value' => $data['subtitle'],
'locked' => LockRules::Check($course_id, 'Untertitel')
];
$changable = true;
$this->attributes[] = [
'title' => _('Typ der Veranstaltung'),
'name' => 'course_status',
'must' => true,
'type' => 'select',
'value' => $data['status'],
'locked' => LockRules::Check($course_id, 'status'),
'choices' => $this->_getTypes($sem, $data, $changable),
'changable' => $changable,
];
$this->attributes[] = [
'title' => _("Art der Veranstaltung"),
'name' => "course_form",
'type' => 'text',
'i18n' => true,
'value' => $data['form'],
'locked' => LockRules::Check($course_id, 'art')
];
$course_number_format_config = Config::get()->getMetadata('COURSE_NUMBER_FORMAT');
$this->attributes[] = [
'title' => _("Veranstaltungsnummer"),
'name' => "course_seminar_number",
'type' => 'text',
'value' => $data['seminar_number'],
'locked' => LockRules::Check($course_id, 'VeranstaltungsNummer'),
'description' => $course_number_format_config['comment'],
'pattern' => Config::get()->COURSE_NUMBER_FORMAT
];
$this->attributes[] = [
'title' => _("ECTS-Punkte"),
'name' => "course_ects",
'type' => 'text',
'value' => $data['ects'],
'locked' => LockRules::Check($course_id, 'ects')
];
$this->attributes[] = [
'title' => _("max. Teilnehmendenzahl"),
'name' => "course_admission_turnout",
'must' => false,
'type' => 'number',
'value' => $data['admission_turnout'],
'locked' => LockRules::Check($course_id, 'admission_turnout'),
'min' => '0'
];
$this->attributes[] = [
'title' => _("Beschreibung"),
'name' => "course_description",
'type' => 'textarea',
'i18n' => true,
'value' => $data['description'],
'locked' => LockRules::Check($course_id, 'Beschreibung')
];
$this->institutional = [];
$my_institutes = Institute::getMyInstitutes();
$institutes = Institute::getInstitutes();
foreach ($institutes as $institute) {
if ($institute['Institut_id'] === $data['institut_id']) {
$found = false;
foreach ($my_institutes as $inst) {
if ($inst['Institut_id'] === $institute['Institut_id']) {
$found = true;
break;
}
}
if (!$found) {
$my_institutes[] = $institute;
}
break;
}
}
$this->institutional[] = [
'title' => _('Heimat-Einrichtung'),
'name' => 'course_institut_id',
'must' => true,
'type' => 'nested-select',
'value' => $data['institut_id'],
'choices' => $this->instituteChoices($my_institutes),
'locked' => LockRules::Check($course_id, 'Institut_id')
];
$sem_institutes = $sem->getInstitutes();
$this->institutional[] = [
'title' => _('beteiligte Einrichtungen'),
'name' => 'related_institutes[]',
'type' => 'nested-select',
'value' => array_diff($sem_institutes, [$sem->institut_id]),
'choices' => $this->instituteChoices($institutes),
'locked' => LockRules::Check($course_id, 'seminar_inst'),
'multiple' => true,
];
$this->descriptions = [];
$this->descriptions[] = [
'title' => _("Teilnehmende"),
'name' => "course_participants",
'type' => 'textarea',
'i18n' => true,
'value' => $data['participants'],
'locked' => LockRules::Check($course_id, 'teilnehmer')
];
$this->descriptions[] = [
'title' => _("Voraussetzungen"),
'name' => "course_requirements",
'type' => 'textarea',
'i18n' => true,
'value' => $data['vorrausetzungen'],
'locked' => LockRules::Check($course_id, 'voraussetzungen')
];
$this->descriptions[] = [
'title' => _("Lernorganisation"),
'name' => "course_orga",
'type' => 'textarea',
'i18n' => true,
'value' => $data['orga'],
'locked' => LockRules::Check($course_id, 'lernorga')
];
$this->descriptions[] = [
'title' => _("Leistungsnachweis"),
'name' => "course_leistungsnachweis",
'type' => 'textarea',
'i18n' => true,
'value' => $data['leistungsnachweis'],
'locked' => LockRules::Check($course_id, 'leistungsnachweis')
];
$this->descriptions[] = [
'title' => _("Ort") .
"<br><span style=\"font-size: 0.8em\"><b>" .
_("Achtung:") .
" </b>" .
_("Diese Ortsangabe wird nur angezeigt, wenn keine " .
"Angaben aus Zeiten oder Sitzungsterminen gemacht werden können.") .
"</span>",
'i18n' => true,
'name' => "course_location",
'type' => 'textarea',
'value' => $data['ort'],
'locked' => LockRules::Check($course_id, 'Ort')
];
$datenfelder = DataFieldEntry::getDataFieldEntries($course_id, 'sem', $data["status"]);
if ($datenfelder) {
foreach($datenfelder as $datenfeld) {
if ($datenfeld->isVisible()) {
$locked = !$datenfeld->isEditable()
|| LockRules::Check($course_id, $datenfeld->getID());
$desc = $locked ? _('Diese Felder werden zentral durch die zuständigen Administratoren erfasst.') : $datenfeld->getDescription();
$this->descriptions[] = [
'title' => $datenfeld->getName(),
'must' => $datenfeld->isRequired(),
'name' => "datafield_".$datenfeld->getID(),
'type' => "datafield",
'html_value' => $datenfeld->getHTML("datafields", [
'tooltip' => $desc
]),
'display_value' => $datenfeld->getDisplayValue(),
'locked' => $locked,
'description' => $desc
];
}
}
}
$this->descriptions[] = [
'title' => _("Sonstiges"),
'name' => "course_misc",
'type' => 'textarea',
'value' => $data['misc'],
'locked' => LockRules::Check($course_id, 'Sonstiges')
];
}
/**
* Helper function to populate the list of institute choices.
*
* @param array $institutes
*/
private function instituteChoices($institutes)
{
$faculty_id = null;
$result = [];
foreach ($institutes as $inst) {
$key = $inst['fakultaets_id'] ?? $faculty_id;
if ($inst['is_fak']) {
$result[$inst['Institut_id']] = [
'label' => $inst['Name'],
'children' => [],
];
$faculty_id = $inst['Institut_id'];
} elseif (!isset($result[$key])) {
$result[] = [
'label' => false,
'children' => [$inst['Institut_id'] => $inst['Name']],
];
} else {
$result[$key]['children'][$inst['Institut_id']] = $inst['Name'];
}
}
return $result;
}
/**
* Zeigt die Grunddaten an. Man beachte, dass eventuell zuvor eine andere
* Action wie Set ausgeführt wurde, von der hierher weitergeleitet worden ist.
* Wichtige Daten dazu wurden dann über $this->flash übertragen.
*
* @param string $course_id
*/
public function view_action($course_id = null)
{
$deputies_enabled = Config::get()->DEPUTIES_ENABLE;
//damit QuickSearch funktioniert:
Request::set('new_doz_parameter', $this->flash['new_doz_parameter']);
if ($deputies_enabled) {
Request::set('new_dep_parameter', $this->flash['new_dep_parameter']);
}
Request::set('new_tut_parameter', $this->flash['new_tut_parameter']);
$this->course_id = Request::option('cid', $course_id);
Navigation::activateItem('/course/admin/details');
//Berechtigungscheck:
if (!$GLOBALS['perm']->have_studip_perm('tutor', $this->course_id)) {
throw new AccessDeniedException(_("Sie haben keine Berechtigung diese " .
"Veranstaltung zu verändern."));
}
//Kopf initialisieren:
PageLayout::setHelpKeyword("Basis.VeranstaltungenVerwaltenGrunddaten");
PageLayout::setTitle(_("Verwaltung der Grunddaten"));
if ($this->course_id) {
PageLayout::setTitle(Course::find($this->course_id)->getFullname()." - ".PageLayout::getTitle());
}
//Daten sammeln:
$sem = Seminar::getInstance($this->course_id);
$data = $sem->getData();
//Erster, zweiter und vierter Reiter des Akkordions: Grundeinstellungen
$this->setupInputFields($sem);
$sem_institutes = $sem->getInstitutes();
$this->dozent_is_locked = LockRules::Check($this->course_id, 'dozent');
$this->tutor_is_locked = LockRules::Check($this->course_id, 'tutor');
//Dritter Reiter: Personal
$this->dozenten = $sem->getMembers('dozent');
$instUsers = new SimpleCollection(InstituteMember::findByInstituteAndStatus($sem->getInstitutId(), 'dozent'));
$this->lecturersOfInstitute = $instUsers->pluck('user_id');
if (SeminarCategories::getByTypeId($sem->status)->only_inst_user) {
$search_template = "user_inst_not_already_in_sem";
} else {
$search_template = "user_not_already_in_sem";
}
$this->dozentUserSearch = new PermissionSearch(
$search_template,
sprintf(_("%s suchen"), get_title_for_status('dozent', 1, $sem->status)),
"user_id",
[
'permission' => 'dozent',
'seminar_id' => $this->course_id,
'sem_perm' => 'dozent',
'institute' => $sem_institutes
]
);
$this->dozenten_title = get_title_for_status('dozent', 1, $sem->status);
$this->deputies_enabled = $deputies_enabled;
if ($this->deputies_enabled) {
$this->deputies = Deputy::findDeputies($this->course_id);
$this->deputySearch = new PermissionSearch(
"user_not_already_in_sem_or_deputy",
sprintf(_("%s suchen"), get_title_for_status('deputy', 1, $sem->status)),
"user_id",
['permission' => Deputy::getValidPerms(), 'seminar_id' => $this->course_id]
);
$this->deputy_title = get_title_for_status('deputy', 1, $sem->status);
}
$this->tutoren = $sem->getMembers('tutor');
$this->tutorUserSearch = new PermissionSearch(
$search_template,
sprintf(_("%s suchen"), get_title_for_status('tutor', 1, $sem->status)),
"user_id",
['permission' => ['dozent','tutor'],
'seminar_id' => $this->course_id,
'sem_perm' => ['dozent','tutor'],
'institute' => $sem_institutes
]
);
$this->tutor_title = get_title_for_status('tutor', 1, $sem->status);
$instUsers = new SimpleCollection(InstituteMember::findByInstituteAndStatus($sem->getInstitutId(), 'tutor'));
$this->tutorsOfInstitute = $instUsers->pluck('user_id');
unset($instUsers);
$this->perm_dozent = $GLOBALS['perm']->have_studip_perm("dozent", $this->course_id);
$this->mkstring = $data['mkdate'] ? date("d.m.Y, H:i", $data['mkdate']) : _("unbekannt");
$this->chstring = $data['chdate'] ? date("d.m.Y, H:i", $data['chdate']) : _("unbekannt");
$lockdata = LockRules::getObjectRule($this->course_id);
if (!empty($lockdata['description']) && LockRules::CheckLockRulePermission($this->course_id, $lockdata['permission'])){
$this->flash['msg'] = array_merge((array)$this->flash['msg'], [["info", formatLinks($lockdata['description'])]]);
}
$this->flash->discard(); //schmeißt ab jetzt unnötige Variablen aus der Session.
$sidebar = Sidebar::get();
$widget = new ActionsWidget();
$widget->addLink(_('Bild ändern'),
$this->url_for('avatar/update/course', $course_id),
Icon::create('edit')
);
if ($this->deputies_enabled) {
if (Deputy::isDeputy($GLOBALS['user']->id, $this->course_id)) {
$newstatus = 'dozent';
$text = _('Lehrende werden');
} else if (in_array($GLOBALS['user']->id, array_keys($this->dozenten)) && count($this->dozenten) > 1) {
$newstatus = 'deputy';
$text = _('Vertretung werden');
}
$widget->addLink($text,
$this->url_for('course/basicdata/switchdeputy', $this->course_id, $newstatus),
Icon::create('persons')
);
}
$sidebar->addWidget($widget);
if ($GLOBALS['perm']->have_studip_perm('admin', $this->course_id)) {
$widget = new CourseManagementSelectWidget();
$sidebar->addWidget($widget);
}
}
/**
* Ändert alle Grunddaten der Veranstaltung (bis auf Personal) und leitet
* danach weiter auf View.
*/
public function set_action($course_id)
{
global $perm;
CSRFProtection::verifySecurityToken();
$course_number_format = Config::get()->COURSE_NUMBER_FORMAT;
$sem = Seminar::getInstance($course_id);
$this->msg = [];
$old_settings = $sem->getSettings();
//Seminar-Daten:
if ($perm->have_studip_perm("tutor", $sem->getId())) {
$this->setupInputFields($sem);
$changemade = false;
$invalid_datafields = [];
$all_fields_types = DataFieldEntry::getDataFieldEntries($sem->id, 'sem', $sem->status);
$datafield_values = Request::getArray('datafields');
foreach (array_merge($this->attributes, $this->institutional, $this->descriptions) as $field) {
if (!$field['locked']) {
if ($field['type'] == 'datafield') {
$datafield_id = mb_substr($field['name'], 10);
$datafield = $all_fields_types[$datafield_id];
$datafield->setValueFromSubmit($datafield_values[$datafield_id]);
if ($datafield->isValid()) {
if ($datafield->store()) {
$changemade = true;
}
} else {
$invalid_datafields[] = $datafield->getName();
}
} else if ($field['name'] == 'related_institutes[]') {
// only related_institutes supported for now
if ($sem->setInstitutes(Request::optionArray('related_institutes'))) {
$changemade = true;
}
} else {
// format of input element name is "course_xxx"
$varname = mb_substr($field['name'], 7);
if ($field['i18n']) {
$req_value = Request::i18n($field['name']);
} else {
$req_value = Request::get($field['name']);
}
if ($varname === "name" && !$req_value) {
$this->msg[] = ["error", _("Name der Veranstaltung darf nicht leer sein.")];
} elseif ($varname === "seminar_number" && $req_value && $course_number_format &&
!preg_match('/^' . $course_number_format . '$/', $req_value)) {
$this->msg[] = ['error', _('Die Veranstaltungsnummer hat ein ungültiges Format.')];
} else if ($field['type'] == 'select' && !in_array($req_value, array_flatten(array_values(array_map('array_keys', $field['choices']))))) {
// illegal value - just ignore this
} else if ($sem->{$varname} != $req_value) {
$sem->{$varname} = $req_value;
$changemade = true;
}
}
}
}
//Datenfelder:
if (count($invalid_datafields)) {
$message = ngettext(
'Das folgende Datenfeld der Veranstaltung wurde falsch angegeben, bitte korrigieren Sie dies unter "Beschreibungen": %s',
'Die folgenden Datenfelder der Veranstaltung wurden falsch angegeben, bitte korrigieren Sie dies unter "Beschreibungen": %s',
count($invalid_datafields)
);
$message = sprintf($message, join(', ', array_map('htmlReady', $invalid_datafields)));
$this->msg[] = ['error', $message];
}
$sem->store();
// Logging
$before = array_diff_assoc($old_settings, $sem->getSettings());
$after = array_diff_assoc($sem->getSettings(), $old_settings);
//update admission, if turnout was raised
if($after['admission_turnout'] > $before['admission_turnout'] && $sem->isAdmissionEnabled()) {
update_admission($sem->getId());
}
if (sizeof($before) && sizeof($after)) {
foreach($before as $k => $v) $log_message .= "$k: $v => " . $after[$k] . " \n";
StudipLog::log('CHANGE_BASIC_DATA', $sem->getId(), " ", $log_message);
NotificationCenter::postNotification('SeminarBasicDataDidUpdate', $sem->id , $GLOBALS['user']->id);
}
// end of logging
if ($changemade) {
$this->msg[] = ["msg", _("Die Grunddaten der Veranstaltung wurden verändert.")];
}
} else {
$this->msg[] = ["error", _("Sie haben keine Berechtigung diese Veranstaltung zu verändern.")];
}
//Labels/Funktionen für Dozenten und Tutoren
if ($perm->have_studip_perm("dozent", $sem->getId())) {
foreach (Request::getArray("label") as $user_id => $label) {
$sem->setLabel($user_id, $label);
}
}
foreach($sem->getStackedMessages() as $key => $messages) {
foreach($messages['details'] as $message) {
$this->msg[] = [($key !== "success" ? $key : "msg"), $message];
}
}
$this->flash['msg'] = $this->msg;
$this->flash['open'] = Request::get("open");
$this->redirect($this->url_for('course/basicdata/view/' . $sem->getId()));
}
public function add_member_action($course_id, $status = 'dozent')
{
CSRFProtection::verifySecurityToken();
// load MultiPersonSearch object
$mp = MultiPersonSearch::load("add_member_{$status}{$course_id}");
switch($status) {
case 'tutor' :
$func = 'addTutor';
break;
case 'deputy':
$func = 'addDeputy';
break;
default:
$func = 'addTeacher';
break;
}
$succeeded = [];
$failed = [];
foreach ($mp->getAddedUsers() as $a) {
$result = $this->$func($a, $course_id);
if ($result !== false) {
$succeeded[] = User::find($a)->getFullname('no_title_rev');
} else {
$failed[] = User::find($a)->getFullname('no_title_rev');
}
}
// Only show the success messagebox once
if ($succeeded) {
$sem = Seminar::GetInstance($course_id);
$status_title = get_title_for_status($status, count($succeeded), $sem->status);
if (count($succeeded) > 1) {
$messagetext = sprintf(
_("%u %s wurden hinzugefügt."),
count($succeeded),
$status_title
);
} else {
$messagetext = sprintf(
_('%s wurde hinzugefügt.'),
$status_title
);
}
PageLayout::postSuccess(
htmlReady($messagetext),
array_map('htmlReady', $succeeded),
true
);
}
// only show an error messagebox once with list of errors!
if ($failed) {
PageLayout::postError(
_('Bei den folgenden Nutzer/-innen ist ein Fehler aufgetreten') ,
array_map('htmlReady', $failed)
);
}
$this->flash['open'] = 'bd_personal';
$redirect = Request::get('from', "course/basicdata/view/{$course_id}");
$this->redirect($this->url_for($redirect));
}
private function addTutor($tutor, $course_id)
{
//Tutoren hinzufügen:
if ($GLOBALS['perm']->have_studip_perm('tutor', $course_id)) {
$sem = Seminar::GetInstance($course_id);
if ($sem->addMember($tutor, 'tutor')) {
// Check if we need to add user to course parent as well.
if ($sem->parent_course) {
$this->addTutor($tutor, $sem->parent_course);
}
return true;
}
}
return false;
}
private function addDeputy($user_id, $course_id)
{
//Vertretung hinzufügen:
if ($GLOBALS['perm']->have_studip_perm('dozent', $course_id)) {
$sem = Seminar::GetInstance($course_id);
if (Deputy::addDeputy($user_id, $sem->getId())) {
return true;
}
}
return false;
}
private function addTeacher($dozent, $course_id)
{
$deputies_enabled = Config::get()->DEPUTIES_ENABLE;
$sem = Seminar::GetInstance($course_id);
if ($GLOBALS['perm']->have_studip_perm('dozent', $course_id)) {
if ($sem->addMember($dozent, 'dozent')) {
// Check if we need to add user to course parent as well.
if ($sem->parent_course) {
$this->addTeacher($dozent, $sem->parent_course);
}
// Only applicable when globally enabled and user deputies enabled too
if ($deputies_enabled) {
// Check whether chosen person is set as deputy
// -> delete deputy entry.
$deputy = Deputy::find([$course_id, $dozent]);
if ($deputy) {
$deputy->delete();
}
// Add default deputies of the chosen lecturer...
if (Config::get()->DEPUTIES_DEFAULTENTRY_ENABLE) {
$deputies = Deputy::findDeputies($dozent)->pluck('user_id');
$lecturers = $sem->getMembers();
foreach ($deputies as $deputy) {
// ..but only if not already set as lecturer or deputy.
if (!isset($lecturers[$deputy['user_id']]) && !Deputy::isDeputy($deputy['user_id'], $course_id)) {
Deputy::addDeputy($deputy['user_id'], $course_id);
}
}
}
}
return true;
}
}
return false;
}
/**
* Löscht einen Lehrenden (bis auf den letzten Lehrenden)
* Leitet danach weiter auf View und öffnet den Reiter Personal.
*
* @param string $course_id
* @param string $teacher_id
*/
public function deletedozent_action($course_id, $teacher_id)
{
CSRFProtection::verifyUnsafeRequest();
if (!$GLOBALS['perm']->have_studip_perm('dozent', $course_id)) {
PageLayout::postError(_('Sie haben keine Berechtigung diese Veranstaltung zu verändern.'));
} elseif ($teacher_id === $GLOBALS['user']->id) {
PageLayout::postError(_('Sie dürfen sich nicht selbst aus der Veranstaltung austragen.'));
} else {
$sem = Seminar::getInstance($course_id);
$sem->deleteMember($teacher_id);
// Remove user from subcourses as well.
foreach ($sem->children as $child) {
$child->deleteMember($teacher_id);
}
$this->msg = [];
foreach ($sem->getStackedMessages() as $key => $messages) {
foreach ($messages['details'] as $message) {
$this->msg[] = [
$key !== 'success' ? $key : 'msg',
$message
];
}
}
$this->flash['msg'] = $this->msg;
}
$this->flash['open'] = 'bd_personal';
$this->redirect("course/basicdata/view/{$course_id}");
}
/**
* Löscht einen Stellvertreter.
* Leitet danach weiter auf View und öffnet den Reiter Personal.
*
* @param string $course_id
* @param string $deputy_id
*/
public function deletedeputy_action($course_id, $deputy_id)
{
CSRFProtection::verifyUnsafeRequest();
if (!$GLOBALS['perm']->have_studip_perm('dozent', $course_id)) {
PageLayout::postError(_('Sie haben keine Berechtigung diese Veranstaltung zu verändern.'));
} elseif ($deputy_id === $GLOBALS['user']->id) {
PageLayout::postError(_('Sie dürfen sich nicht selbst aus der Veranstaltung austragen.'));
} else {
$sem = Seminar::getInstance($course_id);
$deputy = Deputy::find([$course_id, $deputy_id]);
if ($deputy && $deputy->delete()) {
// Remove user from subcourses as well.
if (count($sem->children)) {
$children_ids = $sem->children->pluck('seminar_id');
Deputy::deleteBySQL('user_id = ? AND range_id IN (?)', [$deputy_id, $children_ids]);
}
PageLayout::postSuccess(sprintf(
_('%s wurde entfernt.'),
htmlReady(get_title_for_status('deputy', 1, $sem->status))
));
} else {
PageLayout::postError(sprintf(
_('%s konnte nicht entfernt werden.'),
htmlReady(get_title_for_status('deputy', 1, $sem->status))
));
}
}
$this->flash['open'] = 'bd_personal';
$this->redirect("course/basicdata/view/{$course_id}");
}
/**
* Löscht einen Tutor
* Leitet danach weiter auf View und öffnet den Reiter Personal.
*
* @param string $course_id
* @param string $tutor_id
*/
public function deletetutor_action($course_id, $tutor_id)
{
CSRFProtection::verifyUnsafeRequest();
if (!$GLOBALS['perm']->have_studip_perm('dozent', $course_id)) {
PageLayout::postError( _('Sie haben keine Berechtigung diese Veranstaltung zu verändern.'));
} else {
$sem = Seminar::getInstance($course_id);
$sem->deleteMember($tutor_id);
// Remove user from subcourses as well.
foreach ($sem->children as $child) {
$child->deleteMember($tutor_id);
}
$this->msg = [];
foreach ($sem->getStackedMessages() as $key => $messages) {
foreach ($messages['details'] as $message) {
$this->msg[] = [
$key !== 'success' ? $key : 'msg',
$message
];
}
}
$this->flash['msg'] = $this->msg;
}
$this->flash['open'] = 'bd_personal';
$this->redirect("course/basicdata/view/{$course_id}");
}
/**
* Falls eine Person in der >>Reihenfolge<< hochgestuft werden soll.
* Leitet danach weiter auf View und öffnet den Reiter Personal.
*
* @param md5 $user_id
* @param string $status
*/
public function priorityupfor_action($course_id, $user_id, $status = "dozent")
{
global $user, $perm;
CSRFProtection::verifySecurityToken();
$sem = Seminar::getInstance($course_id);
$this->msg = [];
if ($perm->have_studip_perm("dozent", $sem->getId())) {
$teilnehmer = $sem->getMembers($status);
$members = [];
foreach($teilnehmer as $key => $member) {
$members[] = $member["user_id"];
}
foreach($members as $key => $member) {
if ($key > 0 && $member == $user_id) {
$temp_member = $members[$key-1];
$members[$key-1] = $member;
$members[$key] = $temp_member;
}
}
$sem->setMemberPriority($members, $status);
} else {
$this->msg[] = ["error", _("Sie haben keine Berechtigung diese Veranstaltung zu verändern.")];
}
$this->flash['msg'] = $this->msg;
$this->flash['open'] = "bd_personal";
$this->redirect($this->url_for('course/basicdata/view/' . $sem->getId()));
}
/**
* Falls eine Person in der >>Reihenfolge<< runtergestuft werden soll.
* Leitet danach weiter auf View und öffnet den Reiter Personal.
*
* @param md5 $user_id
* @param string $status
*/
public function prioritydownfor_action($course_id, $user_id, $status = "dozent")
{
global $user, $perm;
CSRFProtection::verifySecurityToken();
$sem = Seminar::getInstance($course_id);
$this->msg = [];
if ($perm->have_studip_perm("dozent", $sem->getId())) {
$teilnehmer = $sem->getMembers($status);
$members = [];
foreach($teilnehmer as $key => $member) {
$members[] = $member["user_id"];
}
foreach($members as $key => $member) {
if ($key < count($members)-1 && $member == $user_id) {
$temp_member = $members[$key+1];
$members[$key+1] = $member;
$members[$key] = $temp_member;
}
}
$sem->setMemberPriority($members, $status);
} else {
$this->msg[] = ["error", _("Sie haben keine Berechtigung diese Veranstaltung zu verändern.")];
}
$this->flash['msg'] = $this->msg;
$this->flash['open'] = "bd_personal";
$this->redirect($this->url_for('course/basicdata/view/' . $sem->getId()));
}
public function switchdeputy_action($course_id, $newstatus) {
CSRFProtection::verifySecurityToken();
$course = Seminar::getInstance($course_id);
switch($newstatus) {
case 'dozent':
$dozent = new CourseMember();
$dozent->seminar_id = $course_id;
$dozent->user_id = $GLOBALS['user']->id;
$dozent->status = 'dozent';
$dozent->comment = '';
if ($dozent->store()) {
$deputy = Deputy::find([$course_id, $GLOBALS['user']->id]);
if ($deputy) {
$deputy->delete();
}
PageLayout::postSuccess(sprintf(_('Sie wurden als %s eingetragen.'),
htmlReady(get_title_for_status('dozent', 1))));
} else {
PageLayout::postError(sprintf(_('Sie konnten nicht als %s eingetragen werden.'),
htmlReady(get_title_for_status('dozent', 1))));
}
break;
case 'deputy':
$dozent = Course::find($course_id)->members->findOneBy('user_id', $GLOBALS['user']->id);
if (Deputy::addDeputy($GLOBALS['user']->id, $course_id)) {
$dozent->delete();
PageLayout::postSuccess(_('Sie wurden als Vertretung eingetragen.'));
} else {
PageLayout::postError(_('Sie konnten nicht als Vertretung eingetragen werden.'));
}
break;
}
$this->flash['open'] = "bd_personal";
$this->redirect($this->url_for('course/basicdata/view/'.$course_id));
}
private function _getTypes($sem, $data, &$changable = true)
{
$sem_types = [];
if ($GLOBALS['perm']->have_perm("admin")) {
foreach (SemClass::getClasses() as $sc) {
if (!$sc['course_creation_forbidden']) {
$sem_types[$sc['name']] = array_map(function ($st) {
return $st['name'];
}, $sc->getSemTypes());
}
}
} else {
$sc = $sem->getSemClass();
$sem_types[$sc['name']] = array_map(function ($st) {
return $st['name'];
}, $sc->getSemTypes());
}
if (!in_array($data['status'], array_flatten(array_values(array_map('array_keys', $sem_types))))) {
$class_name = $sem->getSemClass()->offsetGet('name');
if (!isset($sem_types[$class_name])) {
$sem_types[$class_name] = [];
}
$sem_types[$class_name][] = $sem->getSemType()->offsetGet('name');
$changable = false;
}
return $sem_types;
}
}