/** * Returns course details in an array ready to be printed. * * @global \moodle_database $DB * @param \course_in_list $course * @return array */ public static function get_course_detail_array(\course_in_list $course) { global $DB; $canaccess = $course->can_access(); $format = \course_get_format($course->id); $modinfo = \get_fast_modinfo($course->id); $modules = $modinfo->get_used_module_names(); $sections = array(); if ($format->uses_sections()) { foreach ($modinfo->get_section_info_all() as $section) { if ($section->uservisible) { $sections[] = $format->get_section_name($section); } } } $category = \coursecat::get($course->category); $categoryurl = new \moodle_url('/course/management.php', array('categoryid' => $course->category)); $categoryname = $category->get_formatted_name(); $details = array('fullname' => array('key' => \get_string('fullname'), 'value' => $course->get_formatted_fullname()), 'shortname' => array('key' => \get_string('shortname'), 'value' => $course->get_formatted_shortname()), 'idnumber' => array('key' => \get_string('idnumber'), 'value' => s($course->idnumber)), 'category' => array('key' => \get_string('category'), 'value' => \html_writer::link($categoryurl, $categoryname))); if (has_capability('moodle/site:accessallgroups', $course->get_context())) { $groups = \groups_get_course_data($course->id); $details += array('groupings' => array('key' => \get_string('groupings', 'group'), 'value' => count($groups->groupings)), 'groups' => array('key' => \get_string('groups'), 'value' => count($groups->groups))); } if ($canaccess) { $names = \role_get_names($course->get_context()); $sql = 'SELECT ra.roleid, COUNT(ra.id) AS rolecount FROM {role_assignments} ra WHERE ra.contextid = :contextid GROUP BY ra.roleid'; $rolecounts = $DB->get_records_sql($sql, array('contextid' => $course->get_context()->id)); $roledetails = array(); foreach ($rolecounts as $result) { $a = new \stdClass(); $a->role = $names[$result->roleid]->localname; $a->count = $result->rolecount; $roledetails[] = \get_string('assignedrolecount', 'moodle', $a); } $details['roleassignments'] = array('key' => \get_string('roleassignments'), 'value' => join('<br />', $roledetails)); } if ($course->can_review_enrolments()) { $enrolmentlines = array(); $instances = \enrol_get_instances($course->id, true); $plugins = \enrol_get_plugins(true); foreach ($instances as $instance) { if (!isset($plugins[$instance->enrol])) { // Weird. continue; } $plugin = $plugins[$instance->enrol]; $enrolmentlines[] = $plugin->get_instance_name($instance); } $details['enrolmentmethods'] = array('key' => \get_string('enrolmentmethods'), 'value' => join('<br />', $enrolmentlines)); } if ($canaccess) { $details['format'] = array('key' => \get_string('format'), 'value' => \course_get_format($course)->get_format_name()); $details['sections'] = array('key' => \get_string('sections'), 'value' => join('<br />', $sections)); $details['modulesused'] = array('key' => \get_string('modulesused'), 'value' => join('<br />', $modules)); } return $details; }
/** * Gets an array of all groupings in a specified course. This value is cached * for a single course (so you can call it repeatedly for the same course * without a performance penalty). * * @category group * @param int $courseid return all groupings from course with this courseid * @return array Returns an array of the grouping objects (empty if none) */ function groups_get_all_groupings($courseid) { $data = groups_get_course_data($courseid); return $data->groupings; }
/** * Fetches users based on a supplied course and group. * * @param mixed $course the course to search for users in * @param mixed $group the group to search for users in * @return array of users * @uses $CFG */ function report_ncccscensus_get_users($course, $group = null) { global $CFG; require_once $CFG->libdir . '/accesslib.php'; $excludegroupmembers = false; if ($group === REPORT_NCCCSCENSUS_EXCLUDE_GROUP_MEMBERS) { $excludegroupmembers = true; $group = null; // Set group to null to retrieve all users, then filter out group members. } /* The use of $CFG->gradebookroles and get_role_users() was suggested here: */ /* https://tracker.remote-learner.net/browse/NCCCSDEV-19?focusedCommentId=94023 */ $roles = explode(',', $CFG->gradebookroles); $context = context_course::instance($course); $users = array(); foreach ($roles as $role) { $roleusers = get_role_users($role, $context, false, 'u.id, u.firstname, u.lastname', null, true, $group); foreach ($roleusers as $roleuser) { $users[] = $roleuser->id; } } $users = array_unique($users); // Filter out group members if any. if ($excludegroupmembers) { $groupusers = array(); $groupdata = groups_get_course_data($course); foreach ($groupdata->groups as $groupobject) { foreach ($roles as $role) { $roleusers = get_role_users($role, $context, false, 'u.id', null, true, $groupobject->id); foreach ($roleusers as $roleuser) { $groupusers[] = $roleuser->id; } } } $groupusers = array_unique($groupusers); $users = array_diff($users, $groupusers); } return $users; }
public function test_groups_get_course_data() { $this->resetAfterTest(true); $generator = $this->getDataGenerator(); // Create a course category and course. $cat = $generator->create_category(array('parent' => 0)); $course = $generator->create_course(array('category' => $cat->id)); $grouping1 = $generator->create_grouping(array('courseid' => $course->id, 'name' => 'Grouping 1')); $grouping2 = $generator->create_grouping(array('courseid' => $course->id, 'name' => 'Grouping 2')); $group1 = $generator->create_group(array('courseid' => $course->id, 'name' => 'Group 1')); $group2 = $generator->create_group(array('courseid' => $course->id, 'name' => 'Group 2')); $group3 = $generator->create_group(array('courseid' => $course->id, 'name' => 'Group 3')); $group4 = $generator->create_group(array('courseid' => $course->id, 'name' => 'Group 4')); // Assign the groups to groupings. $this->assertTrue(groups_assign_grouping($grouping1->id, $group1->id)); $this->assertTrue(groups_assign_grouping($grouping1->id, $group2->id)); $this->assertTrue(groups_assign_grouping($grouping2->id, $group3->id)); $this->assertTrue(groups_assign_grouping($grouping2->id, $group4->id)); // Get the data. $data = groups_get_course_data($course->id); $this->assertInstanceOf('stdClass', $data); $this->assertObjectHasAttribute('groups', $data); $this->assertObjectHasAttribute('groupings', $data); $this->assertObjectHasAttribute('mappings', $data); // Test we have the expected items returns. $this->assertCount(4, $data->groups); $this->assertCount(2, $data->groupings); $this->assertCount(4, $data->mappings); // Check we have the expected groups. $this->assertArrayHasKey($group1->id, $data->groups); $this->assertArrayHasKey($group2->id, $data->groups); $this->assertArrayHasKey($group3->id, $data->groups); $this->assertArrayHasKey($group4->id, $data->groups); // Test a group-id is mapped correctly. $this->assertSame($group3->name, $data->groups[$group3->id]->name); // Check we have the expected number of groupings. $this->assertContains($grouping1->id, array_keys($data->groupings)); $this->assertContains($grouping2->id, array_keys($data->groupings)); // Test a grouping-id is mapped correctly. $this->assertEquals($grouping2->name, $data->groupings[$grouping2->id]->name); // Test that all of the mappings are correct. $grouping1maps = 0; $grouping2maps = 0; $group1maps = 0; $group2maps = 0; $group3maps = 0; $group4maps = 0; foreach ($data->mappings as $mapping) { if ($mapping->groupingid === $grouping1->id) { $grouping1maps++; $this->assertContains($mapping->groupid, array($group1->id, $group2->id)); } else { if ($mapping->groupingid === $grouping2->id) { $grouping2maps++; $this->assertContains($mapping->groupid, array($group3->id, $group4->id)); } else { $this->fail('Unexpected groupingid'); } } switch ($mapping->groupid) { case $group1->id: $group1maps++; break; case $group2->id: $group2maps++; break; case $group3->id: $group3maps++; break; case $group4->id: $group4maps++; break; } } $this->assertEquals(2, $grouping1maps); $this->assertEquals(2, $grouping2maps); $this->assertEquals(1, $group1maps); $this->assertEquals(1, $group2maps); $this->assertEquals(1, $group3maps); $this->assertEquals(1, $group4maps); // Test the groups_get_all_groups which uses this functionality. $groups = groups_get_all_groups($course->id); $groupkeys = array_keys($groups); $this->assertCount(4, $groups); $this->assertContains($group1->id, $groupkeys); $this->assertContains($group2->id, $groupkeys); $this->assertContains($group3->id, $groupkeys); $this->assertContains($group4->id, $groupkeys); $groups = groups_get_all_groups($course->id, null, $grouping1->id); $groupkeys = array_keys($groups); $this->assertCount(2, $groups); $this->assertContains($group1->id, $groupkeys); $this->assertContains($group2->id, $groupkeys); $this->assertNotContains($group3->id, $groupkeys); $this->assertNotContains($group4->id, $groupkeys); $groups = groups_get_all_groups($course->id, null, $grouping2->id); $groupkeys = array_keys($groups); $this->assertCount(2, $groups); $this->assertNotContains($group1->id, $groupkeys); $this->assertNotContains($group2->id, $groupkeys); $this->assertContains($group3->id, $groupkeys); $this->assertContains($group4->id, $groupkeys); // Test this function using an alternate column for the result index $groups = groups_get_all_groups($course->id, null, $grouping2->id, 'g.name, g.id'); $groupkeys = array_keys($groups); $this->assertCount(2, $groups); $this->assertNotContains($group3->id, $groupkeys); $this->assertContains($group3->name, $groupkeys); $this->assertEquals($group3->id, $groups[$group3->name]->id); }
/** * Returns the groupingid of a grouping with the id specified for the course. * * @category group * @param int $courseid The id of the course * @param int $idnumber id of the group * @return grouping object */ function groups_get_grouping_by_id($courseid, $id) { if (empty($id)) { return false; } $data = groups_get_course_data($courseid); foreach ($data->groupings as $grouping) { if ($grouping->id == $id) { return $grouping; } } return false; }