MDL-52229 tool_lp: Handle hidden templates/frameworks
authorIssam Taboubi <issam.taboubi@umontreal.ca>
Tue, 8 Dec 2015 22:03:24 +0000 (17:03 -0500)
committerFrederic Massart <fred@moodle.com>
Mon, 18 Apr 2016 02:58:46 +0000 (10:58 +0800)
25 files changed:
admin/tool/lp/amd/build/competencyactions.min.js
admin/tool/lp/amd/build/competencypicker.min.js
admin/tool/lp/amd/src/competencyactions.js
admin/tool/lp/amd/src/competencypicker.js
admin/tool/lp/classes/api.php
admin/tool/lp/classes/competency.php
admin/tool/lp/classes/course_competency.php
admin/tool/lp/classes/external.php
admin/tool/lp/classes/form/competency.php
admin/tool/lp/classes/template_competency.php
admin/tool/lp/db/install.xml
admin/tool/lp/db/upgrade.php
admin/tool/lp/lang/en/tool_lp.php
admin/tool/lp/template_cohorts.php
admin/tool/lp/template_plans.php
admin/tool/lp/templates/competencies_move_tree.mustache
admin/tool/lp/templates/competencies_tree.mustache
admin/tool/lp/templates/competency_summary.mustache
admin/tool/lp/templates/manage_competencies_page.mustache
admin/tool/lp/templates/related_competencies.mustache
admin/tool/lp/tests/api_test.php
admin/tool/lp/tests/externallib_test.php
admin/tool/lp/tests/generator/lib.php
admin/tool/lp/tests/persistent_test.php
admin/tool/lp/version.php

