/** * Convenience method to instantiate the event. * * @param user_competency_course $usercompetencycourse The user competency course. * @return self */ public static function create_from_user_competency_course(user_competency_course $usercompetencycourse) { if (!$usercompetencycourse->get_id()) { throw new \coding_exception('The user competency course ID must be set.'); } $params = array('objectid' => $usercompetencycourse->get_id(), 'relateduserid' => $usercompetencycourse->get_userid(), 'other' => array('competencyid' => $usercompetencycourse->get_competencyid(), 'grade' => $usercompetencycourse->get_grade())); $coursecontext = context_course::instance($usercompetencycourse->get_courseid()); $params['contextid'] = $coursecontext->id; $params['courseid'] = $usercompetencycourse->get_courseid(); $event = static::create($params); $event->add_record_snapshot(user_competency_course::TABLE, $usercompetencycourse->to_record()); return $event; }
public function test_hook_course_reset_competency_ratings() { $this->resetAfterTest(); $dg = $this->getDataGenerator(); $ccg = $dg->get_plugin_generator('core_competency'); $u1 = $dg->create_user(); $framework = $ccg->create_framework(); $comp1 = $ccg->create_competency(['competencyframeworkid' => $framework->get_id()]); $comp2 = $ccg->create_competency(['competencyframeworkid' => $framework->get_id()]); $c1 = $dg->create_course(); $cc1a = $ccg->create_course_competency(['competencyid' => $comp1->get_id(), 'courseid' => $c1->id]); $cc1b = $ccg->create_course_competency(['competencyid' => $comp2->get_id(), 'courseid' => $c1->id]); $assign1a = $dg->create_module('assign', ['course' => $c1]); $assign1b = $dg->create_module('assign', ['course' => $c1]); $cmc1a = $ccg->create_course_module_competency(['competencyid' => $comp1->get_id(), 'cmid' => $assign1a->cmid]); $cmc1b = $ccg->create_course_module_competency(['competencyid' => $comp1->get_id(), 'cmid' => $assign1b->cmid]); $ucc1a = $ccg->create_user_competency_course(['competencyid' => $comp1->get_id(), 'courseid' => $c1->id, 'userid' => $u1->id]); $ucc1b = $ccg->create_user_competency_course(['competencyid' => $comp2->get_id(), 'courseid' => $c1->id, 'userid' => $u1->id]); $c2 = $dg->create_course(); $cc2a = $ccg->create_course_competency(['competencyid' => $comp1->get_id(), 'courseid' => $c2->id]); $cc2b = $ccg->create_course_competency(['competencyid' => $comp2->get_id(), 'courseid' => $c2->id]); $assign2a = $dg->create_module('assign', ['course' => $c2]); $assign2b = $dg->create_module('assign', ['course' => $c2]); $cmc2a = $ccg->create_course_module_competency(['competencyid' => $comp1->get_id(), 'cmid' => $assign2a->cmid]); $cmc2b = $ccg->create_course_module_competency(['competencyid' => $comp1->get_id(), 'cmid' => $assign2b->cmid]); $ucc2a = $ccg->create_user_competency_course(['competencyid' => $comp1->get_id(), 'courseid' => $c2->id, 'userid' => $u1->id]); $ucc2b = $ccg->create_user_competency_course(['competencyid' => $comp2->get_id(), 'courseid' => $c2->id, 'userid' => $u1->id]); reset_course_userdata((object) ['id' => $c1->id, 'reset_competency_ratings' => true]); $this->assertEquals(2, course_competency::count_records(['courseid' => $c1->id])); $this->assertEquals(2, course_competency::count_records(['courseid' => $c2->id])); $this->assertEquals(1, course_module_competency::count_records(['cmid' => $assign1a->cmid])); $this->assertEquals(1, course_module_competency::count_records(['cmid' => $assign1b->cmid])); $this->assertEquals(1, course_module_competency::count_records(['cmid' => $assign2a->cmid])); $this->assertEquals(1, course_module_competency::count_records(['cmid' => $assign2b->cmid])); $this->assertEquals(0, user_competency_course::count_records(['courseid' => $c1->id, 'userid' => $u1->id])); $this->assertEquals(2, user_competency_course::count_records(['courseid' => $c2->id, 'userid' => $u1->id])); }
/** * Tests for the user_competency_course data when api::add_evidence() is invoked when * grading a user competency in a course. */ public function test_add_evidence_user_competency_course_grade_in_course() { global $USER; $this->resetAfterTest(true); $dg = $this->getDataGenerator(); // Create a course. $course = $dg->create_course(); $record = array('courseid' => $course->id, 'pushratingstouserplans' => false); $settings = new course_competency_settings(0, (object) $record); $settings->create(); $coursecontext = context_course::instance($course->id); // Create a student and enrol into the course. $student = $dg->create_user(); $studentarch = get_archetype_roles('student'); $studentrole = array_shift($studentarch); $dg->role_assign($studentrole->id, $student->id, $coursecontext->id); $dg->enrol_user($student->id, $course->id, $studentrole->id); // Create a competency for the course. $lpg = $dg->get_plugin_generator('core_competency'); $framework = $lpg->create_framework(); // Do not push ratings from course to user plans. $comp = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id())); $lpg->create_course_competency(array('courseid' => $course->id, 'competencyid' => $comp->get_id())); // Query for user_competency_course data. $filterparams = array('userid' => $student->id, 'competencyid' => $comp->get_id(), 'courseid' => $course->id); // Add evidence that sets a grade to the course. $evidence = api::add_evidence($student->id, $comp, $coursecontext, evidence::ACTION_OVERRIDE, 'commentincontext', 'core', null, false, null, 3, $USER->id); // Get user competency course record. $usercompcourse = \core_competency\user_competency_course::get_record($filterparams); // There should be a user_competency_course object when adding a grade. $this->assertNotEmpty($usercompcourse); $grade = $evidence->get_grade(); $this->assertEquals($grade, $usercompcourse->get_grade()); $this->assertEquals(3, $usercompcourse->get_grade()); $proficiency = $comp->get_proficiency_of_grade($grade); $this->assertEquals($proficiency, $usercompcourse->get_proficiency()); // Confirm that the user competency's grade/proficiency has not been affected by the grade. $usercompetencyparams = ['userid' => $student->id, 'competencyid' => $comp->get_id()]; $usercompetency = \core_competency\user_competency::get_record($usercompetencyparams); $this->assertNotEmpty($usercompetency); $this->assertNotEquals($usercompcourse->get_grade(), $usercompetency->get_grade()); $this->assertNotEquals($usercompcourse->get_proficiency(), $usercompetency->get_proficiency()); }
/** * Get the most often not completed competency for this course. * * Requires moodle/competency:coursecompetencyview capability at the course context. * * @param int $courseid The course id * @param int $skip The number of records to skip * @param int $limit The max number of records to return * @return competency[] */ public static function get_least_proficient_competencies_for_course($courseid, $skip = 0, $limit = 100) { static::require_enabled(); $coursecontext = context_course::instance($courseid); if (!has_any_capability(array('moodle/competency:competencyview', 'moodle/competency:competencymanage'), $coursecontext)) { throw new required_capability_exception($coursecontext, 'moodle/competency:competencyview', 'nopermissions', ''); } return user_competency_course::get_least_proficient_competencies_for_course($courseid, $skip, $limit); }
/** * Create a new user competency course. * * @param array|stdClass $record * @return user_competency_course */ public function create_user_competency_course($record = null) { $record = (object) $record; if (!isset($record->userid)) { throw new coding_exception('The userid value is required.'); } if (!isset($record->competencyid)) { throw new coding_exception('The competencyid value is required.'); } if (!isset($record->courseid)) { throw new coding_exception('The courseid value is required.'); } $usercompetencycourse = new user_competency_course(0, $record); $usercompetencycourse->create(); return $usercompetencycourse; }
public function test_who_can_change_settings() { global $CFG, $DB; $this->resetAfterTest(true); $syscontext = context_system::instance(); $dg = $this->getDataGenerator(); $lpg = $dg->get_plugin_generator('core_competency'); $role = create_role('Settings changer role', 'settingschanger', 'Someone who can change course competency settings'); assign_capability('moodle/competency:coursecompetencyconfigure', CAP_ALLOW, $role, $syscontext->id); assign_capability('moodle/competency:competencygrade', CAP_ALLOW, $role, $syscontext->id); assign_capability('moodle/competency:coursecompetencyview', CAP_ALLOW, $role, $syscontext->id); assign_capability('moodle/competency:planview', CAP_ALLOW, $role, $syscontext->id); $gradedrole = create_role('Graded role', 'graded', 'Someone who can be graded'); assign_capability('moodle/competency:coursecompetencygradable', CAP_ALLOW, $gradedrole, $syscontext->id); $c1 = $dg->create_course(); $u1 = $dg->create_user(); $u2 = $dg->create_user(); $u3 = $dg->create_user(); $framework = $lpg->create_framework(); $comp1 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id())); $comp2 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id())); $lpg->create_course_competency(array('competencyid' => $comp1->get_id(), 'courseid' => $c1->id)); $lpg->create_course_competency(array('competencyid' => $comp2->get_id(), 'courseid' => $c1->id)); // Enrol the user. $dg->enrol_user($u1->id, $c1->id); role_assign($gradedrole, $u1->id, $syscontext->id); // Assign roles. role_assign($role, $u2->id, $syscontext->id); $this->setUser($u2); set_config('pushcourseratingstouserplans', true, 'core_competency'); $coursesettings = course_competency_settings::get_by_courseid($c1->id); $this->assertTrue((bool) $coursesettings->get_pushratingstouserplans()); set_config('pushcourseratingstouserplans', false, 'core_competency'); $coursesettings = course_competency_settings::get_by_courseid($c1->id); $this->assertFalse((bool) $coursesettings->get_pushratingstouserplans()); api::update_course_competency_settings($c1->id, (object) array('pushratingstouserplans' => true)); $coursesettings = course_competency_settings::get_by_courseid($c1->id); $this->assertTrue((bool) $coursesettings->get_pushratingstouserplans()); set_config('pushcourseratingstouserplans', true, 'core_competency'); api::update_course_competency_settings($c1->id, (object) array('pushratingstouserplans' => false)); $coursesettings = course_competency_settings::get_by_courseid($c1->id); $this->assertFalse((bool) $coursesettings->get_pushratingstouserplans()); // Right now the setting is false. api::grade_competency_in_course($c1->id, $u1->id, $comp1->get_id(), 1, 'Note'); $filterparams = array('userid' => $u1->id, 'competencyid' => $comp1->get_id()); $usercompcourse = \core_competency\user_competency_course::get_record($filterparams); $usercomp = \core_competency\user_competency::get_record($filterparams); // No grade in plan - only a grade in the course. $this->assertEmpty($usercomp->get_grade()); $this->assertEquals(1, $usercompcourse->get_grade()); api::update_course_competency_settings($c1->id, (object) array('pushratingstouserplans' => true)); api::grade_competency_in_course($c1->id, $u1->id, $comp1->get_id(), 2, 'Note 2'); $filterparams = array('userid' => $u1->id, 'competencyid' => $comp1->get_id()); $usercompcourse = \core_competency\user_competency_course::get_record($filterparams); $usercomp = \core_competency\user_competency::get_record($filterparams); // Updated grade in plan - updated grade in the course. $this->assertEquals(2, $usercomp->get_grade()); $this->assertEquals(2, $usercompcourse->get_grade()); $this->setUser($u3); $this->setExpectedException('required_capability_exception'); api::update_course_competency_settings($c1->id, (object) array('pushratingstouserplans' => false)); }