From da880d320cc97404c04d4a886a93845f5306e888 Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Thu, 23 Jun 2016 07:03:50 -0700 Subject: [PATCH 1/2] MDL-54997 competencies: Listing evidence contexts When listing the evidence for a user competency in a course, the query is missing evidences for sub-contexts in the course. --- competency/classes/api.php | 7 ++---- competency/classes/evidence.php | 41 +++++++++++++++++++++++++++++++++ competency/tests/api_test.php | 41 +++++++++++++++++++++++++++++++++ 3 files changed, 84 insertions(+), 5 deletions(-) diff --git a/competency/classes/api.php b/competency/classes/api.php index b11daa48c7f..043111e5bd9 100644 --- a/competency/classes/api.php +++ b/competency/classes/api.php @@ -4166,11 +4166,8 @@ class api { return array(); } - $params = array( - 'usercompetencyid' => $usercompetency->get_id(), - 'contextid' => context_course::instance($courseid)->id - ); - return evidence::get_records($params, $sort, $order, $skip, $limit); + $context = context_course::instance($courseid); + return evidence::get_records_for_usercompetency($usercompetency->get_id(), $context, $sort, $order, $skip, $limit); } /** diff --git a/competency/classes/evidence.php b/competency/classes/evidence.php index ed3445dd910..e292df7e502 100644 --- a/competency/classes/evidence.php +++ b/competency/classes/evidence.php @@ -284,4 +284,45 @@ class evidence extends persistent { return has_capability('moodle/competency:evidencedelete', context_user::instance($userid)); } + /** + * Load a list of records in a context for a user competency. + * + * @param int $usercompetencyid The id of the user competency. + * @param context $context Context to filter the evidence list. + * @param string $sort The field from the evidence table to sort on. + * @param string $order The sort direction + * @param int $skip Limitstart. + * @param int $limit Number of rows to return. + * + * @return \core_competency\persistent[] + */ + public static function get_records_for_usercompetency($usercompetencyid, \context $context, $sort = '', $order = 'ASC', $skip = 0, $limit = 0) { + global $DB; + + $params = array( + 'usercompid' => $usercompetencyid, + 'path' => $context->path . '/%', + 'contextid' => $context->id + ); + + if (!empty($sort)) { + $sort = ' ORDER BY e.' . $sort . ' ' . $order; + } + + $sql = 'SELECT e.* + FROM {' . static::TABLE . '} e + JOIN {context} c ON c.id = e.contextid + WHERE (c.path LIKE :path OR c.id = :contextid) + AND e.usercompetencyid = :usercompid + ' . $sort; + $records = $DB->get_records_sql($sql, $params, $skip, $limit); + $instances = array(); + + foreach ($records as $record) { + $newrecord = new static(0, $record); + array_push($instances, $newrecord); + } + return $instances; + } + } diff --git a/competency/tests/api_test.php b/competency/tests/api_test.php index 9e5c4d3eb11..44aaf7628fe 100644 --- a/competency/tests/api_test.php +++ b/competency/tests/api_test.php @@ -2579,6 +2579,47 @@ class core_competency_api_testcase extends advanced_testcase { $this->assertEquals(null, $ev4->get_actionuserid()); } + public function test_list_evidence_in_course() { + global $SITE; + + $this->resetAfterTest(true); + $dg = $this->getDataGenerator(); + $lpg = $dg->get_plugin_generator('core_competency'); + $u1 = $dg->create_user(); + $course = $dg->create_course(); + $coursecontext = context_course::instance($course->id); + + $this->setAdminUser(); + $f = $lpg->create_framework(); + $c = $lpg->create_competency(array('competencyframeworkid' => $f->get_id())); + $c2 = $lpg->create_competency(array('competencyframeworkid' => $f->get_id())); + $cc = api::add_competency_to_course($course->id, $c->get_id()); + $cc2 = api::add_competency_to_course($course->id, $c2->get_id()); + + $pagegenerator = $this->getDataGenerator()->get_plugin_generator('mod_page'); + $page = $pagegenerator->create_instance(array('course' => $course->id)); + + $cm = get_coursemodule_from_instance('page', $page->id); + $cmcontext = context_module::instance($cm->id); + // Add the competency to the course module. + $ccm = api::add_competency_to_course_module($cm, $c->get_id()); + + // Now add the evidence to the course. + $evidence1 = api::add_evidence($u1->id, $c->get_id(), $coursecontext->id, \core_competency\evidence::ACTION_LOG, + 'invaliddata', 'error'); + + $result = api::list_evidence_in_course($u1->id, $course->id, $c->get_id()); + $this->assertEquals($result[0]->get_id(), $evidence1->get_id()); + + // Now add the evidence to the course module. + $evidence2 = api::add_evidence($u1->id, $c->get_id(), $cmcontext->id, \core_competency\evidence::ACTION_LOG, + 'invaliddata', 'error'); + + $result = api::list_evidence_in_course($u1->id, $course->id, $c->get_id()); + $this->assertEquals($result[0]->get_id(), $evidence2->get_id()); + $this->assertEquals($result[1]->get_id(), $evidence1->get_id()); + } + public function test_list_course_modules_using_competency() { global $SITE; From e824cd502d4b82b64ebeedf07bf311ebd9081f34 Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Sat, 25 Jun 2016 06:57:58 -0700 Subject: [PATCH 2/2] MDL-54997 competencies: Fix random unit test fail Sorting on timecreated is not unique enough to guarantee a predictable ordering. --- competency/classes/api.php | 2 +- competency/classes/evidence.php | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/competency/classes/api.php b/competency/classes/api.php index 043111e5bd9..a440bc25964 100644 --- a/competency/classes/api.php +++ b/competency/classes/api.php @@ -4152,7 +4152,7 @@ class api { * @param int $limit Number of records to return. * @return \core_competency\evidence[] */ - public static function list_evidence_in_course($userid = 0, $courseid = 0, $competencyid = 0, $sort = 'timecreated', + public static function list_evidence_in_course($userid = 0, $courseid = 0, $competencyid = 0, $sort = 'timecreated, id', $order = 'DESC', $skip = 0, $limit = 0) { static::require_enabled(); diff --git a/competency/classes/evidence.php b/competency/classes/evidence.php index e292df7e502..cc8ec05686a 100644 --- a/competency/classes/evidence.php +++ b/competency/classes/evidence.php @@ -296,7 +296,12 @@ class evidence extends persistent { * * @return \core_competency\persistent[] */ - public static function get_records_for_usercompetency($usercompetencyid, \context $context, $sort = '', $order = 'ASC', $skip = 0, $limit = 0) { + public static function get_records_for_usercompetency($usercompetencyid, + \context $context, + $sort = '', + $order = 'ASC', + $skip = 0, + $limit = 0) { global $DB; $params = array( @@ -306,7 +311,9 @@ class evidence extends persistent { ); if (!empty($sort)) { - $sort = ' ORDER BY e.' . $sort . ' ' . $order; + $sortcolumns = explode(',', $sort); + $sortcolumns = array_map('trim', $sortcolumns); + $sort = ' ORDER BY e.' . implode(', e.', $sortcolumns) . ' ' . $order; } $sql = 'SELECT e.*