index a10f9ca..221fe49 100644 (file)
Binary files a/admin/tool/lp/amd/build/competencyactions.min.js and b/admin/tool/lp/amd/build/competencyactions.min.js differ
index 1a1dc31..ff3f819 100644 (file)
Binary files a/admin/tool/lp/amd/build/competencypicker.min.js and b/admin/tool/lp/amd/build/competencypicker.min.js differ
index a02e747..a0d21a5 100644 (file)
@@ -376,7 +376,6 @@ define(['jquery',
             idnumber: relatedTarget.idnumber,
             description: relatedTarget.description,
             descriptionformat: relatedTarget.descriptionformat,
-            visible: relatedTarget.visible,
             ruletype: config.ruletype,
             ruleoutcome: config.ruleoutcome,
             ruleconfig: config.ruleconfig
index 1d917a6..75a433d 100644 (file)
@@ -80,6 +80,8 @@ define(['jquery',
     Picker.prototype._singleFramework = false;
     /** @type {Boolean} Do we allow multi select? */
     Picker.prototype._multiSelect = true;
+    /** @type {Boolean} Do we allow to display hidden framework? */
+    Picker.prototype._onlyVisible = true;
 
     /**
      * Hook to executed after the view is rendered.
@@ -324,7 +326,8 @@ define(['jquery',
                 { methodname: 'tool_lp_list_competency_frameworks', args: {
                     sort: 'shortname',
                     context: { contextid: self._pageContextId },
-                    includes: self._pageContextIncludes
+                    includes: self._pageContextIncludes,
+                    onlyvisible: self._onlyVisible
                 }}
             ])[0];
         }
index be9abaf..0578bd5 100644 (file)
@@ -502,9 +502,10 @@ class api {
      *                          - children: All descendants
      *                          - parents: All parents, grand parents, etc...
      *                          - self: Context passed only.
+     * @param bool $onlyvisible If true return only visible frameworks
      * @return array of competency_framework
      */
-    public static function list_frameworks($sort, $order, $skip, $limit, $context, $includes = 'children') {
+    public static function list_frameworks($sort, $order, $skip, $limit, $context, $includes = 'children', $onlyvisible = false) {
         global $DB;
 
         // Get all the relevant contexts.
@@ -517,7 +518,13 @@ class api {
 
         // OK - all set.
         list($insql, $inparams) = $DB->get_in_or_equal(array_keys($contexts), SQL_PARAMS_NAMED);
-        return competency_framework::get_records_select("contextid $insql", $inparams, $sort . ' ' . $order, '*', $skip, $limit);
+        $select = "contextid $insql";
+        if ($onlyvisible) {
+            $select .= " AND visible = :visible";
+            $inparams['visible'] = 1;
+        }
+
+        return competency_framework::get_records_select($select, $inparams, $sort . ' ' . $order, '*', $skip, $limit);
     }
 
     /**
@@ -682,19 +689,14 @@ class api {
 
         // First we do a permissions check.
         $context = context_course::instance($courseid);
-        $onlyvisible = 1;
 
         $capabilities = array('tool/lp:coursecompetencyread', 'tool/lp:coursecompetencymanage');
         if (!has_any_capability($capabilities, $context)) {
              throw new required_capability_exception($context, 'tool/lp:coursecompetencyread', 'nopermissions', '');
         }
 
-        if (has_capability('tool/lp:coursecompetencymanage', $context)) {
-            $onlyvisible = 0;
-        }
-
         // OK - all set.
-        return course_competency::count_competencies($courseid, $onlyvisible);
+        return course_competency::count_competencies($courseid);
     }
 
     /**
@@ -715,22 +717,17 @@ class api {
         // Check the user have access to the course.
         self::validate_course($course);
         $context = context_course::instance($course->id);
-        $onlyvisible = 1;
 
         $capabilities = array('tool/lp:coursecompetencyread', 'tool/lp:coursecompetencymanage');
         if (!has_any_capability($capabilities, $context)) {
             throw new required_capability_exception($context, 'tool/lp:coursecompetencyread', 'nopermissions', '');
         }
 
-        if (has_capability('tool/lp:coursecompetencymanage', $context)) {
-            $onlyvisible = 0;
-        }
-
         $result = array();
 
         // TODO We could improve the performance of this into one single query.
-        $coursecompetencies = course_competency::list_course_competencies($course->id, $onlyvisible);
-        $competencies = course_competency::list_competencies($course->id, $onlyvisible);
+        $coursecompetencies = course_competency::list_course_competencies($course->id);
+        $competencies = course_competency::list_competencies($course->id);
 
         // Build the return values.
         foreach ($coursecompetencies as $key => $coursecompetency) {
@@ -763,10 +760,11 @@ class api {
         $record->courseid = $courseid;
         $record->competencyid = $competencyid;
 
-        $competency = new competency();
-        $competency->set_id($competencyid);
-        if (!$competency->read()) {
-             throw new coding_exception('The competency does not exist');
+        $competency = new competency($competencyid);
+
+        // Can not add a competency that belong to a hidden framework.
+        if ($competency->get_framework()->get_visible() == false) {
+            throw new coding_exception('A competency belonging to hidden framework can not be linked to course');
         }
 
         $coursecompetency = new course_competency();
@@ -800,12 +798,7 @@ class api {
         $record->courseid = $courseid;
         $record->competencyid = $competencyid;
 
-        $competency = new competency();
-        $competency->set_id($competencyid);
-        if (!$competency->read()) {
-             throw new coding_exception('The competency does not exist');
-        }
-
+        $competency = new competency($competencyid);
         $coursecompetency = new course_competency();
         $exists = $coursecompetency->get_records(array('courseid' => $courseid, 'competencyid' => $competencyid));
         if ($exists) {
@@ -1055,9 +1048,10 @@ class api {
      *                          - children: All descendants
      *                          - parents: All parents, grand parents, etc...
      *                          - self: Context passed only.
+     * @param bool $onlyvisible If should list only visible templates
      * @return array of competency_framework
      */
-    public static function list_templates($sort, $order, $skip, $limit, $context, $includes = 'children') {
+    public static function list_templates($sort, $order, $skip, $limit, $context, $includes = 'children', $onlyvisible = false) {
         global $DB;
 
         // Get all the relevant contexts.
@@ -1077,8 +1071,14 @@ class api {
 
         // OK - all set.
         $template = new template();
-        list($insql, $inparams) = $DB->get_in_or_equal(array_keys($contexts), SQL_PARAMS_NAMED);
-        return $template->get_records_select("contextid $insql", $inparams, $orderby, '*', $skip, $limit);
+        list($insql, $params) = $DB->get_in_or_equal(array_keys($contexts), SQL_PARAMS_NAMED);
+        $select = "contextid $insql";
+
+        if ($onlyvisible) {
+            $select .= " AND visible = :visible";
+            $params['visible'] = 1;
+        }
+        return $template->get_records_select($select, $params, $orderby, '*', $skip, $limit);
     }
 
     /**
@@ -1170,18 +1170,13 @@ class api {
         // First we do a permissions check.
         $template = new template($templateid);
         $context = $template->get_context();
-        $onlyvisible = 1;
 
         if (!$template->can_read()) {
             throw new required_capability_exception($template->get_context(), 'tool/lp:templateread', 'nopermissions', '');
         }
 
-        if ($template->can_manage()) {
-            $onlyvisible = 0;
-        }
-
         // OK - all set.
-        return template_competency::count_competencies($templateid, $onlyvisible);
+        return template_competency::count_competencies($templateid);
     }
 
     /**
@@ -1194,18 +1189,13 @@ class api {
         // First we do a permissions check.
         $template = new template($templateid);
         $context = $template->get_context();
-        $onlyvisible = 1;
 
         if (!$template->can_read()) {
             throw new required_capability_exception($template->get_context(), 'tool/lp:templateread', 'nopermissions', '');
         }
 
-        if ($template->can_manage()) {
-            $onlyvisible = 0;
-        }
-
         // OK - all set.
-        return template_competency::list_competencies($templateid, $onlyvisible);
+        return template_competency::list_competencies($templateid);
     }
 
     /**
@@ -1226,10 +1216,11 @@ class api {
         $record->templateid = $templateid;
         $record->competencyid = $competencyid;
 
-        $competency = new competency();
-        $competency->set_id($competencyid);
-        if (!$competency->read()) {
-            throw new coding_exception('The competency does not exist');
+        $competency = new competency($competencyid);
+
+        // Can not add a competency that belong to a hidden framework.
+        if ($competency->get_framework()->get_visible() == false) {
+            throw new coding_exception('A competency belonging to hidden framework can not be added');
         }
 
         $exists = template_competency::get_records(array('templateid' => $templateid, 'competencyid' => $competencyid));
@@ -1260,10 +1251,6 @@ class api {
         $record->competencyid = $competencyid;
 
         $competency = new competency($competencyid);
-        $competency->set_id($competencyid);
-        if (!$competency->read()) {
-             throw new coding_exception('The competency does not exist');
-        }
 
         $exists = template_competency::get_records(array('templateid' => $templateid, 'competencyid' => $competencyid));
         if ($exists) {
@@ -1461,6 +1448,10 @@ class api {
         if (!$template->can_read()) {
             throw new required_capability_exception($template->get_context(), 'tool/lp:templateread', 'nopermissions', '');
         }
+        // Can not create plan from a hidden template.
+        if ($template->get_visible() == false) {
+            throw new coding_exception('A plan can not be created from a hidden template');
+        }
 
         // Convert the template to a plan.
         $record = $template->to_record();
@@ -1520,6 +1511,11 @@ class api {
             throw new required_capability_exception($template->get_context(), 'tool/lp:templateread', 'nopermissions', '');
         }
 
+        // Can not create plan from a hidden template.
+        if ($template->get_visible() == false) {
+            throw new coding_exception('A plan can not be created from a hidden template');
+        }
+
         // The user must be able to view the cohort.
         $cohort = $DB->get_record('cohort', array('id' => $cohortid), '*', MUST_EXIST);
         $cohortctx = context::instance_by_id($cohort->contextid);
@@ -1904,6 +1900,13 @@ class api {
             throw new coding_exception('A competency can not be added to a learning plan completed');
         }
 
+        $competency = new competency($competencyid);
+
+        // Can not add a competency that belong to a hidden framework.
+        if ($competency->get_framework()->get_visible() == false) {
+            throw new coding_exception('A competency belonging to hidden framework can not be added');
+        }
+
         $exists = plan_competency::get_record(array('planid' => $planid, 'competencyid' => $competencyid));
         if (!$exists) {
             $record = new stdClass();
index 221e116..3588c7a 100644 (file)
@@ -79,10 +79,6 @@ class competency extends persistent {
                 'default' => null,
                 'type' => PARAM_INT
             ),
-            'visible' => array(
-                'default' => 1,
-                'type' => PARAM_BOOL
-            ),
             'parentid' => array(
                 'default' => 0,
                 'type' => PARAM_INT
index a2d7335..c39d386 100644 (file)
@@ -200,10 +200,9 @@ class course_competency extends persistent {
      * Count the competencies in this course.
      *
      * @param int $courseid The course id
-     * @param bool $onlyvisible If true, only count visible competencies in this course.
      * @return int
      */
-    public static function count_competencies($courseid, $onlyvisible) {
+    public static function count_competencies($courseid) {
         global $DB;
 
         $sql = 'SELECT COUNT(comp.id)
@@ -213,11 +212,6 @@ class course_competency extends persistent {
                  WHERE coursecomp.courseid = ? ';
         $params = array($courseid);
 
-        if ($onlyvisible) {
-            $sql .= ' AND comp.visible = ?';
-            $params[] = 1;
-        }
-
         $results = $DB->count_records_sql($sql, $params);
 
         return $results;
@@ -227,10 +221,9 @@ class course_competency extends persistent {
      * List the competencies in this course.
      *
      * @param int $courseid The course id
-     * @param bool $onlyvisible If true, only count visible competencies in this course.
      * @return competency[] Indexed by competency ID.
      */
-    public static function list_competencies($courseid, $onlyvisible) {
+    public static function list_competencies($courseid) {
         global $DB;
 
         $sql = 'SELECT comp.*
@@ -240,11 +233,6 @@ class course_competency extends persistent {
                  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();
@@ -278,10 +266,9 @@ class course_competency extends persistent {
      * 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) {
+    public static function list_course_competencies($courseid) {
         global $DB;
 
         $sql = 'SELECT coursecomp.*
@@ -291,11 +278,6 @@ class course_competency extends persistent {
                  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();
index e500f5a..e926ffd 100644 (file)
@@ -431,6 +431,12 @@ class external extends external_api {
             VALUE_DEFAULT,
             'children'
         );
+        $onlyvisible = new external_value(
+            PARAM_BOOL,
+            'Only visible frameworks will be returned if visible true',
+            VALUE_DEFAULT,
+            false
+        );
 
         $params = array(
             'sort' => $sort,
@@ -438,7 +444,8 @@ class external extends external_api {
             'skip' => $skip,
             'limit' => $limit,
             'context' => self::get_context_parameters(),
-            'includes' => $includes
+            'includes' => $includes,
+            'onlyvisible' => $onlyvisible
         );
         return new external_function_parameters($params);
     }
@@ -453,12 +460,13 @@ class external extends external_api {
      * @param int $limit
      * @param array $context
      * @param bool $includes
+     * @param bool $onlyvisible
      *
      * @return array
      * @throws \required_capability_exception
      * @throws invalid_parameter_exception
      */
-    public static function list_competency_frameworks($sort, $order, $skip, $limit, $context, $includes) {
+    public static function list_competency_frameworks($sort, $order, $skip, $limit, $context, $includes, $onlyvisible) {
         global $PAGE;
 
         $params = self::validate_parameters(self::list_competency_frameworks_parameters(),
@@ -468,7 +476,8 @@ class external extends external_api {
                                                 'skip' => $skip,
                                                 'limit' => $limit,
                                                 'context' => $context,
-                                                'includes' => $includes
+                                                'includes' => $includes,
+                                                'onlyvisible' => $onlyvisible
                                             ));
 
         $context = self::get_context_from_params($params['context']);
@@ -484,7 +493,8 @@ class external extends external_api {
                                        $params['skip'],
                                        $params['limit'],
                                        $context,
-                                       $params['includes']);
+                                       $params['includes'],
+                                       $params['onlyvisible']);
         $records = array();
         foreach ($results as $result) {
             $exporter = new competency_framework_exporter($result);
@@ -827,7 +837,7 @@ class external extends external_api {
 
         $safefilters = array();
         $validcolumns = array('id', 'shortname', 'description', 'sortorder',
-                              'idnumber', 'visible', 'parentid', 'competencyframeworkid');
+                              'idnumber', 'parentid', 'competencyframeworkid');
         foreach ($params['filters'] as $filter) {
             if (!in_array($filter->column, $validcolumns)) {
                 throw new invalid_parameter_exception('Filter column was invalid');
@@ -962,7 +972,7 @@ class external extends external_api {
 
         $safefilters = array();
         $validcolumns = array('id', 'shortname', 'description', 'sortorder', 'idnumber',
-                              'visible', 'parentid', 'competencyframeworkid');
+                              'parentid', 'competencyframeworkid');
         foreach ($params['filters'] as $filter) {
             if (!in_array($filter['column'], $validcolumns)) {
                 throw new invalid_parameter_exception('Filter column was invalid');
@@ -2033,6 +2043,12 @@ class external extends external_api {
             VALUE_DEFAULT,
             'children'
         );
+        $onlyvisible = new external_value(
+            PARAM_BOOL,
+            'If should list only visible templates',
+            VALUE_DEFAULT,
+            false
+        );
 
         $params = array(
             'sort' => $sort,
@@ -2040,7 +2056,8 @@ class external extends external_api {
             'skip' => $skip,
             'limit' => $limit,
             'context' => self::get_context_parameters(),
-            'includes' => $includes
+            'includes' => $includes,
+            'onlyvisible' => $onlyvisible
         );
         return new external_function_parameters($params);
     }
@@ -2054,10 +2071,11 @@ class external extends external_api {
      * @param int $limit Number of rows to return.
      * @param array $context
      * @param bool $includes
+     * @param bool $onlyvisible
      *
      * @return array
      */
-    public static function list_templates($sort, $order, $skip, $limit, $context, $includes) {
+    public static function list_templates($sort, $order, $skip, $limit, $context, $includes, $onlyvisible) {
         global $PAGE;
 
         $params = self::validate_parameters(self::list_templates_parameters(),
@@ -2067,7 +2085,8 @@ class external extends external_api {
                                                 'skip' => $skip,
                                                 'limit' => $limit,
                                                 'context' => $context,
-                                                'includes' => $includes
+                                                'includes' => $includes,
+                                                'onlyvisible' => $onlyvisible
                                             ));
 
         $context = self::get_context_from_params($params['context']);
@@ -2083,7 +2102,8 @@ class external extends external_api {
                                        $params['skip'],
                                        $params['limit'],
                                        $context,
-                                       $params['includes']);
+                                       $params['includes'],
+                                       $params['onlyvisible']);
         $records = array();
         foreach ($results as $result) {
             $exporter = new template_exporter($result);
index 7ac3071..9b42fed 100644 (file)
@@ -99,11 +99,6 @@ class competency extends persistent {
             $mform->setConstant('scaleid', $competency->get_scaleid());
         }
 
-        $mform->addElement('selectyesno', 'visible',
-                           get_string('visible', 'tool_lp'));
-        $mform->setDefault('visible', true);
-        $mform->addHelpButton('visible', 'visible', 'tool_lp');
-
         $this->add_action_buttons(true, get_string('savechanges', 'tool_lp'));
     }
 
index 88502db..3d24849 100644 (file)
@@ -121,10 +121,9 @@ class template_competency extends persistent {
      * Count the competencies in a template.
      *
      * @param int $templateid The template id
-     * @param bool $onlyvisible If true, only count visible competencies in this template.
      * @return int
      */
-    public static function count_competencies($templateid, $onlyvisible) {
+    public static function count_competencies($templateid) {
         global $DB;
 
         $sql = 'SELECT COUNT(comp.id)
@@ -134,11 +133,6 @@ class template_competency extends persistent {
                  WHERE tplcomp.templateid = ? ';
         $params = array($templateid);
 
-        if ($onlyvisible) {
-            $sql .= ' AND comp.visible = ?';
-            $params[] = 1;
-        }
-
         $results = $DB->count_records_sql($sql, $params);
 
         return $results;
@@ -148,10 +142,9 @@ class template_competency extends persistent {
      * List the competencies in this template.
      *
      * @param int $templateid The template id
-     * @param bool $onlyvisible If true, only count visible competencies in this template.
      * @return array[competency]
      */
-    public static function list_competencies($templateid, $onlyvisible) {
+    public static function list_competencies($templateid) {
         global $DB;
 
         $sql = 'SELECT comp.*
@@ -161,11 +154,6 @@ class template_competency extends persistent {
                  WHERE tplcomp.templateid = ?';
         $params = array($templateid);
 
-        if ($onlyvisible) {
-            $sql .= ' AND comp.visible = ?';
-            $params[] = 1;
-        }
-
         $sql .= 'ORDER BY tplcomp.sortorder ASC';
 
         $results = $DB->get_records_sql($sql, $params);
index 3bee0f7..2bd12e8 100755 (executable)
@@ -13,7 +13,6 @@
         <FIELD NAME="idnumber" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false"/>
         <FIELD NAME="competencyframeworkid" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="The framework this competency relates to."/>
         <FIELD NAME="parentid" TYPE="int" LENGTH="10" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="The parent competency."/>
-        <FIELD NAME="visible" TYPE="int" LENGTH="2" NOTNULL="true" DEFAULT="0" SEQUENCE="false" COMMENT="Used to hide the competency."/>
         <FIELD NAME="path" TYPE="char" LENGTH="255" NOTNULL="true" SEQUENCE="false" COMMENT="Used to speed up queries that use an entire branch of the tree. Looks like /5/34/54."/>
         <FIELD NAME="sortorder" TYPE="int" LENGTH="10" NOTNULL="true" SEQUENCE="false" COMMENT="Relative sort order within the branch"/>
         <FIELD NAME="ruletype" TYPE="char" LENGTH="100" NOTNULL="false" SEQUENCE="false"/>
index b6ae261..ba0fcbb 100644 (file)
@@ -636,5 +636,20 @@ function xmldb_tool_lp_upgrade($oldversion) {
         upgrade_plugin_savepoint(true, 2015111029, 'tool', 'lp');
     }
 
+    if ($oldversion < 2015111030) {
+
+        // Define field visible to be removed from tool_lp_competency.
+        $table = new xmldb_table('tool_lp_competency');
+        $field = new xmldb_field('visible');
+
+        // Conditionally launch drop field visible.
+        if ($dbman->field_exists($table, $field)) {
+            $dbman->drop_field($table, $field);
+        }
+
+        // Lp savepoint reached.
+        upgrade_plugin_savepoint(true, 2015111030, 'tool', 'lp');
+    }
+
     return true;
 }
index 7103796..03869f8 100644 (file)
@@ -250,9 +250,11 @@ $string['taxonomy_selected_value'] = 'Selected value';
 $string['taxonomy_skill'] = 'Skill';
 $string['taxonomy_value'] = 'Value';
 $string['template'] = 'Template';
+$string['templatecohortpagemessage'] = 'Cohorts will not be synchronized while this template is hidden';
 $string['templatecompetencies'] = 'Template competencies';
 $string['templatecreated'] = 'Learning plan template created';
 $string['templatename'] = 'Name';
+$string['templateplanspagemessage'] = 'New user plans can not be created while this template is hidden';
 $string['templates'] = 'Learning plan templates';
 $string['templateupdated'] = 'Learning plan template updated';
 $string['totalrequiredtocomplete'] = 'Total required to complete';
index 17b2866..46bc825 100644 (file)
@@ -55,8 +55,10 @@ if (($data = $form->get_data()) && !empty($data->cohorts)) {
         // Create the template/cohort relationship.
         $relation = \tool_lp\api::create_template_cohort($template, $cohortid);
 
-        // Create a plan for each member.
-        $i += \tool_lp\api::create_plans_from_template_cohort($template, $cohortid);
+        // Create a plan for each member if template visible.
+        if ($template->get_visible()) {
+            $i += \tool_lp\api::create_plans_from_template_cohort($template, $cohortid);
+        }
     }
     if ($i == 0) {
         $notification = get_string('noplanswerecreated', 'tool_lp');
@@ -73,7 +75,11 @@ $output = $PAGE->get_renderer('tool_lp');
 echo $output->header();
 echo $output->heading($title);
 echo $output->heading($subtitle, 3);
-$form->display();
+if ($template->get_visible() == false) {
+    // Display message to prevent that cohort will not be synchronzed if the template is hidden.
+    echo $output->notify_message(get_string('templatecohortpagemessage', 'tool_lp'));
+}
+echo $form->display();
 $page = new \tool_lp\output\template_cohorts_page($template, $url);
 echo $output->render($page);
 echo $output->footer();
index 6ba059e..07f6779 100644 (file)
@@ -65,7 +65,13 @@ $output = $PAGE->get_renderer('tool_lp');
 echo $output->header();
 echo $output->heading($title);
 echo $output->heading($subtitle, 3);
-echo $form->display();
+// Do not display form when the template is hidden.
+if ($template->get_visible()) {
+    echo $form->display();
+} else {
+    // Display message that plan can not be created if the template is hidden.
+    echo $output->notify_message(get_string('templateplanspagemessage', 'tool_lp'));
+}
 $page = new \tool_lp\output\template_plans_page($template, $url);
 echo $output->render($page);
 echo $output->footer();
index 5877010..9636353 100644 (file)
@@ -24,7 +24,7 @@
 
     Context variables required for this template:
     * framework -
-    * competencies - array of objects containing id, shortname, idnumber, sortorder, visible, parentid, competencyframeworkid, path
+    * competencies - array of objects containing id, shortname, idnumber, sortorder, parentid, competencyframeworkid, path
 }}
 <div data-region="competencymovetree" >
 <label>{{#str}}selectcompetencymovetarget, tool_lp{{/str}}</label>
index 903a6fc..1a9c4a8 100644 (file)
@@ -1,5 +1,5 @@
 <li data-id="{{id}}">
-    <span {{^visible}}class="disabled"{{/visible}} draggable="true">
+    <span draggable="true">
         {{shortname}}
     </span>
     {{#haschildren}}
index 9fcd348..429d0f2 100644 (file)
@@ -6,10 +6,6 @@
 <p>{{framework.description}}</p>
 {{/framework}}
 
-{{^competency.visible}}
-( {{#str}} hidden, tool_lp{{/str}})
-{{/competency.visible}}
-
 {{#showrelatedcompetencies}}
     {{> tool_lp/related_competencies }}
 {{/showrelatedcompetencies}}
index 21a2152..fb1e510 100644 (file)
@@ -27,7 +27,7 @@
 
     Context variables required for this template:
     * framework -
-    * competencies - array of objects containing id, shortname, idnumber, sortorder, visible, parentid, competencyframeworkid, path
+    * competencies - array of objects containing id, shortname, idnumber, sortorder, parentid, competencyframeworkid, path
     * canmanage - true if this user has permission to manage the competencies
 }}
 <div data-region="managecompetencies">
index 693bce2..5095fc9 100644 (file)
@@ -4,20 +4,18 @@
 </p>
 {{#relatedcompetencies}}
     <ul>
-        {{#visible}}
-            <li>
-                {{#showdeleterelatedaction}}
-                    <div class="pull-right">
-                        <a href="#" data-action="deleterelation" id="id-related-{{id}}">{{#pix}}t/delete, core, {{#str}}delete{{/str}}{{/pix}}</a>
-                    </div>
-                {{/showdeleterelatedaction}}
-                <p>
-                    <a href="#" data-action="competency-dialogue" data-id="{{id}}">
-                        {{shortname}}{{#idnumber}} {{idnumber}}{{/idnumber}}
-                    </a>
-                </p>
-            </li>
-        {{/visible}}
+        <li>
+            {{#showdeleterelatedaction}}
+                <div class="pull-right">
+                    <a href="#" data-action="deleterelation" id="id-related-{{id}}">{{#pix}}t/delete, core, {{#str}}delete{{/str}}{{/pix}}</a>
+                </div>
+            {{/showdeleterelatedaction}}
+            <p>
+                <a href="#" data-action="competency-dialogue" data-id="{{id}}">
+                    {{shortname}}{{#idnumber}} {{idnumber}}{{/idnumber}}
+                </a>
+            </p>
+        </li>
     </ul>
 {{/relatedcompetencies}}
 {{^relatedcompetencies}}
index 12128ab..1321996 100644 (file)
@@ -1620,4 +1620,82 @@ class tool_lp_api_testcase extends advanced_testcase {
         }
     }
 
+    /**
+     * Test when adding competency that belong to hidden framework to plan/template/course.
+     */
+    public function test_hidden_framework() {
+        $this->resetAfterTest(true);
+        $this->setAdminUser();
+        $dg = $this->getDataGenerator();
+        $lpg = $this->getDataGenerator()->get_plugin_generator('tool_lp');
+        $user = $dg->create_user();
+
+        // Create a course.
+        $cat1 = $dg->create_category();
+        $course = $dg->create_course(array('category' => $cat1->id));
+        // Create a template.
+        $template = $lpg->create_template();
+        // Create a plan.
+        $plan = $lpg->create_plan(array('userid' => $user->id));
+
+        // Create a hidden framework.
+        $frm = array(
+            'visible' => false
+        );
+        $framework = $lpg->create_framework($frm);
+        $competency = $lpg->create_competency(array('competencyframeworkid' => $framework->get_id()));
+
+        // Linking competency that belong to hidden framework to course.
+        try {
+            api::add_competency_to_course($course->id, $competency->get_id());
+            $this->fail('A competency belonging to hidden framework can not be linked to course');
+        } catch (coding_exception $e) {
+            $this->assertTrue(true);
+        }
+
+        // Adding competency that belong to hidden framework to template.
+        try {
+            api::add_competency_to_template($template->get_id(), $competency->get_id());
+            $this->fail('A competency belonging to hidden framework can not be added to template');
+        } catch (coding_exception $e) {
+            $this->assertTrue(true);
+        }
+
+        // Adding competency that belong to hidden framework to plan.
+        try {
+            api::add_competency_to_plan($plan->get_id(), $competency->get_id());
+            $this->fail('A competency belonging to hidden framework can not be added to plan');
+        } catch (coding_exception $e) {
+            $this->assertTrue(true);
+        }
+    }
+
+    /**
+     * Test when using hidden template in plan/cohort.
+     */
+    public function test_hidden_template() {
+        $this->resetAfterTest(true);
+        $this->setAdminUser();
+        $dg = $this->getDataGenerator();
+        $lpg = $this->getDataGenerator()->get_plugin_generator('tool_lp');
+        $user = $dg->create_user();
+
+        // Create a cohort.
+        $cohort = $dg->create_cohort();
+        // Create a hidden template.
+        $template = $lpg->create_template(array('visible' => false));
+
+        // Can not link hidden template to plan.
+        try {
+            api::create_plan_from_template($template->get_id(), $user->id);
+            $this->fail('Can not link a hidden template to plan');
+        } catch (coding_exception $e) {
+            $this->assertTrue(true);
+        }
+
+        // Can associate hidden template to cohort.
+        $templatecohort = api::create_template_cohort($template->get_id(), $cohort->id);
+        $this->assertInstanceOf('\tool_lp\template_cohort', $templatecohort);
+    }
+
 }
index 8ef4900..ed18153 100644 (file)
@@ -242,7 +242,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
             'idnumber' => 'idnumber' . $number,
             'description' => 'description' . $number,
             'descriptionformat' => FORMAT_HTML,
-            'visible' => true,
             'competencyframeworkid' => $frameworkid,
             'sortorder' => 0
         );
@@ -257,7 +256,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
             'idnumber' => 'idnumber' . $number,
             'description' => 'description' . $number,
             'descriptionformat' => FORMAT_HTML,
-            'visible' => true,
             'sortorder' => 0
         );
         $result = external::update_competency($competency);
@@ -608,7 +606,7 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals($result, 3);
 
         $result = external::list_competency_frameworks('shortname', 'ASC', 0, 10,
-            array('contextid' => context_system::instance()->id), 'self');
+            array('contextid' => context_system::instance()->id), 'self', false);
         $result = external_api::clean_returnvalue(external::list_competency_frameworks_returns(), $result);
 
         $this->assertEquals(count($result), 3);
@@ -642,7 +640,7 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals($result, 3);
 
         $result = external::list_competency_frameworks('shortname', 'ASC', 0, 10,
-            array('contextid' => context_system::instance()->id), 'self');
+            array('contextid' => context_system::instance()->id), 'self', false);
         $result = external_api::clean_returnvalue(external::list_competency_frameworks_returns(), $result);
 
         $this->assertEquals(count($result), 3);
@@ -685,7 +683,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('idnumber1', $competency->idnumber);
         $this->assertEquals('description1', $competency->description);
         $this->assertEquals(FORMAT_HTML, $competency->descriptionformat);
-        $this->assertEquals(true, $competency->visible);
         $this->assertEquals(0, $competency->parentid);
         $this->assertEquals($framework->id, $competency->competencyframeworkid);
     }
@@ -711,7 +708,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('idnumber1', $competency->idnumber);
         $this->assertEquals('description1', $competency->description);
         $this->assertEquals(FORMAT_HTML, $competency->descriptionformat);
-        $this->assertEquals(true, $competency->visible);
         $this->assertEquals(0, $competency->parentid);
         $this->assertEquals($incat->id, $competency->competencyframeworkid);
 
@@ -734,7 +730,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
             'idnumber' => 'id;"number',
             'description' => 'de<>\\..scription',
             'descriptionformat' => FORMAT_HTML,
-            'visible' => true,
             'competencyframeworkid' => $framework->id,
             'sortorder' => 0
         );
@@ -761,7 +756,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('idnumber1', $result->idnumber);
         $this->assertEquals('description1', $result->description);
         $this->assertEquals(FORMAT_HTML, $result->descriptionformat);
-        $this->assertEquals(true, $result->visible);
         $this->assertEquals(0, $result->parentid);
         $this->assertEquals($framework->id, $result->competencyframeworkid);
     }
@@ -790,7 +784,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('idnumber2', $result->idnumber);
         $this->assertEquals('description2', $result->description);
         $this->assertEquals(FORMAT_HTML, $result->descriptionformat);
-        $this->assertEquals(true, $result->visible);
         $this->assertEquals(0, $result->parentid);
         $this->assertEquals($catframework->id, $result->competencyframeworkid);
 
@@ -822,7 +815,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('idnumber1', $result->idnumber);
         $this->assertEquals('description1', $result->description);
         $this->assertEquals(FORMAT_HTML, $result->descriptionformat);
-        $this->assertEquals(true, $result->visible);
         $this->assertEquals(0, $result->parentid);
         $this->assertEquals($framework->id, $result->competencyframeworkid);
     }
@@ -850,7 +842,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('idnumber2', $result->idnumber);
         $this->assertEquals('description2', $result->description);
         $this->assertEquals(FORMAT_HTML, $result->descriptionformat);
-        $this->assertEquals(true, $result->visible);
         $this->assertEquals(0, $result->parentid);
         $this->assertEquals($catframework->id, $result->competencyframeworkid);
 
@@ -1021,7 +1012,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('shortname1', $result->shortname);
         $this->assertEquals('idnumber1', $result->idnumber);
         $this->assertEquals('description1', $result->description);
-        $this->assertEquals(true, $result->visible);
     }
 
     /**
@@ -1053,7 +1043,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('shortname1', $result->shortname);
         $this->assertEquals('idnumber1', $result->idnumber);
         $this->assertEquals('description1', $result->description);
-        $this->assertEquals(true, $result->visible);
     }
 
     /**
@@ -1080,7 +1069,6 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         $this->assertEquals('shortname1', $result->shortname);
         $this->assertEquals('idnumber1', $result->idnumber);
         $this->assertEquals('description1', $result->description);
-        $this->assertEquals(true, $result->visible);
     }
 
     /**
@@ -1919,7 +1907,7 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         assign_capability('tool/lp:templateread', CAP_PROHIBIT, $this->userrole, $syscontextid, true);
         accesslib_clear_all_caches_for_unit_testing();
         try {
-            external::list_templates('id', 'ASC', 0, 10, array('contextid' => $syscontextid), 'children');
+            external::list_templates('id', 'ASC', 0, 10, array('contextid' => $syscontextid), 'children', false);
             $this->fail('Invalid permissions');
         } catch (required_capability_exception $e) {
         }
@@ -1928,7 +1916,7 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         assign_capability('tool/lp:templateread', CAP_PREVENT, $this->userrole, $syscontextid, true);
         assign_capability('tool/lp:templateread', CAP_ALLOW, $this->userrole, $catcontextid, true);
         accesslib_clear_all_caches_for_unit_testing();
-        $result = external::list_templates('id', 'ASC', 0, 10, array('contextid' => $syscontextid), 'children');
+        $result = external::list_templates('id', 'ASC', 0, 10, array('contextid' => $syscontextid), 'children', false);
         $result = external_api::clean_returnvalue(external::list_templates_returns(), $result);
         $this->assertCount(2, $result);
         $this->assertEquals($cat1->id, $result[0]['id']);
@@ -1937,7 +1925,7 @@ class tool_lp_external_testcase extends externallib_advanced_testcase {
         // User with system permissions.
         assign_capability('tool/lp:templateread', CAP_ALLOW, $this->userrole, $syscontextid, true);
         accesslib_clear_all_caches_for_unit_testing();
-        $result = external::list_templates('id', 'DESC', 0, 3, array('contextid' => $catcontextid), 'parents');
+        $result = external::list_templates('id', 'DESC', 0, 3, array('contextid' => $catcontextid), 'parents', false);
         $result = external_api::clean_returnvalue(external::list_templates_returns(), $result);
         $this->assertCount(3, $result);
         $this->assertEquals($cat2->id, $result[0]['id']);
index f9d0c9b..ada9319 100644 (file)
@@ -103,9 +103,6 @@ class tool_lp_generator extends component_generator_base {
         if (!isset($record->descriptionformat)) {
             $record->descriptionformat = FORMAT_HTML;
         }
-        if (!isset($record->visible)) {
-            $record->visible = 1;
-        }
         if (isset($record->scaleconfiguration)
                 && (is_array($record->scaleconfiguration) || is_object($record->scaleconfiguration))) {
             // Conveniently encode the config.
index de7005d..37f4bd7 100644 (file)
@@ -65,11 +65,6 @@ class tool_lp_persistent_testcase extends advanced_testcase {
                 'default' => 0,
                 'null' => NULL_NOT_ALLOWED
             ),
-            'visible' => array(
-                'type' => PARAM_BOOL,
-                'default' => true,
-                'null' => NULL_NOT_ALLOWED
-            ),
             'path' => array(
                 'type' => PARAM_RAW,
                 'default' => '',
@@ -142,7 +137,6 @@ class tool_lp_persistent_testcase extends advanced_testcase {
             'description' => '',
             'descriptionformat' => FORMAT_HTML,
             'parentid' => 0,
-            'visible' => true,
             'path' => '',
             'sortorder' => null,
             'competencyframeworkid' => null,
@@ -167,7 +161,6 @@ class tool_lp_persistent_testcase extends advanced_testcase {
             'description' => 'xyz',
             'descriptionformat' => FORMAT_PLAIN,
             'parentid' => 999,
-            'visible' => false,
             'path' => '/a/b/c',
             'sortorder' => 12,
             'competencyframeworkid' => 5,
@@ -270,15 +263,11 @@ class tool_lp_persistent_testcase extends advanced_testcase {
     public function test_validation_type() {
         $data = (object) array(
             'idnumber' => 'abc',
-            'sortorder' => 0,
-            'visible' => 'NaN'
+            'sortorder' => 'NaN'
         );
         $p = new tool_lp_testable_persistent(0, $data);
-        $expected = array(
-            'visible' => new lang_string('invaliddata', 'error'),
-        );
         $this->assertFalse($p->is_valid());
-        $this->assertEquals($expected, $p->get_errors());
+        $this->assertArrayHasKey('sortorder', $p->get_errors());
     }
 
     public function test_validation_null() {
@@ -438,10 +427,6 @@ class tool_lp_testable_persistent extends \tool_lp\persistent {
                 'type' => PARAM_INT,
                 'default' => 0
             ),
-            'visible' => array(
-                'type' => PARAM_BOOL,
-                'default' => 1
-            ),
             'path' => array(
                 'type' => PARAM_RAW,
                 'default' => ''
index dc03b34..d33b1a2 100644 (file)
@@ -25,6 +25,6 @@
 defined('MOODLE_INTERNAL') || die();
 
 
-$plugin->version   = 2015111030; // The current plugin version (Date: YYYYMMDDXX).
+$plugin->version   = 2015111031; // 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).