MDL-51039 tool_lp: Add completion rules to course - competency links

This commit is contained in:
Serge Gauthier
2016-04-18 10:58:44 +08:00
committed by Frederic Massart
parent 4c0e816733
commit d4c0a2f66e
13 changed files with 393 additions and 46 deletions
+1 -1
View File
@@ -1 +1 @@
define(["jquery","core/notification","core/ajax","core/templates","core/str","tool_lp/competencypicker","tool_lp/dragdrop-reorder"],function(a,b,c,d,e,f,g){var h=function(b,c,d){this.itemid=b,this.itemtype=c,this.pageContextId=d,this.pickerInstance=null,a('[data-region="actions"] button').show(),this.registerEvents(),this.registerDragDrop()};return h.prototype.registerDragDrop=function(){var a=this;e.get_string("movecompetency","tool_lp").done(function(b){g.dragdrop("movecompetency",b,{identifier:"movecompetency",component:"tool_lp"},{identifier:"movecompetencyafter",component:"tool_lp"},"drag-samenode","drag-parentnode","drag-handlecontainer",function(b,c){a.handleDrop.call(a,b,c)})}).fail(b.exception)},h.prototype.handleDrop=function(d,e){var f=a(d).data("id"),g=a(e).data("id"),h=this,i=[];if("course"==h.itemtype)i=c.call([{methodname:"tool_lp_reorder_course_competency",args:{courseid:h.itemid,competencyidfrom:f,competencyidto:g}}]);else if("template"==h.itemtype)i=c.call([{methodname:"tool_lp_reorder_template_competency",args:{templateid:h.itemid,competencyidfrom:f,competencyidto:g}}]);else{if("plan"!=h.itemtype)return null;i=c.call([{methodname:"tool_lp_reorder_plan_competency",args:{planid:h.itemid,competencyidfrom:f,competencyidto:g}}])}i[0].fail(b.exception)},h.prototype.pickCompetency=function(){var e,g,h,i=this;i.pickerInstance||(i.pickerInstance=new f(i.pageContextId,void 0,"course"===i.itemtype?"parents":void 0),i.pickerInstance.on("save",function(f,j){var k=j.competencyIds;"course"===i.itemtype?(e=[],a.each(k,function(a,b){e.push({methodname:"tool_lp_add_competency_to_course",args:{courseid:i.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:i.itemid}}),g="tool_lp/course_competencies_page",h="coursecompetenciespage"):"template"===i.itemtype?(e=[],a.each(k,function(a,b){e.push({methodname:"tool_lp_add_competency_to_template",args:{templateid:i.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:i.itemid,pagecontext:{contextid:i.pageContextId}}}),g="tool_lp/template_competencies_page",h="templatecompetenciespage"):"plan"===i.itemtype&&(e=[],a.each(k,function(a,b){e.push({methodname:"tool_lp_add_competency_to_plan",args:{planid:i.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_plan_competencies_page",args:{planid:i.itemid}}),g="tool_lp/plan_page",h="plancompetenciespage"),c.call(e)[e.length-1].then(function(b){return d.render(g,b).done(function(b,c){a('[data-region="'+h+'"]').replaceWith(b),d.runTemplateJS(c)})},b.exception)})),i.pickerInstance.display()},h.prototype.registerEvents=function(){var e=this;a('[data-region="actions"] button').click(function(a){a.preventDefault(),e.pickCompetency()}),a('[data-action="delete-competency-link"]').click(function(f){var g=[],h="",i="";f.preventDefault();var j=a(f.target).closest("[data-id]").data("id");"course"==e.itemtype?(g=c.call([{methodname:"tool_lp_remove_competency_from_course",args:{courseid:e.itemid,competencyid:j}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:e.itemid}}]),h="tool_lp/course_competencies_page",i="coursecompetenciespage"):"template"==e.itemtype?(g=c.call([{methodname:"tool_lp_remove_competency_from_template",args:{templateid:e.itemid,competencyid:j}},{methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:e.itemid,pagecontext:{contextid:e.pageContextId}}}]),h="tool_lp/template_competencies_page",i="templatecompetenciespage"):"plan"==e.itemtype&&(g=c.call([{methodname:"tool_lp_remove_competency_from_plan",args:{planid:e.itemid,competencyid:j}},{methodname:"tool_lp_data_for_plan_competencies_page",args:{planid:e.itemid}}]),h="tool_lp/plan_page",i="plancompetenciespage"),g[1].done(function(c){d.render(h,c).done(function(b,c){a('[data-region="'+i+'"]').replaceWith(b),d.runTemplateJS(c)}).fail(b.exception)}).fail(b.exception)})},h});
define(["jquery","core/notification","core/ajax","core/templates","core/str","tool_lp/competencypicker","tool_lp/dragdrop-reorder"],function(a,b,c,d,e,f,g){var h=function(b,c,d){this.itemid=b,this.itemtype=c,this.pageContextId=d,this.pickerInstance=null,a('[data-region="actions"] button').show(),this.registerEvents(),this.registerDragDrop()};return h.prototype.registerDragDrop=function(){var a=this;e.get_string("movecompetency","tool_lp").done(function(b){g.dragdrop("movecompetency",b,{identifier:"movecompetency",component:"tool_lp"},{identifier:"movecompetencyafter",component:"tool_lp"},"drag-samenode","drag-parentnode","drag-handlecontainer",function(b,c){a.handleDrop.call(a,b,c)})}).fail(b.exception)},h.prototype.handleDrop=function(d,e){var f=a(d).data("id"),g=a(e).data("id"),h=this,i=[];if("course"==h.itemtype)i=c.call([{methodname:"tool_lp_reorder_course_competency",args:{courseid:h.itemid,competencyidfrom:f,competencyidto:g}}]);else if("template"==h.itemtype)i=c.call([{methodname:"tool_lp_reorder_template_competency",args:{templateid:h.itemid,competencyidfrom:f,competencyidto:g}}]);else{if("plan"!=h.itemtype)return null;i=c.call([{methodname:"tool_lp_reorder_plan_competency",args:{planid:h.itemid,competencyidfrom:f,competencyidto:g}}])}i[0].fail(b.exception)},h.prototype.pickCompetency=function(){var e,g,h,i=this;i.pickerInstance||(i.pickerInstance=new f(i.pageContextId,void 0,"course"===i.itemtype?"parents":void 0),i.pickerInstance.on("save",function(f,j){var k=j.competencyIds;"course"===i.itemtype?(e=[],a.each(k,function(a,b){e.push({methodname:"tool_lp_add_competency_to_course",args:{courseid:i.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:i.itemid}}),g="tool_lp/course_competencies_page",h="coursecompetenciespage"):"template"===i.itemtype?(e=[],a.each(k,function(a,b){e.push({methodname:"tool_lp_add_competency_to_template",args:{templateid:i.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:i.itemid,pagecontext:{contextid:i.pageContextId}}}),g="tool_lp/template_competencies_page",h="templatecompetenciespage"):"plan"===i.itemtype&&(e=[],a.each(k,function(a,b){e.push({methodname:"tool_lp_add_competency_to_plan",args:{planid:i.itemid,competencyid:b}})}),e.push({methodname:"tool_lp_data_for_plan_competencies_page",args:{planid:i.itemid}}),g="tool_lp/plan_page",h="plancompetenciespage"),c.call(e)[e.length-1].then(function(b){return d.render(g,b).done(function(b,c){a('[data-region="'+h+'"]').replaceWith(b),d.runTemplateJS(c)})},b.exception)})),i.pickerInstance.display()},h.prototype.registerEvents=function(){var e=this;a('[data-region="coursecompetenciespage"]').on("change",'select[name="ruleoutcome"]',function(f){var g=[],h="tool_lp/course_competencies_page",i="coursecompetenciespage",j=a(f.target).data("id"),k=a(f.target).val();"course"==e.itemtype&&(g=c.call([{methodname:"tool_lp_set_ruleoutcome_course_competency",args:{coursecompetencyid:j,ruleoutcome:k}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:e.itemid}}]),g[1].done(function(c){d.render(h,c).done(function(b,c){a('[data-region="'+i+'"]').replaceWith(b),d.runTemplateJS(c)}).fail(b.exception)}).fail(b.exception))}),a('[data-region="actions"] button').click(function(a){a.preventDefault(),e.pickCompetency()}),a('[data-action="delete-competency-link"]').click(function(f){var g=[],h="",i="";f.preventDefault();var j=a(f.target).closest("[data-id]").data("id");"course"==e.itemtype?(g=c.call([{methodname:"tool_lp_remove_competency_from_course",args:{courseid:e.itemid,competencyid:j}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:e.itemid}}]),h="tool_lp/course_competencies_page",i="coursecompetenciespage"):"template"==e.itemtype?(g=c.call([{methodname:"tool_lp_remove_competency_from_template",args:{templateid:e.itemid,competencyid:j}},{methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:e.itemid,pagecontext:{contextid:e.pageContextId}}}]),h="tool_lp/template_competencies_page",i="templatecompetenciespage"):"plan"==e.itemtype&&(g=c.call([{methodname:"tool_lp_remove_competency_from_plan",args:{planid:e.itemid,competencyid:j}},{methodname:"tool_lp_data_for_plan_competencies_page",args:{planid:e.itemid}}]),h="tool_lp/plan_page",i="plancompetenciespage"),g[1].done(function(c){d.render(h,c).done(function(b,c){a('[data-region="'+i+'"]').replaceWith(b),d.runTemplateJS(c)}).fail(b.exception)}).fail(b.exception)})},h});
+22
View File
@@ -196,6 +196,28 @@ define(['jquery',
*/
competencies.prototype.registerEvents = function() {
var localthis = this;
$('[data-region="coursecompetenciespage"]').on('change', 'select[name="ruleoutcome"]', function(e){
var requests = [];
var pagerender = 'tool_lp/course_competencies_page';
var pageregion = 'coursecompetenciespage';
var coursecompetencyid = $(e.target).data('id') ;
var ruleoutcome = $(e.target).val();
if (localthis.itemtype == 'course') {
requests = ajax.call([
{ methodname: 'tool_lp_set_ruleoutcome_course_competency',
args: { coursecompetencyid: coursecompetencyid, ruleoutcome: ruleoutcome } },
{ methodname: 'tool_lp_data_for_course_competencies_page',
args: { courseid: localthis.itemid } }
]);
requests[1].done(function(context) {
templates.render(pagerender, context).done(function(html, js) {
$('[data-region="' + pageregion + '"]').replaceWith(html);
templates.runTemplateJS(js);
}).fail(notification.exception);
}).fail(notification.exception);
}
});
$('[data-region="actions"] button').click(function(e) {
e.preventDefault();
localthis.pickCompetency();
+85 -17
View File
@@ -30,6 +30,7 @@ use context_system;
use context_course;
use context_user;
use coding_exception;
use require_login_exception;
use moodle_url;
use required_capability_exception;
@@ -602,7 +603,7 @@ class api {
continue;
}
if (!$course->visible && !has_capability('course:viewhidden', $context)) {
if (!$course->visible && !has_capability('course:viewhiddencourses', $context)) {
continue;
}
@@ -632,7 +633,7 @@ class api {
unset($courses[$id]);
continue;
}
if (!$course->visible && !has_capability('course:viewhidden', $context)) {
if (!$course->visible && !has_capability('course:viewhiddencourses', $context)) {
unset($courses[$id]);
continue;
}
@@ -649,6 +650,9 @@ class api {
* @return int
*/
public static function count_competencies_in_course($courseid) {
// Check the user have access to the course.
self::validate_course($courseid);
// First we do a permissions check.
$context = context_course::instance($courseid);
$onlyvisible = 1;
@@ -667,27 +671,38 @@ class api {
}
/**
* List all the competencies in a course.
* List the competencies associated to a course.
*
* @param int $courseid The id of the course to check.
* @return array of competencies
* @param mixed $courseorid The course, or its ID.
* @return array( array(
* 'competency' => \tool_lp\competency,
* 'coursecompetency' => \tool_lp\course_competency
* ))
*/
public static function list_competencies_in_course($courseid) {
// First we do a permissions check.
$context = context_course::instance($courseid);
public static function list_course_competencies($courseorid) {
$course = $courseorid;
if (!is_object($courseorid)) {
$course = get_course($courseorid);
}
// Check the user have access to the course.
self::validate_course($course);
$onlyvisible = 1;
$result = array();
$coursecompetencies = course_competency::list_course_competencies($course->id, $onlyvisible);
$capabilities = array('tool/lp:coursecompetencyread', 'tool/lp:coursecompetencymanage');
if (!has_any_capability($capabilities, $context)) {
throw new required_capability_exception($context, 'tool/lp:coursecompetencyread', 'nopermissions', '');
// Build the return values.
foreach ($coursecompetencies as $key => $coursecompetency) {
$competency = new competency($coursecompetency->get_competencyid());
$result[] = array(
'competency' => $competency,
'coursecompetency' => $coursecompetency
);
}
if (has_capability('tool/lp:coursecompetencymanage', $context)) {
$onlyvisible = 0;
}
// OK - all set.
return course_competency::list_competencies($courseid, $onlyvisible);
return $result;
}
/**
@@ -698,6 +713,9 @@ class api {
* @return bool
*/
public static function add_competency_to_course($courseid, $competencyid) {
// Check the user have access to the course.
self::validate_course($courseid);
// First we do a permissions check.
$context = context_course::instance($courseid);
@@ -732,6 +750,9 @@ class api {
* @return bool
*/
public static function remove_competency_from_course($courseid, $competencyid) {
// Check the user have access to the course.
self::validate_course($courseid);
// First we do a permissions check.
$context = context_course::instance($courseid);
@@ -767,6 +788,9 @@ class api {
* @return boolean
*/
public static function reorder_course_competency($courseid, $competencyidfrom, $competencyidto) {
// Check the user have access to the course.
self::validate_course($courseid);
// First we do a permissions check.
$context = context_course::instance($courseid);
@@ -2119,4 +2143,48 @@ class api {
return $evidence;
}
/**
* Update ruleoutcome value for a course competency.
*
* @param int $coursecompetencyid The course_competency ID.
* @param int $ruleoutcome The value of ruleoutcome.
* @return bool True on success.
*/
public static function set_ruleoutcome_course_competency($coursecompetencyid, $ruleoutcome) {
$coursecompetency = new course_competency($coursecompetencyid);
$coursecontext = context_course::instance($coursecompetency->get_courseid());
if (!has_capability('tool/lp:coursecompetencymanage', $coursecontext)) {
throw new required_capability_exception($coursecontext, 'tool/lp:coursecompetencymanage', 'nopermissions', '');
}
$coursecompetency->set_ruleoutcome($ruleoutcome);
return $coursecompetency->update();
}
/**
* Validate if current user have acces to the course if hidden.
*
* @param mixed $courseorid The course or it ID.
* @param bool $throwexception Throw an exception or not.
* @return bool
*/
protected static function validate_course($courseorid, $throwexception = true) {
$course = $courseorid;
if (!is_object($course)) {
$course = get_course($course);
}
$coursecontext = context_course::instance($course->id);
if (!$course->visible and !has_capability('moodle/course:viewhiddencourses', $coursecontext)) {
if ($throwexception) {
throw new require_login_exception('Course is hidden');
} else {
return false;
}
}
return true;
}
}
+103 -2
View File
@@ -24,6 +24,7 @@
namespace tool_lp;
use stdClass;
use lang_string;
/**
* Class for loading/storing course_competencies from the DB.
@@ -35,6 +36,16 @@ class course_competency extends persistent {
const TABLE = 'tool_lp_course_competency';
/** Course competency ruleoutcome constant. */
const OUTCOME_NONE = 0;
/** Course competency ruleoutcome constant. */
const OUTCOME_EVIDENCE = 1;
/** Course competency ruleoutcome constant. */
const OUTCOME_RECOMMEND = 2;
/** Course competency ruleoutcome constant. */
const OUTCOME_COMPLETE = 3;
/**
* Return the definition of the properties of this model.
*
@@ -51,6 +62,15 @@ class course_competency extends persistent {
'sortorder' => array(
'type' => PARAM_INT
),
'ruleoutcome' => array(
'choices' => array(self::OUTCOME_NONE,
self::OUTCOME_EVIDENCE,
self::OUTCOME_RECOMMEND,
self::OUTCOME_COMPLETE
),
'default' => self::OUTCOME_EVIDENCE,
'type' => PARAM_INT,
),
);
}
@@ -65,6 +85,54 @@ class course_competency extends persistent {
}
}
/**
* Return a list of rules.
*
* @return array
*/
public static function get_ruleoutcome_list() {
static $list = null;
if ($list === null) {
$list = array(
self::OUTCOME_NONE => self::get_ruleoutcome_name(self::OUTCOME_NONE),
self::OUTCOME_EVIDENCE => self::get_ruleoutcome_name(self::OUTCOME_EVIDENCE),
self::OUTCOME_RECOMMEND => self::get_ruleoutcome_name(self::OUTCOME_RECOMMEND),
self::OUTCOME_COMPLETE => self::get_ruleoutcome_name(self::OUTCOME_COMPLETE));
}
return $list;
}
/**
* Human readable rule name.
*
* @param int $ruleoutcome The value of ruleoutcome.
* @return string
*/
public static function get_ruleoutcome_name($ruleoutcome) {
switch ($ruleoutcome) {
case self::OUTCOME_NONE:
$strname = 'none';
break;
case self::OUTCOME_EVIDENCE:
$strname = 'evidence';
break;
case self::OUTCOME_RECOMMEND:
$strname = 'recommend';
break;
case self::OUTCOME_COMPLETE:
$strname = 'complete';
break;
default:
throw new \moodle_exception('errorcoursecompetencyrule', 'tool_lp', '', $rule);
break;
}
return new lang_string('coursecompetencyoutcome_' . $strname, 'tool_lp');
}
/**
* Validate course ID.
*
@@ -169,8 +237,7 @@ class course_competency extends persistent {
FROM {' . competency::TABLE . '} comp
JOIN {' . self::TABLE . '} coursecomp
ON coursecomp.competencyid = comp.id
WHERE coursecomp.courseid = ?
ORDER BY coursecomp.sortorder ASC';
WHERE coursecomp.courseid = ?';
$params = array($courseid);
if ($onlyvisible) {
@@ -178,6 +245,7 @@ class course_competency extends persistent {
$params[] = 1;
}
$sql .= ' ORDER BY coursecomp.sortorder ASC';
$results = $DB->get_recordset_sql($sql, $params);
$instances = array();
foreach ($results as $result) {
@@ -205,4 +273,37 @@ class course_competency extends persistent {
$DB->execute($sql, array($this->get_courseid(), $this->get_sortorder()));
}
/**
* List the course_competencies in this course.
*
* @param int $courseid The course id
* @param bool $onlyvisible If true, only count visible competencies in this course.
* @return course_competency[]
*/
public static function list_course_competencies($courseid, $onlyvisible) {
global $DB;
$sql = 'SELECT coursecomp.*
FROM {' . self::TABLE . '} coursecomp
JOIN {' . competency::TABLE . '} comp
ON coursecomp.competencyid = comp.id
WHERE coursecomp.courseid = ?';
$params = array($courseid);
if ($onlyvisible) {
$sql .= ' AND comp.visible = ?';
$params[] = 1;
}
$sql .= ' ORDER BY coursecomp.sortorder ASC';
$results = $DB->get_recordset_sql($sql, $params);
$instances = array();
foreach ($results as $result) {
array_push($instances, new course_competency(0, $result));
}
$results->close();
return $instances;
}
}
+84 -16
View File
@@ -1338,11 +1338,11 @@ class external extends external_api {
}
/**
* Returns description of list_competencies_in_course() parameters.
* Returns description of list_course_competencies() parameters.
*
* @return \external_function_parameters
*/
public static function list_competencies_in_course_parameters() {
public static function list_course_competencies_parameters() {
$courseid = new external_value(
PARAM_INT,
'The course id',
@@ -1360,10 +1360,10 @@ class external extends external_api {
* @param int $courseid The course id to check.
* @return array
*/
public static function list_competencies_in_course($courseid) {
public static function list_course_competencies($courseid) {
global $PAGE;
$params = self::validate_parameters(self::list_competencies_in_course_parameters(),
$params = self::validate_parameters(self::list_course_competencies_parameters(),
array(
'id' => $courseid,
));
@@ -1371,29 +1371,42 @@ class external extends external_api {
self::validate_context(context_course::instance($params['id']));
$output = $PAGE->get_renderer('tool_lp');
$competencies = api::list_competencies_in_course($params['id']);
$results = array();
$competencies = api::list_course_competencies($params['id']);
$result = array();
$contextcache = array();
foreach ($competencies as $competency) {
if (!isset($contextcache[$competency->get_competencyframeworkid()])) {
$contextcache[$competency->get_competencyframeworkid()] = $competency->get_context();
if (!isset($contextcache[$competency['competency']->get_competencyframeworkid()])) {
$contextcache[$competency['competency']->get_competencyframeworkid()] = $competency['competency']->get_context();
}
$context = $contextcache[$competency->get_competencyframeworkid()];
$exporter = new competency_exporter($competency, array('context' => $context));
$record = $exporter->export($output);
array_push($results, $record);
$context = $contextcache[$competency['competency']->get_competencyframeworkid()];
$exporter = new competency_exporter($competency['competency'], array('context' => $context));
$competencyrecord = $exporter->export($output);
$exporter = new course_competency_exporter($competency['coursecompetency'], array('context' => $context));
$coursecompetencyrecord = $exporter->export($output);
$result[] = array(
'competency' => $competencyrecord,
'coursecompetency' => $coursecompetencyrecord
);
}
return $results;
return $result;
}
/**
* Returns description of list_competencies_in_course() result value.
* Returns description of list_course_competencies() result value.
*
* @return \external_description
*/
public static function list_competencies_in_course_returns() {
return new external_multiple_structure(competency_exporter::get_read_structure());
public static function list_course_competencies_returns() {
return new external_multiple_structure(
new external_single_structure(array(
'competency' => competency_exporter::get_read_structure(),
'coursecompetency' => course_competency_exporter::get_read_structure()
))
);
}
/**
@@ -3640,4 +3653,59 @@ class external extends external_api {
'cohorts' => new external_multiple_structure(cohort_summary_exporter::get_read_structure())
));
}
/**
* Returns description of update_ruleoutcome_course_competency() parameters.
*
* @return \external_function_parameters
*/
public static function set_ruleoutcome_course_competency_parameters() {
$coursecompetencyid = new external_value(
PARAM_INT,
'Data base record id for the course competency',
VALUE_REQUIRED
);
$ruleoutcome = new external_value(
PARAM_INT,
'Ruleoutcome value',
VALUE_REQUIRED
);
$params = array(
'coursecompetencyid' => $coursecompetencyid,
'ruleoutcome' => $ruleoutcome,
);
return new external_function_parameters($params);
}
/**
* Change the ruleoutcome of a course competency.
*
* @param int $coursecompetencyid The course competency id
* @param int $ruleoutcome The ruleoutcome value
* @return bool
*/
public static function set_ruleoutcome_course_competency($coursecompetencyid, $ruleoutcome) {
$params = self::validate_parameters(self::set_ruleoutcome_course_competency_parameters(),
array(
'coursecompetencyid' => $coursecompetencyid,
'ruleoutcome' => $ruleoutcome,
));
$coursecompetency = new course_competency($params['coursecompetencyid']);
self::validate_context(context_course::instance($coursecompetency->get_courseid()));
return api::set_ruleoutcome_course_competency($params['coursecompetencyid'], $params['ruleoutcome']);
}
/**
* Returns description of update_ruleoutcome_course_competency() result value.
*
* @return \external_value
*/
public static function set_ruleoutcome_course_competency_returns() {
return new external_value(PARAM_BOOL, 'True if the update was successful');
}
}
@@ -31,7 +31,10 @@ use moodle_url;
use context_system;
use context_course;
use tool_lp\api;
use tool_lp\course_competency;
use tool_lp\competency;
use tool_lp\external\competency_exporter;
use tool_lp\external\course_competency_exporter;
/**
* Class containing data for course competencies page
@@ -47,8 +50,8 @@ class course_competencies_page implements renderable, templatable {
/** @var context $context The context for this page. */
protected $context = null;
/** @var \tool_lp\competency[] $competencies List of competencies. */
protected $competencies = array();
/** @var \tool_lp\course_competency[] $competencies List of competencies. */
protected $coursecompetencylist = array();
/** @var bool $canmanagecompetencyframeworks Can the current user manage competency frameworks. */
protected $canmanagecompetencyframeworks = false;
@@ -66,7 +69,7 @@ class course_competencies_page implements renderable, templatable {
public function __construct($courseid) {
$this->context = context_course::instance($courseid);
$this->courseid = $courseid;
$this->competencies = api::list_competencies_in_course($courseid);
$this->coursecompetencylist = api::list_course_competencies($courseid);
$this->canmanagecoursecompetencies = has_capability('tool/lp:coursecompetencymanage', $this->context);
// Check the lowest level in which the user can manage the competencies.
@@ -95,16 +98,27 @@ class course_competencies_page implements renderable, templatable {
$data->courseid = $this->courseid;
$data->pagecontextid = $this->context->id;
$data->competencies = array();
$contextcache = array();
foreach ($this->competencies as $competency) {
$ruleoutcomelist = course_competency::get_ruleoutcome_list();
$ruleoutcomeoptions = array();
foreach ($ruleoutcomelist as $value => $text) {
$ruleoutcomeoptions[] = array('value' => $value, 'text' => (string) $text);
}
foreach ($this->coursecompetencylist as $coursecompetencyelement) {
$coursecompetency = $coursecompetencyelement['coursecompetency'];
$competency = $coursecompetencyelement['competency'];
if (!isset($contextcache[$competency->get_competencyframeworkid()])) {
$contextcache[$competency->get_competencyframeworkid()] = $competency->get_context();
}
$context = $contextcache[$competency->get_competencyframeworkid()];
$exporter = new competency_exporter($competency, array('context' => $context));
$record = $exporter->export($output);
$exporter = new course_competency_exporter($coursecompetency, array('context' => $context));
$recordcoursecompetency = $exporter->export($output);
$record->coursecompetencyid = $recordcoursecompetency->id;
$record->coursecompetencyoutcomelabel = get_string('coursecompetencyoutcomelabel', 'tool_lp');
$record->ruleoutcomeoptions = $ruleoutcomeoptions;
$record->ruleoutcomeoptions[$recordcoursecompetency->ruleoutcome]["selected"] = true;
array_push($data->competencies, $record);
}
$data->canmanagecompetencyframeworks = $this->canmanagecompetencyframeworks;
@@ -116,4 +130,5 @@ class course_competencies_page implements renderable, templatable {
return $data;
}
}
+4
View File
@@ -61,6 +61,7 @@
<FIELD NAME="id" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="true"/>
<FIELD NAME="courseid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The course this competency is linked to."/>
<FIELD NAME="competencyid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The competency that is linked to this course."/>
<FIELD NAME="ruleoutcome" TYPE="int" LENGTH="2" NOTNULL="true" SEQUENCE="false" COMMENT="The rule that applies to the competency when the course is completed."/>
<FIELD NAME="timecreated" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The time this link was created."/>
<FIELD NAME="timemodified" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The time this link was modified."/>
<FIELD NAME="usermodified" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The user who modified this link."/>
@@ -71,6 +72,9 @@
<KEY NAME="courseidlink" TYPE="foreign" FIELDS="courseid" REFTABLE="course" REFFIELDS="id" COMMENT="Course foreign key."/>
<KEY NAME="competencyid" TYPE="foreign" FIELDS="competencyid" REFTABLE="tool_lp_competency" REFFIELDS="id" COMMENT="Competency foreign key."/>
</KEYS>
<INDEXES>
<INDEX NAME="courseidruleoutcome" UNIQUE="false" FIELDS="courseid, ruleoutcome"/>
</INDEXES>
</TABLE>
<TABLE NAME="tool_lp_plan" COMMENT="Learning plans">
<FIELDS>
+11 -2
View File
@@ -217,9 +217,9 @@ $functions = array(
'capabilities' => 'tool/lp:competencymanage',
'ajax' => true,
),
'tool_lp_list_competencies_in_course' => array(
'tool_lp_list_course_competencies' => array(
'classname' => 'tool_lp\external',
'methodname' => 'list_competencies_in_course',
'methodname' => 'list_course_competencies',
'classpath' => '',
'description' => 'List the competencies in a course',
'type' => 'read',
@@ -280,6 +280,15 @@ $functions = array(
'capabilities' => 'tool/lp:coursecompetencymanage',
'ajax' => true,
),
'tool_lp_set_ruleoutcome_course_competency' => array(
'classname' => 'tool_lp\external',
'methodname' => 'set_ruleoutcome_course_competency',
'classpath' => '',
'description' => 'Modify the ruleoutcome value for course competency',
'type' => 'write',
'capabilities' => 'tool/lp:coursecompetencymanage',
'ajax' => true,
),
'tool_lp_remove_competency_from_template' => array(
'classname' => 'tool_lp\external',
'methodname' => 'remove_competency_from_template',
+21
View File
@@ -510,5 +510,26 @@ function xmldb_tool_lp_upgrade($oldversion) {
upgrade_plugin_savepoint(true, 2015111020, 'tool', 'lp');
}
if ($oldversion < 2015111021) {
// Define field ruleoutcome to be added to tool_lp_course_competency.
$table = new xmldb_table('tool_lp_course_competency');
$field = new xmldb_field('ruleoutcome', XMLDB_TYPE_INTEGER, '2', null, XMLDB_NOTNULL, null, 0, 'competencyid');
$index = new xmldb_index('courseidruleoutcome', XMLDB_INDEX_NOTUNIQUE, array('courseid', 'ruleoutcome'));
// Conditionally launch add field ruleoutcome.
if (!$dbman->field_exists($table, $field)) {
$dbman->add_field($table, $field);
}
// Conditionally launch add index ruleoutcome.
if (!$dbman->index_exists($table, $index)) {
$dbman->add_index($table, $index);
}
// Lp savepoint reached.
upgrade_plugin_savepoint(true, 2015111021, 'tool', 'lp');
}
return true;
}
+5
View File
@@ -56,6 +56,11 @@ $string['completeplanconfirm'] = 'Set the plan \'{$a}\' to completed? The curren
$string['completeplanstask'] = 'Complete plans which are due';
$string['configurescale'] = 'Configure scales';
$string['coursecompetencies'] = 'Course competencies';
$string['coursecompetencyoutcome_complete'] = 'Marked as complete';
$string['coursecompetencyoutcome_evidence'] = 'Attached to evidence';
$string['coursecompetencyoutcomelabel'] = 'When the course is completed the competency is';
$string['coursecompetencyoutcome_none'] = 'None';
$string['coursecompetencyoutcome_recommend'] = 'Recommended';
$string['coursesusingthiscompetency'] = 'Courses linked to this competency';
$string['coveragesummary'] = '{$a->competenciescoveredcount} of {$a->competenciescount} competencies are covered ( {$a->coveragepercentage} % )';
$string['createplans'] = 'Create plans';
@@ -27,6 +27,14 @@
<span class="drag-handlecontainer pull-left"></span>
<div class="pull-right"><a href="#" data-action="delete-competency-link" data-id="{{id}}">{{#pix}}t/delete, core, {{#str}}delete{{/str}}{{/pix}}</a></div>
{{> tool_lp/competency_summary }}
{{#coursecompetencyoutcomelabel}}
{{coursecompetencyoutcomelabel}}
<select name="ruleoutcome" data-id="{{coursecompetencyid}}">
{{#ruleoutcomeoptions}}
<option value="{{value}}" {{#selected}} selected {{/selected}} >{{text}}</option>
{{/ruleoutcomeoptions}}
</select>
{{/coursecompetencyoutcomelabel}}
</td>
</tr>
{{/competencies}}
+27
View File
@@ -1084,4 +1084,31 @@ class tool_lp_api_testcase extends advanced_testcase {
$this->assertEquals(1, \tool_lp\user_competency::count_records_select('id = :id',
array('id' => $evidence->get_usercompetencyid())));
}
/**
* Test update ruleoutcome for course_competency.
*/
public function test_set_rueloutcome_on_course_competency() {
$this->resetAfterTest(true);
$dg = $this->getDataGenerator();
$lpg = $dg->get_plugin_generator('tool_lp');
$u1 = $dg->create_user();
$u2 = $dg->create_user();
$this->setAdminUser();
$f = $lpg->create_framework();
$c = $lpg->create_competency(array('competencyframeworkid' => $f->get_id()));
$cc = api::add_competency_to_course(1, $c->get_id());
// Check record was created with default rule value Evidence.
$this->assertEquals(1, \tool_lp\course_competency::count_records());
$recordscc = api::list_course_competencies(1);
$this->assertEquals(1, $recordscc[0]['coursecompetency']->get_ruleoutcome());
// Check ruleoutcome value is updated to None.
$this->assertTrue(api::set_ruleoutcome_course_competency($recordscc[0]['coursecompetency']->get_id(), 0));
$recordscc = api::list_course_competencies(1);
$this->assertEquals(0, $recordscc[0]['coursecompetency']->get_ruleoutcome());
}
}
+1 -2
View File
@@ -25,7 +25,6 @@
defined('MOODLE_INTERNAL') || die();
$plugin->version = 2015111020; // The current plugin version (Date: YYYYMMDDXX).
$plugin->version = 2015111021; // The current plugin version (Date: YYYYMMDDXX).
$plugin->requires = 2014110400; // Requires this Moodle version.
$plugin->component = 'tool_lp'; // Full name of the plugin (used for diagnostics).