MDL-50328 tool_lp: Allow competencies to be assigned to a user plan
This commit is contained in:
committed by
Frederic Massart
parent
2ec1b70bcd
commit
554b369b60
+1
-1
@@ -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)return null;i=c.call([{methodname:"tool_lp_reorder_template_competency",args:{templateid: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.competencyId;"course"===i.itemtype?(e=[{methodname:"tool_lp_add_competency_to_course",args:{courseid:i.itemid,competencyid:k}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:i.itemid}}],g="tool_lp/course_competencies_page",h="coursecompetenciespage"):"template"===i.itemtype&&(e=[{methodname:"tool_lp_add_competency_to_template",args:{templateid:i.itemid,competencyid:k}},{methodname:"tool_lp_data_for_template_competencies_page",args:{templateid:i.itemid,pagecontext:{contextid:i.pageContextId}}}],g="tool_lp/template_competencies_page",h="templatecompetenciespage"),c.call(e)[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"),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.competencyId;"course"===i.itemtype?(e=[{methodname:"tool_lp_add_competency_to_course",args:{courseid:i.itemid,competencyid:k}},{methodname:"tool_lp_data_for_course_competencies_page",args:{courseid:i.itemid}}],g="tool_lp/course_competencies_page",h="coursecompetenciespage"):"template"===i.itemtype?(e=[{methodname:"tool_lp_add_competency_to_template",args:{templateid:i.itemid,competencyid:k}},{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=[{methodname:"tool_lp_add_competency_to_plan",args:{planid:i.itemid,competencyid:k}},{methodname:"tool_lp_data_for_plan_competencies_page",args:{planid:i.itemid}}],g="tool_lp/plan_page",h="plancompetenciespage"),c.call(e)[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});
|
||||
@@ -98,6 +98,13 @@ define(['jquery',
|
||||
args: { templateid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid }
|
||||
}
|
||||
]);
|
||||
} else if (localthis.itemtype == 'plan') {
|
||||
requests = ajax.call([
|
||||
{
|
||||
methodname: 'tool_lp_reorder_plan_competency',
|
||||
args: { planid: localthis.itemid, competencyidfrom: fromid, competencyidto: toid }
|
||||
}
|
||||
]);
|
||||
} else {
|
||||
return null;
|
||||
}
|
||||
@@ -140,6 +147,15 @@ define(['jquery',
|
||||
];
|
||||
pagerender = 'tool_lp/template_competencies_page';
|
||||
pageregion = 'templatecompetenciespage';
|
||||
} else if (self.itemtype === "plan") {
|
||||
requests = [
|
||||
{ methodname: 'tool_lp_add_competency_to_plan',
|
||||
args: { planid: self.itemid, competencyid: compId }},
|
||||
{ methodname: 'tool_lp_data_for_plan_competencies_page',
|
||||
args: { planid: self.itemid}}
|
||||
];
|
||||
pagerender = 'tool_lp/plan_page';
|
||||
pageregion = 'plancompetenciespage';
|
||||
}
|
||||
|
||||
ajax.call(requests)[1].then(function(context) {
|
||||
@@ -193,6 +209,15 @@ define(['jquery',
|
||||
]);
|
||||
pagerender = 'tool_lp/template_competencies_page';
|
||||
pageregion = 'templatecompetenciespage';
|
||||
} else if (localthis.itemtype == 'plan') {
|
||||
requests = ajax.call([
|
||||
{ methodname: 'tool_lp_remove_competency_from_plan',
|
||||
args: { planid: localthis.itemid, competencyid: deleteid } },
|
||||
{ methodname: 'tool_lp_data_for_plan_competencies_page',
|
||||
args: { planid: localthis.itemid } }
|
||||
]);
|
||||
pagerender = 'tool_lp/plan_page';
|
||||
pageregion = 'plancompetenciespage';
|
||||
}
|
||||
|
||||
requests[1].done(function(context) {
|
||||
|
||||
@@ -537,6 +537,10 @@ class api {
|
||||
if (!in_array($includes, array('children', 'parents', 'self'))) {
|
||||
throw new coding_exception('Invalid parameter value for \'includes\'.');
|
||||
}
|
||||
// If context user swap it for the context_system.
|
||||
if ($context->contextlevel == CONTEXT_USER) {
|
||||
$context = $systemcontext = context_system::instance();
|
||||
}
|
||||
|
||||
$contexts = array($context->id => $context);
|
||||
|
||||
@@ -1352,6 +1356,127 @@ class api {
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a competency to a plan.
|
||||
*
|
||||
* @param int $planid The id of the plan
|
||||
* @param int $competencyid The id of the competency
|
||||
* @return bool
|
||||
*/
|
||||
public static function add_competency_to_plan($planid, $competencyid) {
|
||||
// First we do a permissions check.
|
||||
$plan = new plan($planid);
|
||||
$plan->read();
|
||||
if (!$plan->can_manage()) {
|
||||
$context = context_user::instance($plan->get_userid());
|
||||
throw new required_capability_exception($context, 'tool/lp:planmanage', 'nopermissions', '');
|
||||
}
|
||||
|
||||
if ($plan->is_based_on_template()) {
|
||||
throw new coding_exception('A competency can not be added to a learning plan based on a template');
|
||||
}
|
||||
|
||||
$record = new stdClass();
|
||||
$record->planid = $planid;
|
||||
$record->competencyid = $competencyid;
|
||||
|
||||
$exists = plan_competency::get_records(array('planid' => $planid, 'competencyid' => $competencyid));
|
||||
if (!$exists) {
|
||||
$plancompetency = new plan_competency(0, $record);
|
||||
$plancompetency->create();
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a competency from a plan.
|
||||
*
|
||||
* @param int $planid The plan id
|
||||
* @param int $competencyid The id of the competency
|
||||
* @return bool
|
||||
*/
|
||||
public static function remove_competency_from_plan($planid, $competencyid) {
|
||||
// First we do a permissions check.
|
||||
$plan = new plan($planid);
|
||||
$plan->read();
|
||||
if (!$plan->can_manage()) {
|
||||
$context = context_user::instance($plan->get_userid());
|
||||
throw new required_capability_exception($context, 'tool/lp:planmanage', 'nopermissions', '');
|
||||
}
|
||||
|
||||
if ($plan->is_based_on_template()) {
|
||||
throw new coding_exception('A competency can not be removed from a learning plan based on a template');
|
||||
}
|
||||
|
||||
$record = new stdClass();
|
||||
$record->planid = $planid;
|
||||
$record->competencyid = $competencyid;
|
||||
|
||||
$link = plan_competency::get_record(array('planid' => $planid, 'competencyid' => $competencyid));
|
||||
if ($link) {
|
||||
return $link->delete();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Move the plan competency up or down in the display list.
|
||||
*
|
||||
* Requires tool/lp:planmanage capability at the system context.
|
||||
*
|
||||
* @param int $planid The plan id
|
||||
* @param int $competencyidfrom The id of the competency we are moving.
|
||||
* @param int $competencyidto The id of the competency we are moving to.
|
||||
* @return boolean
|
||||
*/
|
||||
public static function reorder_plan_competency($planid, $competencyidfrom, $competencyidto) {
|
||||
// First we do a permissions check.
|
||||
$plan = new plan($planid);
|
||||
$plan->read();
|
||||
if (!$plan->can_manage()) {
|
||||
$context = context_user::instance($plan->get_userid());
|
||||
throw new required_capability_exception($context, 'tool/lp:planmanage', 'nopermissions', '');
|
||||
}
|
||||
|
||||
if ($plan->is_based_on_template()) {
|
||||
throw new coding_exception('A competency can not be reordered in a learning plan based on a template');
|
||||
}
|
||||
|
||||
$down = true;
|
||||
$matches = plan_competency::get_records(array('planid' => $planid, 'competencyid' => $competencyidfrom));
|
||||
if (count($matches) == 0) {
|
||||
throw new coding_exception('The link does not exist');
|
||||
}
|
||||
|
||||
$competencyfrom = array_pop($matches);
|
||||
$matches = plan_competency::get_records(array('planid' => $planid, 'competencyid' => $competencyidto));
|
||||
if (count($matches) == 0) {
|
||||
throw new coding_exception('The link does not exist');
|
||||
}
|
||||
|
||||
$competencyto = array_pop($matches);
|
||||
|
||||
$all = plan_competency::get_records(array('planid' => $planid), 'sortorder', 'ASC', 0, 0);
|
||||
|
||||
if ($competencyfrom->get_sortorder() > $competencyto->get_sortorder()) {
|
||||
// We are moving up, so put it before the "to" item.
|
||||
$down = false;
|
||||
}
|
||||
|
||||
foreach ($all as $id => $plancompetency) {
|
||||
$sort = $plancompetency->get_sortorder();
|
||||
if ($down && $sort > $competencyfrom->get_sortorder() && $sort <= $competencyto->get_sortorder()) {
|
||||
$plancompetency->set_sortorder($plancompetency->get_sortorder() - 1);
|
||||
$plancompetency->update();
|
||||
} else if (!$down && $sort >= $competencyto->get_sortorder() && $sort < $competencyfrom->get_sortorder()) {
|
||||
$plancompetency->set_sortorder($plancompetency->get_sortorder() + 1);
|
||||
$plancompetency->update();
|
||||
}
|
||||
}
|
||||
$competencyfrom->set_sortorder($competencyto->get_sortorder());
|
||||
return $competencyfrom->update();
|
||||
}
|
||||
|
||||
/**
|
||||
* List all the related competencies.
|
||||
*
|
||||
|
||||
@@ -410,7 +410,7 @@ class external extends external_api {
|
||||
* @return \external_description
|
||||
*/
|
||||
public static function duplicate_competency_framework_returns() {
|
||||
return self::get_competency_framework_external_structure();
|
||||
return self::get_competency_framework_external_structure();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -912,6 +912,20 @@ class external extends external_api {
|
||||
'User who modified this record last'
|
||||
);
|
||||
|
||||
// Extra params.
|
||||
$gradename = new external_value(
|
||||
PARAM_TEXT,
|
||||
'User competency status name'
|
||||
);
|
||||
$proficiencyname = new external_value(
|
||||
PARAM_TEXT,
|
||||
'User competency proficiency name'
|
||||
);
|
||||
$statusname = new external_value(
|
||||
PARAM_TEXT,
|
||||
'User competency status name'
|
||||
);
|
||||
|
||||
$returns = array(
|
||||
'id' => $id,
|
||||
'userid' => $userid,
|
||||
@@ -923,6 +937,9 @@ class external extends external_api {
|
||||
'timecreated' => $timecreated,
|
||||
'timemodified' => $timemodified,
|
||||
'usermodified' => $usermodified,
|
||||
'gradename' => $gradename,
|
||||
'proficiencyname' => $proficiencyname,
|
||||
'statusname' => $statusname,
|
||||
);
|
||||
|
||||
return new external_single_structure($returns);
|
||||
@@ -2888,6 +2905,104 @@ class external extends external_api {
|
||||
return new external_value(PARAM_BOOL, 'True if successful.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of add_competency_to_plan() parameters.
|
||||
*
|
||||
* @return \external_function_parameters
|
||||
*/
|
||||
public static function add_competency_to_plan_parameters() {
|
||||
$planid = new external_value(
|
||||
PARAM_INT,
|
||||
'The plan id',
|
||||
VALUE_REQUIRED
|
||||
);
|
||||
$competencyid = new external_value(
|
||||
PARAM_INT,
|
||||
'The competency id',
|
||||
VALUE_REQUIRED
|
||||
);
|
||||
$params = array(
|
||||
'planid' => $planid,
|
||||
'competencyid' => $competencyid,
|
||||
);
|
||||
return new external_function_parameters($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* add competency to a learning plan.
|
||||
*
|
||||
* @param int $planid Plan id.
|
||||
* @param int $competencyid Competency id.
|
||||
* @return int
|
||||
*/
|
||||
public static function add_competency_to_plan($planid, $competencyid) {
|
||||
$params = self::validate_parameters(self::add_competency_to_plan_parameters(),
|
||||
array(
|
||||
'planid' => $planid,
|
||||
'competencyid' => $competencyid,
|
||||
));
|
||||
|
||||
return api::add_competency_to_plan($params['planid'], $params['competencyid']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of add_competency_to_plan() result value.
|
||||
*
|
||||
* @return \external_description
|
||||
*/
|
||||
public static function add_competency_to_plan_returns() {
|
||||
return new external_value(PARAM_BOOL, 'True if successful.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of remove_competency_from_plan() parameters.
|
||||
*
|
||||
* @return \external_function_parameters
|
||||
*/
|
||||
public static function remove_competency_from_plan_parameters() {
|
||||
$planid = new external_value(
|
||||
PARAM_INT,
|
||||
'The plan id',
|
||||
VALUE_REQUIRED
|
||||
);
|
||||
$competencyid = new external_value(
|
||||
PARAM_INT,
|
||||
'The competency id',
|
||||
VALUE_REQUIRED
|
||||
);
|
||||
$params = array(
|
||||
'planid' => $planid,
|
||||
'competencyid' => $competencyid,
|
||||
);
|
||||
return new external_function_parameters($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a competency from plan.
|
||||
*
|
||||
* @param int $planid Plan id.
|
||||
* @param int $competencyid Competency id.
|
||||
* @return int
|
||||
*/
|
||||
public static function remove_competency_from_plan($planid, $competencyid) {
|
||||
$params = self::validate_parameters(self::remove_competency_from_plan_parameters(),
|
||||
array(
|
||||
'planid' => $planid,
|
||||
'competencyid' => $competencyid,
|
||||
));
|
||||
|
||||
return api::remove_competency_from_plan($params['planid'], $params['competencyid']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of remove_competency_from_plan() result value.
|
||||
*
|
||||
* @return \external_description
|
||||
*/
|
||||
public static function remove_competency_from_plan_returns() {
|
||||
return new external_value(PARAM_BOOL, 'True if successful.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of remove_competency_from_template() parameters.
|
||||
*
|
||||
@@ -2911,6 +3026,63 @@ class external extends external_api {
|
||||
return new external_function_parameters($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of reorder_plan_competency() parameters.
|
||||
*
|
||||
* @return \external_function_parameters
|
||||
*/
|
||||
public static function reorder_plan_competency_parameters() {
|
||||
$planid = new external_value(
|
||||
PARAM_INT,
|
||||
'The plan id',
|
||||
VALUE_REQUIRED
|
||||
);
|
||||
$competencyidfrom = new external_value(
|
||||
PARAM_INT,
|
||||
'The competency id we are moving',
|
||||
VALUE_REQUIRED
|
||||
);
|
||||
$competencyidto = new external_value(
|
||||
PARAM_INT,
|
||||
'The competency id we are moving to',
|
||||
VALUE_REQUIRED
|
||||
);
|
||||
$params = array(
|
||||
'planid' => $planid,
|
||||
'competencyidfrom' => $competencyidfrom,
|
||||
'competencyidto' => $competencyidto,
|
||||
);
|
||||
return new external_function_parameters($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Change the order of plan competencies.
|
||||
*
|
||||
* @param int $planid The plan id
|
||||
* @param int $competencyidfrom The competency to move.
|
||||
* @param int $competencyidto The competency to move to.
|
||||
* @return bool
|
||||
*/
|
||||
public static function reorder_plan_competency($planid, $competencyidfrom, $competencyidto) {
|
||||
$params = self::validate_parameters(self::reorder_plan_competency_parameters(),
|
||||
array(
|
||||
'planid' => $planid,
|
||||
'competencyidfrom' => $competencyidfrom,
|
||||
'competencyidto' => $competencyidto,
|
||||
));
|
||||
|
||||
return api::reorder_plan_competency($params['planid'], $params['competencyidfrom'], $params['competencyidto']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of reorder_plan_competency() result value.
|
||||
*
|
||||
* @return \external_description
|
||||
*/
|
||||
public static function reorder_plan_competency_returns() {
|
||||
return new external_value(PARAM_BOOL, 'True if successful.');
|
||||
}
|
||||
|
||||
/**
|
||||
* Count the competencies (visible to this user) in this learning plan template.
|
||||
*
|
||||
@@ -2996,6 +3168,62 @@ class external extends external_api {
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of data_for_plan_competenies_page() parameters.
|
||||
*
|
||||
* @return \external_function_parameters
|
||||
*/
|
||||
public static function data_for_plan_competencies_page_parameters() {
|
||||
$planid = new external_value(
|
||||
PARAM_INT,
|
||||
'The plan id',
|
||||
VALUE_REQUIRED
|
||||
);
|
||||
$params = array('planid' => $planid);
|
||||
return new external_function_parameters($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the data required to render the plan_competencies_page template.
|
||||
*
|
||||
* @param int $planid Learning Plan id.
|
||||
* @return boolean
|
||||
*/
|
||||
public static function data_for_plan_competencies_page($planid) {
|
||||
global $PAGE;
|
||||
$params = self::validate_parameters(self::data_for_plan_competencies_page_parameters(),
|
||||
array(
|
||||
'planid' => $planid
|
||||
));
|
||||
$plan = api::read_plan($planid);
|
||||
$renderable = new output\plan_page($plan);
|
||||
$renderer = $PAGE->get_renderer('tool_lp');
|
||||
|
||||
$data = $renderable->export_for_template($renderer);
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns description of data_for_plan_competencies_page() result value.
|
||||
*
|
||||
* @return \external_description
|
||||
*/
|
||||
public static function data_for_plan_competencies_page_returns() {
|
||||
|
||||
return new external_single_structure(array (
|
||||
'planid' => new external_value(PARAM_INT, 'Learning Plan id'),
|
||||
'canmanage' => new external_value(PARAM_BOOL, 'User can manage learning plan'),
|
||||
'competencies' => new external_multiple_structure(
|
||||
new external_single_structure(array(
|
||||
'competency' => self::get_competency_external_structure(),
|
||||
'usercompetency' => self::get_user_competency_external_structure(),
|
||||
))
|
||||
)
|
||||
));
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* A learning plan structure.
|
||||
*
|
||||
|
||||
@@ -28,8 +28,6 @@ use templatable;
|
||||
use stdClass;
|
||||
use tool_lp\api;
|
||||
use tool_lp\user_competency;
|
||||
use context_user;
|
||||
|
||||
/**
|
||||
* Plan page class.
|
||||
*
|
||||
@@ -64,6 +62,9 @@ class plan_page implements renderable, templatable {
|
||||
|
||||
$data = new stdClass();
|
||||
$data->competencies = array();
|
||||
$data->planid = $this->plan->get_id();
|
||||
$data->canmanage = $this->plan->can_manage() && !$this->plan->is_based_on_template();
|
||||
$data->contextid = $this->plan->get_context()->id;
|
||||
|
||||
$pclist = api::list_plan_competencies($this->plan);
|
||||
foreach ($pclist as $pc) {
|
||||
@@ -108,7 +109,6 @@ class plan_page implements renderable, templatable {
|
||||
|
||||
$data->competencies[] = $competency;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -649,6 +649,20 @@ abstract class persistent {
|
||||
return $instances;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a single record.
|
||||
*
|
||||
* @param array $filters Filters to apply.
|
||||
*
|
||||
* @return \tool_lp\persistent
|
||||
*/
|
||||
public static function get_record($filters = array()) {
|
||||
global $DB;
|
||||
|
||||
$record = $DB->get_record(static::TABLE, $filters);
|
||||
return $record ? new static(0, $record) : false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a list of records based on a select query.
|
||||
*
|
||||
|
||||
@@ -120,9 +120,8 @@ class plan extends persistent {
|
||||
// Get the competencies from the template.
|
||||
$competencies = template_competency::list_competencies($this->get_templateid(), true);
|
||||
} else {
|
||||
// TODO MDL-50328.
|
||||
// Get the competencies in this plan.
|
||||
// $competencies = plan_competency::list_competencies($this->get_id());
|
||||
// Get the competencies from the plan.
|
||||
$competencies = plan_competency::list_competencies($this->get_id());
|
||||
}
|
||||
return $competencies;
|
||||
}
|
||||
@@ -271,4 +270,13 @@ class plan extends persistent {
|
||||
return $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if a template is associated to the plan.
|
||||
*
|
||||
* @return bool
|
||||
*/
|
||||
public function is_based_on_template() {
|
||||
return $this->get_templateid() !== null;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -424,6 +424,15 @@ $functions = array(
|
||||
'capabilities' => 'tool/lp:planviewown',
|
||||
'ajax' => true,
|
||||
),
|
||||
'tool_lp_data_for_plan_competencies_page' => array(
|
||||
'classname' => 'tool_lp\external',
|
||||
'methodname' => 'data_for_plan_competencies_page',
|
||||
'classpath' => '',
|
||||
'description' => 'Load the data for the plan competencies page template.',
|
||||
'type' => 'read',
|
||||
'capabilities' => 'tool/lp:planview',
|
||||
'ajax' => true,
|
||||
),
|
||||
'tool_lp_list_plan_competencies' => array(
|
||||
'classname' => 'tool_lp\external',
|
||||
'methodname' => 'list_plan_competencies',
|
||||
@@ -433,6 +442,33 @@ $functions = array(
|
||||
'capabilities' => 'tool/lp:planviewown',
|
||||
'ajax' => true,
|
||||
),
|
||||
'tool_lp_add_competency_to_plan' => array(
|
||||
'classname' => 'tool_lp\external',
|
||||
'methodname' => 'add_competency_to_plan',
|
||||
'classpath' => '',
|
||||
'description' => 'Add the competency to a learning plan',
|
||||
'type' => 'write',
|
||||
'capabilities' => 'tool/lp:planmanage',
|
||||
'ajax' => true,
|
||||
),
|
||||
'tool_lp_remove_competency_from_plan' => array(
|
||||
'classname' => 'tool_lp\external',
|
||||
'methodname' => 'remove_competency_from_plan',
|
||||
'classpath' => '',
|
||||
'description' => 'Remove the competency from a learning plan',
|
||||
'type' => 'write',
|
||||
'capabilities' => 'tool/lp:planmanage',
|
||||
'ajax' => true,
|
||||
),
|
||||
'tool_lp_reorder_plan_competency' => array(
|
||||
'classname' => 'tool_lp\external',
|
||||
'methodname' => 'reorder_plan_competency',
|
||||
'classpath' => '',
|
||||
'description' => 'Move a plan competency to a new relative sort order.',
|
||||
'type' => 'write',
|
||||
'capabilities' => 'tool/lp:planmanage',
|
||||
'ajax' => true,
|
||||
),
|
||||
'tool_lp_get_scale_values' => array(
|
||||
'classname' => 'tool_lp\external',
|
||||
'methodname' => 'get_scale_values',
|
||||
|
||||
@@ -17,9 +17,8 @@
|
||||
{{!
|
||||
Plan page template.
|
||||
}}
|
||||
<div data-region="planpage">
|
||||
|
||||
<table class="generaltable fullwidth">
|
||||
<div data-region="plancompetenciespage">
|
||||
<table class="generaltable fullwidth managecompetencies">
|
||||
<thead>
|
||||
<tr>
|
||||
<th scope="col">{{#str}}shortname, tool_lp{{/str}}</th>
|
||||
@@ -29,14 +28,25 @@
|
||||
<th scope="col">{{#str}}actions, tool_lp{{/str}}</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<tbody class="drag-parentnode">
|
||||
{{#competencies}}
|
||||
<tr data-id="{{id}}">
|
||||
<td>{{shortname}}</td>
|
||||
<tr class="drag-samenode" data-id="{{id}}">
|
||||
<td>
|
||||
{{#canmanage}}
|
||||
<span class="drag-handlecontainer pull-left"></span>
|
||||
{{/canmanage}}
|
||||
{{shortname}}
|
||||
</td>
|
||||
<td>{{usercompetency.gradename}}</td>
|
||||
<td>{{usercompetency.proficiencyname}}</td>
|
||||
<td>{{usercompetency.statusname}}</td>
|
||||
<td><!-- Option to remove the competency from the plan, ... --></td>
|
||||
<td>
|
||||
{{#canmanage}}
|
||||
<div class="pull-left">
|
||||
<a href="#" data-action="delete-competency-link" data-id="{{id}}">{{#pix}}t/delete, core, {{#str}}delete{{/str}}{{/pix}}</a>
|
||||
</div>
|
||||
{{/canmanage}}
|
||||
</td>
|
||||
</tr>
|
||||
{{/competencies}}
|
||||
</tbody>
|
||||
@@ -45,9 +55,17 @@
|
||||
<div data-region="actions">
|
||||
<div class="pull-right">
|
||||
<!-- Button to add competencies to the plan -->
|
||||
{{#canmanage}}
|
||||
<button class="btn" data-action="add">{{#pix}}t/add{{/pix}} {{#str}}addcompetency, tool_lp{{/str}}</button>
|
||||
{{/canmanage}}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
{{#canmanage}}
|
||||
{{#js}}
|
||||
require(['tool_lp/competencies'], function(mod) {
|
||||
(new mod({{planid}}, 'plan', {{contextid}}));
|
||||
});
|
||||
{{/js}}
|
||||
{{/canmanage}}
|
||||
|
||||
@@ -31,6 +31,7 @@ use tool_lp\external;
|
||||
use tool_lp\plan;
|
||||
use tool_lp\related_competency;
|
||||
use tool_lp\user_competency;
|
||||
use tool_lp\plan_competency;
|
||||
|
||||
/**
|
||||
* External learning plans webservice API tests.
|
||||
@@ -2092,4 +2093,177 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
|
||||
$this->assertEquals($c2->get_id(), $result[3]['relatedcompetencies'][0]['id']);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that we can add competency to plan if we have the right capability.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_add_competency_to_plan() {
|
||||
$this->resetAfterTest(true);
|
||||
$dg = $this->getDataGenerator();
|
||||
$lpg = $this->getDataGenerator()->get_plugin_generator('tool_lp');
|
||||
$usermanage = $dg->create_user();
|
||||
$user = $dg->create_user();
|
||||
|
||||
$syscontext = context_system::instance();
|
||||
|
||||
// Creating specific roles.
|
||||
$managerole = $dg->create_role(array(
|
||||
'name' => 'User manage',
|
||||
'shortname' => 'manage'
|
||||
));
|
||||
|
||||
assign_capability('tool/lp:planmanage', CAP_ALLOW, $managerole, $syscontext->id);
|
||||
assign_capability('tool/lp:planview', CAP_ALLOW, $managerole, $syscontext->id);
|
||||
|
||||
$dg->role_assign($managerole, $usermanage->id, $syscontext->id);
|
||||
|
||||
$this->setUser($usermanage);
|
||||
$plan = array (
|
||||
'userid' => $usermanage->id,
|
||||
'status' => \tool_lp\plan::STATUS_ACTIVE
|
||||
);
|
||||
$pl1 = $lpg->create_plan($plan);
|
||||
$framework = $lpg->create_framework();
|
||||
$competency = $lpg->create_competency(
|
||||
array('competencyframeworkid' => $framework->get_id())
|
||||
);
|
||||
$this->assertTrue(external::add_competency_to_plan($pl1->get_id(), $competency->get_id()));
|
||||
|
||||
// A competency cannot be added to plan based on template.
|
||||
$template = $lpg->create_template();
|
||||
$plan = array (
|
||||
'userid' => $usermanage->id,
|
||||
'status' => \tool_lp\plan::STATUS_ACTIVE,
|
||||
'templateid' => $template->get_id()
|
||||
);
|
||||
$pl2 = $lpg->create_plan($plan);
|
||||
try {
|
||||
external::add_competency_to_plan($pl2->get_id(), $competency->get_id());
|
||||
$this->fail('A competency cannot be added to plan based on template');
|
||||
} catch (coding_exception $ex) {
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
|
||||
// User without capability cannot add competency to a plan.
|
||||
$this->setUser($user);
|
||||
try {
|
||||
external::add_competency_to_plan($pl1->get_id(), $competency->get_id());
|
||||
$this->fail('User without capability cannot add competency to a plan');
|
||||
} catch (required_capability_exception $ex) {
|
||||
$this->assertTrue(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that we can add competency to plan if we have the right capability.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_remove_competency_from_plan() {
|
||||
$this->resetAfterTest(true);
|
||||
$dg = $this->getDataGenerator();
|
||||
$lpg = $this->getDataGenerator()->get_plugin_generator('tool_lp');
|
||||
$usermanage = $dg->create_user();
|
||||
$user = $dg->create_user();
|
||||
|
||||
$syscontext = context_system::instance();
|
||||
|
||||
// Creating specific roles.
|
||||
$managerole = $dg->create_role(array(
|
||||
'name' => 'User manage',
|
||||
'shortname' => 'manage'
|
||||
));
|
||||
|
||||
assign_capability('tool/lp:planmanage', CAP_ALLOW, $managerole, $syscontext->id);
|
||||
assign_capability('tool/lp:planview', CAP_ALLOW, $managerole, $syscontext->id);
|
||||
|
||||
$dg->role_assign($managerole, $usermanage->id, $syscontext->id);
|
||||
|
||||
$this->setUser($usermanage);
|
||||
$plan = array (
|
||||
'userid' => $usermanage->id,
|
||||
'status' => \tool_lp\plan::STATUS_ACTIVE
|
||||
);
|
||||
$pl1 = $lpg->create_plan($plan);
|
||||
$framework = $lpg->create_framework();
|
||||
$competency = $lpg->create_competency(
|
||||
array('competencyframeworkid' => $framework->get_id())
|
||||
);
|
||||
$lpg->create_plan_competency(
|
||||
array(
|
||||
'planid' => $pl1->get_id(),
|
||||
'competencyid' => $competency->get_id()
|
||||
)
|
||||
);
|
||||
$this->assertTrue(external::remove_competency_from_plan($pl1->get_id(), $competency->get_id()));
|
||||
$this->assertCount(0, $pl1->get_competencies());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that we can add competency to plan if we have the right capability.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function test_reorder_plan_competency() {
|
||||
$this->resetAfterTest(true);
|
||||
$dg = $this->getDataGenerator();
|
||||
$lpg = $this->getDataGenerator()->get_plugin_generator('tool_lp');
|
||||
$usermanage = $dg->create_user();
|
||||
$user = $dg->create_user();
|
||||
|
||||
$syscontext = context_system::instance();
|
||||
|
||||
// Creating specific roles.
|
||||
$managerole = $dg->create_role(array(
|
||||
'name' => 'User manage',
|
||||
'shortname' => 'manage'
|
||||
));
|
||||
|
||||
assign_capability('tool/lp:planmanage', CAP_ALLOW, $managerole, $syscontext->id);
|
||||
assign_capability('tool/lp:planview', CAP_ALLOW, $managerole, $syscontext->id);
|
||||
|
||||
$dg->role_assign($managerole, $usermanage->id, $syscontext->id);
|
||||
|
||||
$this->setUser($usermanage);
|
||||
$plan = array (
|
||||
'userid' => $usermanage->id,
|
||||
'status' => \tool_lp\plan::STATUS_ACTIVE
|
||||
);
|
||||
$pl1 = $lpg->create_plan($plan);
|
||||
$framework = $lpg->create_framework();
|
||||
$c1 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
|
||||
$c2 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
|
||||
$c3 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
|
||||
$c4 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
|
||||
$c5 = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
|
||||
|
||||
$lpg->create_plan_competency(array('planid' => $pl1->get_id(), 'competencyid' => $c1->get_id(), 'sortorder' => 1));
|
||||
$lpg->create_plan_competency(array('planid' => $pl1->get_id(), 'competencyid' => $c2->get_id(), 'sortorder' => 2));
|
||||
$lpg->create_plan_competency(array('planid' => $pl1->get_id(), 'competencyid' => $c3->get_id(), 'sortorder' => 3));
|
||||
$lpg->create_plan_competency(array('planid' => $pl1->get_id(), 'competencyid' => $c4->get_id(), 'sortorder' => 4));
|
||||
$lpg->create_plan_competency(array('planid' => $pl1->get_id(), 'competencyid' => $c5->get_id(), 'sortorder' => 5));
|
||||
|
||||
$this->assertTrue(external::reorder_plan_competency($pl1->get_id(), $c2->get_id(), $c5->get_id()));
|
||||
$this->assertTrue(external::reorder_plan_competency($pl1->get_id(), $c3->get_id(), $c4->get_id()));
|
||||
$plancompetencies = plan_competency::get_records(
|
||||
array(
|
||||
'planid' => $pl1->get_id()
|
||||
),
|
||||
'sortorder',
|
||||
'ASC'
|
||||
);
|
||||
$plcmp1 = $plancompetencies[0];
|
||||
$plcmp2 = $plancompetencies[1];
|
||||
$plcmp3 = $plancompetencies[2];
|
||||
$plcmp4 = $plancompetencies[3];
|
||||
$plcmp5 = $plancompetencies[4];
|
||||
|
||||
$this->assertEquals($plcmp1->get_competencyid(), $c1->get_id());
|
||||
$this->assertEquals($plcmp2->get_competencyid(), $c4->get_id());
|
||||
$this->assertEquals($plcmp3->get_competencyid(), $c3->get_id());
|
||||
$this->assertEquals($plcmp4->get_competencyid(), $c5->get_id());
|
||||
$this->assertEquals($plcmp5->get_competencyid(), $c2->get_id());
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
|
||||
$plugin->version = 2015052424; // The current plugin version (Date: YYYYMMDDXX).
|
||||
$plugin->version = 2015052425; // 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).
|
||||
|
||||
|
||||
Reference in New Issue
Block a user