/** * Test wiki_get_visible_subwikis using individual wikis with groups. * * @return void */ public function test_wiki_get_visible_subwikis_with_groups_individual() { global $DB; $this->resetAfterTest(); $this->setAdminUser(); // Setup test data. $course = $this->getDataGenerator()->create_course(); $wikisepind = $this->getDataGenerator()->create_module('wiki', array('course' => $course->id, 'groupmode' => SEPARATEGROUPS, 'wikimode' => 'individual')); $wikivisind = $this->getDataGenerator()->create_module('wiki', array('course' => $course->id, 'groupmode' => VISIBLEGROUPS, 'wikimode' => 'individual')); // Create users. $student = self::getDataGenerator()->create_user(); $student2 = self::getDataGenerator()->create_user(); $student3 = self::getDataGenerator()->create_user(); $teacher = self::getDataGenerator()->create_user(); // Users enrolments. $studentrole = $DB->get_record('role', array('shortname' => 'student')); $teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher')); $this->getDataGenerator()->enrol_user($student->id, $course->id, $studentrole->id, 'manual'); $this->getDataGenerator()->enrol_user($student2->id, $course->id, $studentrole->id, 'manual'); $this->getDataGenerator()->enrol_user($student3->id, $course->id, $studentrole->id, 'manual'); $this->getDataGenerator()->enrol_user($teacher->id, $course->id, $teacherrole->id, 'manual'); // Create groups. $group1 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); $this->getDataGenerator()->create_group_member(array('userid' => $student->id, 'groupid' => $group1->id)); $this->getDataGenerator()->create_group_member(array('userid' => $student2->id, 'groupid' => $group1->id)); $group2 = $this->getDataGenerator()->create_group(array('courseid' => $course->id)); $this->getDataGenerator()->create_group_member(array('userid' => $student2->id, 'groupid' => $group2->id)); $this->getDataGenerator()->create_group_member(array('userid' => $student3->id, 'groupid' => $group2->id)); $this->setUser($student); // Create all the possible subwikis to be returned. We haven't created any page so ids will be -1. // Subwikis in individual wikis: 1 subwiki per user and group. If user doesn't belong to any group then groupid is 0. $swsepindg1s1 = new stdClass(); $swsepindg1s1->id = -1; $swsepindg1s1->wikiid = $wikisepind->id; $swsepindg1s1->groupid = $group1->id; $swsepindg1s1->userid = $student->id; $swsepindg1s2 = clone $swsepindg1s1; $swsepindg1s2->userid = $student2->id; $swsepindg2s2 = clone $swsepindg1s2; $swsepindg2s2->groupid = $group2->id; $swsepindg2s3 = clone $swsepindg1s1; $swsepindg2s3->userid = $student3->id; $swsepindg2s3->groupid = $group2->id; $swsepindteacher = clone $swsepindg1s1; $swsepindteacher->userid = $teacher->id; $swsepindteacher->groupid = 0; $swvisindg1s1 = clone $swsepindg1s1; $swvisindg1s1->wikiid = $wikivisind->id; $swvisindg1s2 = clone $swvisindg1s1; $swvisindg1s2->userid = $student2->id; $swvisindg2s2 = clone $swvisindg1s2; $swvisindg2s2->groupid = $group2->id; $swvisindg2s3 = clone $swvisindg1s1; $swvisindg2s3->userid = $student3->id; $swvisindg2s3->groupid = $group2->id; $swvisindteacher = clone $swvisindg1s1; $swvisindteacher->userid = $teacher->id; $swvisindteacher->groupid = 0; // Check that student can get the subwikis from his group in individual wiki with separate groups. $expectedsubwikis = array($swsepindg1s1, $swsepindg1s2); $result = wiki_get_visible_subwikis($wikisepind); $this->assertEquals($expectedsubwikis, $result, '', 0, 10, true); // Check that he can get subwikis from all users and groups in individual wiki with visible groups. $expectedsubwikis = array($swvisindg1s1, $swvisindg1s2, $swvisindg2s2, $swvisindg2s3, $swvisindteacher); $result = wiki_get_visible_subwikis($wikivisind); $this->assertEquals($expectedsubwikis, $result, '', 0, 10, true); // Now test it as a teacher. No need to check visible groups wikis because the result is the same as student. $this->setUser($teacher); // Check that teacher can get the subwikis from all the groups in individual wiki with separate groups. $expectedsubwikis = array($swsepindg1s1, $swsepindg1s2, $swsepindg2s2, $swsepindg2s3, $swsepindteacher); $result = wiki_get_visible_subwikis($wikisepind); $this->assertEquals($expectedsubwikis, $result, '', 0, 10, true); }
/** * Check if the module has any update that affects the current user since a given time. * * @param cm_info $cm course module data * @param int $from the time to check updates from * @param array $filter if we need to check only specific updates * @return stdClass an object with the different type of areas indicating if they were updated or not * @since Moodle 3.2 */ function wiki_check_updates_since(cm_info $cm, $from, $filter = array()) { global $DB, $CFG; require_once $CFG->dirroot . '/mod/wiki/locallib.php'; $updates = new stdClass(); if (!has_capability('mod/wiki:viewpage', $cm->context)) { return $updates; } $updates = course_check_module_updates_since($cm, $from, array('attachments'), $filter); // Check only pages updated in subwikis the user can access. $updates->pages = (object) array('updated' => false); $wiki = $DB->get_record($cm->modname, array('id' => $cm->instance), '*', MUST_EXIST); if ($subwikis = wiki_get_visible_subwikis($wiki, $cm, $cm->context)) { $subwikisids = array(); foreach ($subwikis as $subwiki) { $subwikisids[] = $subwiki->id; } list($subwikissql, $params) = $DB->get_in_or_equal($subwikisids, SQL_PARAMS_NAMED); $select = 'subwikiid ' . $subwikissql . ' AND (timemodified > :since1 OR timecreated > :since2)'; $params['since1'] = $from; $params['since2'] = $from; $pages = $DB->get_records_select('wiki_pages', $select, $params, '', 'id'); if (!empty($pages)) { $updates->pages->updated = true; $updates->pages->itemids = array_keys($pages); } } return $updates; }
/** * Returns the list of subwikis the user can see in a specific wiki. * * @param int $wikiid The wiki instance ID. * @return array Containing a list of warnings and a list of subwikis. * @since Moodle 3.1 */ public static function get_subwikis($wikiid) { global $USER; $warnings = array(); $params = self::validate_parameters(self::get_subwikis_parameters(), array('wikiid' => $wikiid)); // Get wiki instance. if (!($wiki = wiki_get_wiki($params['wikiid']))) { throw new moodle_exception('incorrectwikiid', 'wiki'); } // Validate context and capabilities. list($course, $cm) = get_course_and_cm_from_instance($wiki, 'wiki'); $context = context_module::instance($cm->id); self::validate_context($context); require_capability('mod/wiki:viewpage', $context); $returnedsubwikis = wiki_get_visible_subwikis($wiki, $cm, $context); foreach ($returnedsubwikis as $subwiki) { $subwiki->canedit = wiki_user_can_edit($subwiki); } $result = array(); $result['subwikis'] = $returnedsubwikis; $result['warnings'] = $warnings; return $result; }