Skip to content
Snippets Groups Projects
Commit 2fb0e9fe authored by Jan-Hendrik Willms's avatar Jan-Hendrik Willms
Browse files

check visibility of courseware structual elements on course overview page, fixes #4588

Closes #4588

Merge request studip/studip!3400
parent 1cb077d6
No related branches found
No related tags found
No related merge requests found
...@@ -171,6 +171,46 @@ class Contents_CoursewareController extends CoursewareController ...@@ -171,6 +171,46 @@ class Contents_CoursewareController extends CoursewareController
$this->sem_courses = $this->getCoursewareCourses($sem_key); $this->sem_courses = $this->getCoursewareCourses($sem_key);
} }
public function pdf_export_action($element_id, $with_children): void
{
$element = \Courseware\StructuralElement::findOneById($element_id);
$this->render_pdf($element->pdfExport($this->user, $with_children), trim($element->title).'.pdf');
}
/**
* To display the shared courseware
*
* @param string $entry_element_id the shared struct element id
*/
public function shared_content_courseware_action($entry_element_id): void
{
global $user;
$navigation = new Navigation(_('Geteiltes Lernmaterial'), 'dispatch.php/contents/courseware/shared_content_courseware/' . $entry_element_id);
Navigation::addItem('/contents/courseware/shared_content_courseware', $navigation);
Navigation::activateItem('/contents/courseware/shared_content_courseware');
$this->entry_element_id = $entry_element_id;
$struct = \Courseware\StructuralElement::findOneBySQL(
"id = ? AND range_type = 'user'",
[$this->entry_element_id]
);
if (!$struct) {
throw new Trails\Exception(404, _('Der geteilte Inhalt kann nicht gefunden werden.'));
}
if (!$struct->canRead($user) && !$struct->canEdit($user)) {
throw new AccessDeniedException();
}
$this->user_id = $struct->owner_id;
$this->setCoursewareSidebar();
}
/** /**
* Return list of coursewares grouped by semester_id * Return list of coursewares grouped by semester_id
* *
...@@ -199,12 +239,17 @@ class Contents_CoursewareController extends CoursewareController ...@@ -199,12 +239,17 @@ class Contents_CoursewareController extends CoursewareController
$courses = new SimpleCollection($courses); $courses = new SimpleCollection($courses);
if (!Config::get()->MY_COURSES_ENABLE_STUDYGROUPS) { if (!Config::get()->MY_COURSES_ENABLE_STUDYGROUPS) {
$courses = $courses->filter(function ($a) { $courses = $courses->filter(function (Course $course) {
return !$a->isStudygroup(); return !$course->isStudygroup();
}); });
} }
if ($sem_key != 'all') { // Filter courses with enabled and visible courseware
$courses = $courses->filter(function (Course $course) {
return $this->isCoursewareEnabledAndVisible($course);
});
if ($sem_key !== 'all') {
$semester = Semester::find($sem_key); $semester = Semester::find($sem_key);
$courses = $courses->filter(function ($a) use ($semester) { $courses = $courses->filter(function ($a) use ($semester) {
...@@ -218,13 +263,15 @@ class Contents_CoursewareController extends CoursewareController ...@@ -218,13 +263,15 @@ class Contents_CoursewareController extends CoursewareController
foreach ($courses as $course) { foreach ($courses as $course) {
$element = StructuralElement::getCoursewareCourse($course->id); $element = StructuralElement::getCoursewareCourse($course->id);
if (!empty($element) && $this->isCoursewareEnabled($course->id)) { if (!$element || !$element->canRead(User::findCurrent())) {
continue;
}
$element['payload'] = json_decode($element['payload'], true); $element['payload'] = json_decode($element['payload'], true);
$coursewares[] = $element; $coursewares[] = $element;
} }
}
if (empty($coursewares)) { if (!$coursewares) {
return []; return [];
} }
...@@ -233,93 +280,58 @@ class Contents_CoursewareController extends CoursewareController ...@@ -233,93 +280,58 @@ class Contents_CoursewareController extends CoursewareController
'coursewares' => $coursewares 'coursewares' => $coursewares
]]; ]];
} else { } else {
$all_semesters = Semester::getAll();
$sem_courses = []; $sem_courses = [];
foreach ($courses as $course) { foreach ($courses as $course) {
$element = StructuralElement::getCoursewareCourse($course->id); $element = StructuralElement::getCoursewareCourse($course->id);
if (!empty($element) && $this->isCoursewareEnabled($course->id)) { if (!$element || !$element->canRead(User::findCurrent())) {
continue;
}
$element['payload'] = json_decode($element['payload'], true); $element['payload'] = json_decode($element['payload'], true);
if ($course->duration_time == -1) { if ($course->isOpenEnded()) {
$sem_courses[$this->current_semester->id]['coursewares'][] = $element; $sem_courses[$this->current_semester->id]['coursewares'][] = $element;
} else { } else {
$end_semester = $course->getEndSemester(); $end_semester = $course->getEndSemester();
$sem_courses[$end_semester->id]['coursewares'][] = $element; $sem_courses[$end_semester->id]['coursewares'][] = $element;
} }
} }
}
return $sem_courses; return $sem_courses;
} }
} }
/** /**
* Returns true if the courseware module is enabled for the passed course * Returns true if the courseware module is enabled and visible for the
* passed course and current user
* *
* @param string $course_id the course to check * @param Course $course the course to check
* @return boolean true if courseware is enabled, false otherwise * @return boolean true if courseware is enabled and visible,
* false otherwise
*/ */
private function isCoursewareEnabled($course_id): bool private function isCoursewareEnabledAndVisible(Course $course): bool
{ {
// Check if courseware is globally enabled
$studip_module = PluginManager::getInstance()->getPlugin(CoursewareModule::class); $studip_module = PluginManager::getInstance()->getPlugin(CoursewareModule::class);
if (!$studip_module) {
if (!$studip_module || !$studip_module->isActivated($course_id)) {
return false; return false;
} }
return true; // Check if courseware is enabled in course
} $active_tool = ToolActivation::find([
$course->id,
$studip_module->getPluginId(),
private function getProjects($purpose): array ]);
{ if (!$active_tool) {
$elements = StructuralElement::findProjects($this->user->id, $purpose); return false;
foreach($elements as &$element) {
$element['payload'] = json_decode($element['payload'], true);
}
return $elements;
}
public function pdf_export_action($element_id, $with_children): void
{
$element = \Courseware\StructuralElement::findOneById($element_id);
$this->render_pdf($element->pdfExport($this->user, $with_children), trim($element->title).'.pdf');
} }
/** // Check visibility
* To display the shared courseware return $GLOBALS['perm']->have_studip_perm(
* $active_tool->getVisibilityPermission(),
* @param string $entry_element_id the shared struct element id $course->id,
*/ User::findCurrent()->id
public function shared_content_courseware_action($entry_element_id): void
{
global $user;
$navigation = new Navigation(_('Geteiltes Lernmaterial'), 'dispatch.php/contents/courseware/shared_content_courseware/' . $entry_element_id);
Navigation::addItem('/contents/courseware/shared_content_courseware', $navigation);
Navigation::activateItem('/contents/courseware/shared_content_courseware');
$this->entry_element_id = $entry_element_id;
$struct = \Courseware\StructuralElement::findOneBySQL(
"id = ? AND range_type = 'user'",
[$this->entry_element_id]
); );
if (!$struct) {
throw new Trails\Exception(404, _('Der geteilte Inhalt kann nicht gefunden werden.'));
}
if (!$struct->canRead($user) && !$struct->canEdit($user)) {
throw new AccessDeniedException();
} }
$this->user_id = $struct->owner_id;
$this->setCoursewareSidebar();
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment