diff --git a/app/controllers/course/contentmodules.php b/app/controllers/course/contentmodules.php index 77676a15a61933200be6201f372ab0dbd13e522f..2a661cf01cc5ae7bb3f5dee6e46740fbf77cd768 100644 --- a/app/controllers/course/contentmodules.php +++ b/app/controllers/course/contentmodules.php @@ -101,13 +101,12 @@ class Course_ContentmodulesController extends AuthenticatedController public function trigger_action() { $context = Context::get(); - - $required_perm = $context->getRangeType() === 'course' ? 'tutor' : 'admin'; - if (!$GLOBALS['perm']->have_studip_perm($required_perm, $context->id)) { + if (!$context->isEditableByUser()) { throw new AccessDeniedException(); } + if (Request::isPost()) { - if ($context->getRangeType() === 'course') { + if ($context instanceof Course) { $sem_class = $context->getSemClass(); } else { $sem_class = SemClass::getDefaultInstituteClass($context->type); @@ -129,6 +128,7 @@ class Course_ContentmodulesController extends AuthenticatedController $this->redirect("course/contentmodules/trigger", ['cid' => $context->getId(), 'plugin_id' => $module->getPluginId()]); return; } + $active_tool = ToolActivation::find([$context->id, Request::int('plugin_id')]); $template = $GLOBALS['template_factory']->open('tabs.php'); $template->navigation = Navigation::getItem('/course'); @@ -142,11 +142,10 @@ class Course_ContentmodulesController extends AuthenticatedController public function reorder_action() { $context = Context::get(); - - $required_perm = $context->getRangeType() === 'course' ? 'tutor' : 'admin'; - if (!$GLOBALS['perm']->have_studip_perm($required_perm, $context->id)) { + if (!$context->isEditableByUser()) { throw new AccessDeniedException(); } + if (Request::isPost()) { $position = 0; foreach (Request::getArray('order') as $plugin_id) { @@ -157,6 +156,7 @@ class Course_ContentmodulesController extends AuthenticatedController $this->redirect($this->reorderURL()); return; } + Navigation::getItem('/course/admin')->setActive(true); $template = $GLOBALS['template_factory']->open('tabs.php'); $template->navigation = Navigation::getItem('/course'); @@ -170,12 +170,12 @@ class Course_ContentmodulesController extends AuthenticatedController if (!Request::isPost()) { throw new AccessDeniedException(); } - $context = Context::get(); - $required_perm = $context->getRangeType() === 'course' ? 'tutor' : 'admin'; - if (!$GLOBALS['perm']->have_studip_perm($required_perm, $context->id)) { + $context = Context::get(); + if (!$context->isEditableByUser()) { throw new AccessDeniedException(); } + $moduleclass = Request::get('moduleclass'); $module = new $moduleclass; @@ -208,15 +208,15 @@ class Course_ContentmodulesController extends AuthenticatedController public function rename_action($module_id) { $context = Context::get(); - - $required_perm = $context->getRangeType() === 'course' ? 'tutor' : 'admin'; - if (!$GLOBALS['perm']->have_studip_perm($required_perm, $context->id)) { + if (!$context->isEditableByUser()) { throw new AccessDeniedException(); } + $this->module = PluginManager::getInstance()->getPluginById($module_id); $this->metadata = $this->module->getMetadata(); PageLayout::setTitle(_('Werkzeug umbenennen')); $this->tool = ToolActivation::find([$context->id, $module_id]); + if (Request::isPost()) { $metadata = $this->tool->metadata->getArrayCopy(); if (!trim(Request::get('displayname')) || Request::submitted('delete')) { @@ -359,8 +359,5 @@ class Course_ContentmodulesController extends AuthenticatedController } catch (Exception $e) { return null; } - - - } } diff --git a/lib/models/Institute.php b/lib/models/Institute.php index df344ff2873f3ea9cf46773d7254f8daa3af8f92..a10c1c8902e23e4ad0c6f16cff907033807a2b7d 100644 --- a/lib/models/Institute.php +++ b/lib/models/Institute.php @@ -311,10 +311,11 @@ class Institute extends SimpleORMap implements Range public function isEditableByUser($user_id = null): bool { if ($user_id === null) { - $user_id = $GLOBALS['user']->id; + $user_id = User::findCurrent()->id; } + $member = $this->members->findOneBy('user_id', $user_id); - return ($member && in_array($member->inst_perms, ['tutor', 'dozent', 'admin'])) + return ($member && $member->inst_perms === 'admin') || User::find($user_id)->perms === 'root'; } diff --git a/lib/modules/CoreAdmin.php b/lib/modules/CoreAdmin.php index 81849768a7a645caf10c0f8beb074833a2aa98c9..9cb09419153096700580fbeacecde66b794c1a21 100644 --- a/lib/modules/CoreAdmin.php +++ b/lib/modules/CoreAdmin.php @@ -24,98 +24,111 @@ class CoreAdmin extends CorePlugin implements StudipModule */ public function getTabNavigation($course_id) { - if ($GLOBALS['perm']->have_studip_perm('tutor', $course_id)) { - $navigation = new Navigation(_('Verwaltung')); - $navigation->setImage(Icon::create('admin', Icon::ROLE_INFO_ALT)); - $navigation->setActiveImage(Icon::create('admin', Icon::ROLE_INFO)); - - $main = new Navigation(_('Werkzeuge'), 'dispatch.php/course/contentmodules'); - $navigation->addSubNavigation('contentmodules', $main); - - if (!Context::isInstitute()) { - $item = new Navigation(_('Grunddaten'), 'dispatch.php/course/basicdata/view/' . $course_id); - $item->setImage(Icon::create('edit')); - $item->setDescription(_('Bearbeiten der Grundeinstellungen dieser Veranstaltung.')); - $navigation->addSubNavigation('details', $item); - - $item = new Navigation(_('Veranstaltungsbild'), 'dispatch.php/course/avatar'); - $item->setDescription(_('Infobild dieser Veranstaltung bearbeiten oder löschen.')); - $navigation->addSubNavigation('avatar', $item); - - $item = new Navigation(_('Studienbereiche'), 'dispatch.php/course/study_areas/show/' . $course_id); - $item->setImage(Icon::create('module')); - $item->setDescription(_('Zuordnung dieser Veranstaltung zu Studienbereichen für die Darstellung im Verzeichnis aller Veranstaltungen.')); - $navigation->addSubNavigation('study_areas', $item); - - $current_course = Course::find($course_id); - if ($current_course && $current_course->getSemClass()->offsetGet('module')) { - $item = new Navigation(_('LV-Gruppen'), 'dispatch.php/course/lvgselector/index/' . $course_id, ['list' => 'TRUE']); - $item->setImage(Icon::create('learnmodule')); - $item->setDescription(_('Zuordnung der Veranstaltung zu Lehrveranstaltungsgruppen um die Einordnung innerhalb des Modulverzeichnisses festzulegen.')); - $navigation->addSubNavigation('lvgruppen', $item); - } - - $item = new Navigation(_('Zeiten/Räume'), 'dispatch.php/course/timesrooms'); - $item->setImage(Icon::create('date')); - $item->setDescription(_('Regelmäßige Veranstaltungszeiten, Einzeltermine und Ortsangaben ändern.')); - $navigation->addSubNavigation('dates', $item); - - $item = new Navigation(_('Zugangsberechtigungen'), 'dispatch.php/course/admission'); - $item->setImage(Icon::create('lock-locked')); - $item->setDescription(_('Zugangsbeschränkungen, Anmeldeverfahren oder einen Passwortschutz für diese Veranstaltung einrichten.')); - $navigation->addSubNavigation('admission', $item); - - $item = new AutoNavigation(_('Zusatzangaben'), 'dispatch.php/admin/additional'); - $item->setImage(Icon::create('add')); - $item->setDescription(_('Vorlagen zur Erhebung weiterer Angaben von Teilnehmenden auswählen.')); - $navigation->addSubNavigation('additional_data', $item); - - } // endif modules only seminars - - if ($GLOBALS['perm']->have_studip_perm('tutor', $course_id)) { - if (Config::get()->VOTE_ENABLE) { - $item = new Navigation(_('Fragebögen'), 'dispatch.php/questionnaire/courseoverview'); - $item->setImage(Icon::create('vote')); - $item->setDescription(_('Erstellen und bearbeiten von Fragebögen.')); - $navigation->addSubNavigation('questionnaires', $item); - } + $range = RangeFactory::find($course_id); + + // Given range is invalid, leave early + if (!$range) { + return []; + } + + // Special case: Tutors of institutes may manage votes + if ( + Config::get()->VOTE_ENABLE + && $range instanceof Institute + && !$range->isEditableByUser() + && Seminar_Perm::get()->have_studip_perm('tutor', $range->id) + ) { + $navigation = $this->getRootNavigation(); + $this->addVoteNavigation($navigation); + + return ['admin' => $navigation]; + } + + // User may not edit this range + if (!$range->isEditableByUser()) { + return []; + } + + // Build regular admin navigation + $navigation = $this->getRootNavigation(); + + $main = new Navigation(_('Werkzeuge'), 'dispatch.php/course/contentmodules'); + $navigation->addSubNavigation('contentmodules', $main); + + if ($range instanceof Course) { + $item = new Navigation(_('Grunddaten'), 'dispatch.php/course/basicdata/view/' . $course_id); + $item->setImage(Icon::create('edit')); + $item->setDescription(_('Bearbeiten der Grundeinstellungen dieser Veranstaltung.')); + $navigation->addSubNavigation('details', $item); + + $item = new Navigation(_('Veranstaltungsbild'), 'dispatch.php/course/avatar'); + $item->setDescription(_('Infobild dieser Veranstaltung bearbeiten oder löschen.')); + $navigation->addSubNavigation('avatar', $item); + + $item = new Navigation(_('Studienbereiche'), 'dispatch.php/course/study_areas/show/' . $course_id); + $item->setImage(Icon::create('module')); + $item->setDescription(_('Zuordnung dieser Veranstaltung zu Studienbereichen für die Darstellung im Verzeichnis aller Veranstaltungen.')); + $navigation->addSubNavigation('study_areas', $item); + + if ($range->getSemClass()['module']) { + $item = new Navigation(_('LV-Gruppen'), 'dispatch.php/course/lvgselector/index/' . $course_id, ['list' => 'TRUE']); + $item->setImage(Icon::create('learnmodule')); + $item->setDescription(_('Zuordnung der Veranstaltung zu Lehrveranstaltungsgruppen um die Einordnung innerhalb des Modulverzeichnisses festzulegen.')); + $navigation->addSubNavigation('lvgruppen', $item); } + $item = new Navigation(_('Zeiten/Räume'), 'dispatch.php/course/timesrooms'); + $item->setImage(Icon::create('date')); + $item->setDescription(_('Regelmäßige Veranstaltungszeiten, Einzeltermine und Ortsangaben ändern.')); + $navigation->addSubNavigation('dates', $item); + + $item = new Navigation(_('Zugangsberechtigungen'), 'dispatch.php/course/admission'); + $item->setImage(Icon::create('lock-locked')); + $item->setDescription(_('Zugangsbeschränkungen, Anmeldeverfahren oder einen Passwortschutz für diese Veranstaltung einrichten.')); + $navigation->addSubNavigation('admission', $item); + + $item = new AutoNavigation(_('Zusatzangaben'), 'dispatch.php/admin/additional'); + $item->setImage(Icon::create('add')); + $item->setDescription(_('Vorlagen zur Erhebung weiterer Angaben von Teilnehmenden auswählen.')); + $navigation->addSubNavigation('additional_data', $item); + + } // endif modules only seminars + + if (Config::get()->VOTE_ENABLE) { + $this->addVoteNavigation($navigation); + } + + /* + * Is the current SemClass available for grouping other courses? + * -> show child management + */ + if ($range instanceof Course) { + $c = $range->getSemClass(); + if ($c->isGroup()) { + + $item = new Navigation(_('Unterveranstaltungen'), 'dispatch.php/course/grouping/children'); + $item->setImage(Icon::create('group', Icon::ROLE_INFO_ALT)); + $item->setActiveImage(Icon::create('group', Icon::ROLE_INFO)); + $item->setDescription(_('Ordnen Sie dieser Veranstaltung eine oder mehrere Unterveranstaltungen zu.')); + $navigation->addSubNavigation('children', $item); + /* - * Is the current SemClass available for grouping other courses? - * -> show child management + * Check if any SemClasses with grouping functionality exist at all + * -> show parent assignment. */ - $course = Course::find($course_id); - if ($course) { - $c = $course->getSemClass(); - if ($c->isGroup()) { - - $item = new Navigation(_('Unterveranstaltungen'), 'dispatch.php/course/grouping/children'); - $item->setImage(Icon::create('group', Icon::ROLE_INFO_ALT)); - $item->setActiveImage(Icon::create('group', Icon::ROLE_INFO)); - $item->setDescription(_('Ordnen Sie dieser Veranstaltung eine oder mehrere Unterveranstaltungen zu.')); - $navigation->addSubNavigation('children', $item); - - /* - * Check if any SemClasses with grouping functionality exist at all - * -> show parent assignment. - */ - } else if (count(SemClass::getGroupClasses()) > 0) { - - $item = new Navigation(_('Zuordnung zu Hauptveranstaltung'), 'dispatch.php/course/grouping/parent'); - $item->setImage(Icon::create('group', Icon::ROLE_INFO_ALT)); - $item->setActiveImage(Icon::create('group', Icon::ROLE_INFO)); - $item->setDescription(_('Ordnen Sie diese Veranstaltung einer bestehenden ' . - 'Hauptveranstaltung zu oder lösen Sie eine bestehende Zuordnung.')); - $navigation->addSubNavigation('parent', $item); - - } - } + } else if (count(SemClass::getGroupClasses()) > 0) { - return ['admin' => $navigation]; - } else { - return []; + $item = new Navigation(_('Zuordnung zu Hauptveranstaltung'), 'dispatch.php/course/grouping/parent'); + $item->setImage(Icon::create('group', Icon::ROLE_INFO_ALT)); + $item->setActiveImage(Icon::create('group', Icon::ROLE_INFO)); + $item->setDescription(_('Ordnen Sie diese Veranstaltung einer bestehenden ' . + 'Hauptveranstaltung zu oder lösen Sie eine bestehende Zuordnung.')); + $navigation->addSubNavigation('parent', $item); + + } } + + return ['admin' => $navigation]; } /** @@ -138,4 +151,20 @@ class CoreAdmin extends CorePlugin implements StudipModule // TODO: Implement getInfoTemplate() method. return null; } + + private function getRootNavigation(): Navigation + { + $navigation = new Navigation(_('Verwaltung')); + $navigation->setImage(Icon::create('admin', Icon::ROLE_INFO_ALT)); + $navigation->setActiveImage(Icon::create('admin', Icon::ROLE_INFO)); + return $navigation; + } + + private function addVoteNavigation(Navigation &$navigation): void + { + $item = new Navigation(_('Fragebögen'), 'dispatch.php/questionnaire/courseoverview'); + $item->setImage(Icon::create('vote')); + $item->setDescription(_('Erstellen und bearbeiten von Fragebögen.')); + $navigation->addSubNavigation('questionnaires', $item); + } }