MDL-50328 tool_lp: Allow competencies to be assigned to a user plan

This commit is contained in:
Issam Taboubi
2016-04-18 10:58:40 +08:00
committed by Frederic Massart
parent 2ec1b70bcd
commit 554b369b60
11 changed files with 644 additions and 16 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)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});
+25
View File
@@ -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) {
+125
View File
@@ -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.
*
+229 -1
View File
@@ -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.
*
+3 -3
View File
@@ -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;
}
}
+14
View File
@@ -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.
*
+11 -3
View File
@@ -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;
}
}
+36
View File
@@ -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',
+25 -7
View File
@@ -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}}
+174
View File
@@ -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());
}
}
+1 -1
View File
@@ -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).