diff --git a/course/tests/behat/activities_visibility_icons.feature b/course/tests/behat/activities_visibility_icons.feature index 382110cc13e..557b378dabf 100644 --- a/course/tests/behat/activities_visibility_icons.feature +++ b/course/tests/behat/activities_visibility_icons.feature @@ -6,16 +6,18 @@ Feature: Toggle activities visibility from the course page Background: Given the following "users" exist: - | username | firstname | lastname | email | - | teacher1 | Teacher | 1 | teacher1@example.com | - | student1 | Student | 1 | student1@example.com | + | username | firstname | lastname | email | + | teacher1 | Teacher | 1 | teacher1@example.com | + | noneditingteacher1 | Non-Editing Teacher | 1 | noneditingteacher1@example.com | + | student1 | Student | 1 | student1@example.com | And the following "courses" exist: | fullname | shortname | format | numsections | | Course 1 | C1 | topics | 2 | And the following "course enrolments" exist: - | user | course | role | - | teacher1 | C1 | editingteacher | - | student1 | C1 | student | + | user | course | role | + | teacher1 | C1 | editingteacher | + | noneditingteacher1 | C1 | teacher | + | student1 | C1 | student | And the following "activities" exist: | activity | course | section | idnumber | name | intro | id_visible | | assign | C1 | 1 | 1 | Test assignment name | Test assignment description | 1 | @@ -53,6 +55,9 @@ Feature: Toggle activities visibility from the course page And the field "Availability" matches value "Hide on course page" And I press "Save and return to course" And "Test forum name" activity should be hidden + # Non-editing teacher should see this activity. + And I am on the "Course 1" course page logged in as noneditingteacher1 + And I should see "Test forum name" in the "region-main" "region" # Student should not see this activity. And I am on the "Course 1" course page logged in as student1 And I should not see "Test forum name" @@ -115,12 +120,12 @@ Feature: Toggle activities visibility from the course page And "Test assignment name" activity should be available but hidden from course page And I turn editing mode off And "Test assignment name" activity should be available but hidden from course page - And I log out + # Non-editing teacher will see the module on the course page: + And I am on the "Course 1" course page logged in as noneditingteacher1 + And I should see "Test assignment name" in the "region-main" "region" # Student will not see the module on the course page but can access it from other reports and blocks: - And I log in as "student1" - And I am on "Course 1" course homepage + And I am on the "Course 1" course page logged in as student1 And "Test assignment name" activity should be hidden And I click on "Test assignment name" "link" in the "Recent activity" "block" And I should see "Test assignment name" And I should see "Submission status" - And I log out diff --git a/lib/modinfolib.php b/lib/modinfolib.php index 06ed6cc8ddc..37d95d55689 100644 --- a/lib/modinfolib.php +++ b/lib/modinfolib.php @@ -2602,10 +2602,13 @@ class cm_info implements IteratorAggregate { $this->availableinfo = ''; } + $capabilities = [ + 'moodle/course:manageactivities', + 'moodle/course:activityvisibility', + 'moodle/course:viewhiddenactivities', + ]; $this->uservisibleoncoursepage = $this->uservisible && - ($this->visibleoncoursepage || - has_capability('moodle/course:manageactivities', $this->get_context(), $userid) || - has_capability('moodle/course:activityvisibility', $this->get_context(), $userid)); + ($this->visibleoncoursepage || has_any_capability($capabilities, $this->get_context(), $userid)); // Activity that is not available, not hidden from course page and has availability // info is actually visible on the course page (with availability info and without a link). if (!$this->uservisible && $this->visibleoncoursepage && $this->availableinfo) { diff --git a/lib/tests/modinfolib_test.php b/lib/tests/modinfolib_test.php index c522527af6b..cd69f15250f 100644 --- a/lib/tests/modinfolib_test.php +++ b/lib/tests/modinfolib_test.php @@ -414,65 +414,119 @@ class modinfolib_test extends advanced_testcase { $this->resetAfterTest(); $this->setAdminUser(); + set_config('allowstealth', true); + // Generate the course and some modules. Make one section hidden. $course = $this->getDataGenerator()->create_course( - array('format' => 'topics', - 'numsections' => 3), - array('createsections' => true)); + ['format' => 'topics', 'numsections' => 3], + ['createsections' => true]); $DB->execute('UPDATE {course_sections} SET visible = 0 WHERE course = ? and section = ?', - array($course->id, 3)); - $coursecontext = context_course::instance($course->id); + [$course->id, 3]); $forum0 = $this->getDataGenerator()->create_module('forum', - array('course' => $course->id), array('section' => 0)); + ['course' => $course->id, 'section' => 0]); $assign0 = $this->getDataGenerator()->create_module('assign', - array('course' => $course->id), array('section' => 0, 'visible' => 0)); + ['course' => $course->id, 'section' => 0, 'visible' => 0]); + $page0 = $this->getDataGenerator()->create_module('page', + ['course' => $course->id, 'section' => 0, 'visibleoncoursepage' => 0]); $forum1 = $this->getDataGenerator()->create_module('forum', - array('course' => $course->id), array('section' => 1)); + ['course' => $course->id, 'section' => 1]); $assign1 = $this->getDataGenerator()->create_module('assign', - array('course' => $course->id), array('section' => 1)); + ['course' => $course->id, 'section' => 1]); $page1 = $this->getDataGenerator()->create_module('page', - array('course' => $course->id), array('section' => 1)); + ['course' => $course->id, 'section' => 1]); $page3 = $this->getDataGenerator()->create_module('page', - array('course' => $course->id), array('section' => 3)); + ['course' => $course->id, 'section' => 3]); $modinfo = get_fast_modinfo($course->id); - $this->assertEquals(array($forum0->cmid, $assign0->cmid, $forum1->cmid, $assign1->cmid, $page1->cmid, $page3->cmid), + $this->assertEquals( + [$forum0->cmid, $assign0->cmid, $page0->cmid, $forum1->cmid, $assign1->cmid, $page1->cmid, $page3->cmid], array_keys($modinfo->cms)); $this->assertEquals($course->id, $modinfo->courseid); $this->assertEquals($USER->id, $modinfo->userid); - $this->assertEquals(array(0 => array($forum0->cmid, $assign0->cmid), - 1 => array($forum1->cmid, $assign1->cmid, $page1->cmid), 3 => array($page3->cmid)), $modinfo->sections); - $this->assertEquals(array('forum', 'assign', 'page'), array_keys($modinfo->instances)); - $this->assertEquals(array($assign0->id, $assign1->id), array_keys($modinfo->instances['assign'])); - $this->assertEquals(array($forum0->id, $forum1->id), array_keys($modinfo->instances['forum'])); - $this->assertEquals(array($page1->id, $page3->id), array_keys($modinfo->instances['page'])); + $this->assertEquals([ + 0 => [$forum0->cmid, $assign0->cmid, $page0->cmid], + 1 => [$forum1->cmid, $assign1->cmid, $page1->cmid], + 3 => [$page3->cmid], + ], $modinfo->sections); + $this->assertEquals(['forum', 'assign', 'page'], array_keys($modinfo->instances)); + $this->assertEquals([$assign0->id, $assign1->id], array_keys($modinfo->instances['assign'])); + $this->assertEquals([$forum0->id, $forum1->id], array_keys($modinfo->instances['forum'])); + $this->assertEquals([$page0->id, $page1->id, $page3->id], array_keys($modinfo->instances['page'])); $this->assertEquals(groups_get_user_groups($course->id), $modinfo->groups); - $this->assertEquals(array(0 => array($forum0->cmid, $assign0->cmid), - 1 => array($forum1->cmid, $assign1->cmid, $page1->cmid), - 3 => array($page3->cmid)), $modinfo->get_sections()); - $this->assertEquals(array(0, 1, 2, 3), array_keys($modinfo->get_section_info_all())); - $this->assertEquals($forum0->cmid . ',' . $assign0->cmid, $modinfo->get_section_info(0)->sequence); + $this->assertEquals([ + 0 => [$forum0->cmid, $assign0->cmid, $page0->cmid], + 1 => [$forum1->cmid, $assign1->cmid, $page1->cmid], + 3 => [$page3->cmid], + ], $modinfo->get_sections()); + $this->assertEquals([0, 1, 2, 3], array_keys($modinfo->get_section_info_all())); + $this->assertEquals($forum0->cmid . ',' . $assign0->cmid . ',' . $page0->cmid, $modinfo->get_section_info(0)->sequence); $this->assertEquals($forum1->cmid . ',' . $assign1->cmid . ',' . $page1->cmid, $modinfo->get_section_info(1)->sequence); $this->assertEquals('', $modinfo->get_section_info(2)->sequence); $this->assertEquals($page3->cmid, $modinfo->get_section_info(3)->sequence); $this->assertEquals($course->id, $modinfo->get_course()->id); $names = array_keys($modinfo->get_used_module_names()); sort($names); - $this->assertEquals(array('assign', 'forum', 'page'), $names); + $this->assertEquals(['assign', 'forum', 'page'], $names); $names = array_keys($modinfo->get_used_module_names(true)); sort($names); - $this->assertEquals(array('assign', 'forum', 'page'), $names); + $this->assertEquals(['assign', 'forum', 'page'], $names); // Admin can see hidden modules/sections. $this->assertTrue($modinfo->cms[$assign0->cmid]->uservisible); + $this->assertTrue($modinfo->cms[$assign0->cmid]->is_visible_on_course_page()); + $this->assertTrue($modinfo->cms[$page0->cmid]->uservisible); + $this->assertTrue($modinfo->cms[$page0->cmid]->is_visible_on_course_page()); $this->assertTrue($modinfo->get_section_info(3)->uservisible); - // Get modinfo for non-current user (without capability to view hidden activities/sections). - $user = $this->getDataGenerator()->create_user(); - $modinfo = get_fast_modinfo($course->id, $user->id); - $this->assertEquals($user->id, $modinfo->userid); - $this->assertFalse($modinfo->cms[$assign0->cmid]->uservisible); - $this->assertFalse($modinfo->get_section_info(3)->uservisible); + $this->assertFalse($modinfo->cms[$assign0->cmid]->is_stealth()); + $this->assertFalse($modinfo->cms[$assign0->cmid]->is_stealth()); + $this->assertTrue($modinfo->cms[$page0->cmid]->is_stealth()); + $this->assertTrue($modinfo->cms[$page3->cmid]->is_stealth()); + + // Get modinfo for user with student role (without capability to view hidden activities/sections). + $student = $this->getDataGenerator()->create_user(); + $this->getDataGenerator()->enrol_user($student->id, $course->id, 'student'); + $studentmodinfo = get_fast_modinfo($course->id, $student->id); + $this->assertEquals($student->id, $studentmodinfo->userid); + $this->assertTrue($studentmodinfo->cms[$forum0->cmid]->uservisible); + $this->assertTrue($studentmodinfo->cms[$forum0->cmid]->is_visible_on_course_page()); + $this->assertFalse($studentmodinfo->cms[$assign0->cmid]->uservisible); + $this->assertFalse($studentmodinfo->cms[$assign0->cmid]->is_visible_on_course_page()); + $this->assertTrue($studentmodinfo->cms[$page0->cmid]->uservisible); + $this->assertFalse($studentmodinfo->cms[$page0->cmid]->is_visible_on_course_page()); + $this->assertFalse($studentmodinfo->get_section_info(3)->uservisible); + $this->assertTrue($studentmodinfo->cms[$page3->cmid]->uservisible); + $this->assertTrue($studentmodinfo->cms[$page3->cmid]->is_visible_on_course_page()); + + // Get modinfo for user with teacher role (with capability to view hidden activities but not sections). + $teacher = $this->getDataGenerator()->create_user(); + $this->getDataGenerator()->enrol_user($teacher->id, $course->id, 'teacher'); + $teachermodinfo = get_fast_modinfo($course->id, $teacher->id); + $this->assertEquals($teacher->id, $teachermodinfo->userid); + $this->assertTrue($teachermodinfo->cms[$forum0->cmid]->uservisible); + $this->assertTrue($teachermodinfo->cms[$forum0->cmid]->is_visible_on_course_page()); + $this->assertTrue($teachermodinfo->cms[$assign0->cmid]->uservisible); + $this->assertTrue($teachermodinfo->cms[$assign0->cmid]->is_visible_on_course_page()); + $this->assertTrue($teachermodinfo->cms[$page0->cmid]->uservisible); + $this->assertTrue($teachermodinfo->cms[$page0->cmid]->is_visible_on_course_page()); + $this->assertFalse($teachermodinfo->get_section_info(3)->uservisible); + $this->assertTrue($teachermodinfo->cms[$page3->cmid]->uservisible); + $this->assertTrue($teachermodinfo->cms[$page3->cmid]->is_visible_on_course_page()); + + // Get modinfo for user with editingteacher role (with capability to view hidden activities/sections). + $editingteacher = $this->getDataGenerator()->create_user(); + $this->getDataGenerator()->enrol_user($editingteacher->id, $course->id, 'editingteacher'); + $editingteachermodinfo = get_fast_modinfo($course->id, $editingteacher->id); + $this->assertEquals($editingteacher->id, $editingteachermodinfo->userid); + $this->assertTrue($editingteachermodinfo->cms[$forum0->cmid]->uservisible); + $this->assertTrue($editingteachermodinfo->cms[$forum0->cmid]->is_visible_on_course_page()); + $this->assertTrue($editingteachermodinfo->cms[$assign0->cmid]->uservisible); + $this->assertTrue($editingteachermodinfo->cms[$assign0->cmid]->is_visible_on_course_page()); + $this->assertTrue($editingteachermodinfo->cms[$page0->cmid]->uservisible); + $this->assertTrue($editingteachermodinfo->cms[$page0->cmid]->is_visible_on_course_page()); + $this->assertTrue($editingteachermodinfo->get_section_info(3)->uservisible); + $this->assertTrue($editingteachermodinfo->cms[$page3->cmid]->uservisible); + $this->assertTrue($editingteachermodinfo->cms[$page3->cmid]->is_visible_on_course_page()); // Attempt to access and set non-existing field. $this->assertTrue(empty($modinfo->somefield));