diff --git a/admin/tool/lp/classes/api.php b/admin/tool/lp/classes/api.php index 7aef01efb67..e9d8970260a 100644 --- a/admin/tool/lp/classes/api.php +++ b/admin/tool/lp/classes/api.php @@ -1117,6 +1117,7 @@ class api { /** * Delete a learning plan template by id. + * If the learning plan template has associated cohorts they will be deleted. * * Requires tool/lp:templatemanage capability. * @@ -1124,6 +1125,7 @@ class api { * @return boolean */ public static function delete_template($id) { + global $DB; $template = new template($id); // First we do a permissions check. @@ -1131,8 +1133,31 @@ class api { throw new required_capability_exception($template->get_context(), 'tool/lp:templatemanage', 'nopermissions', ''); } + $transaction = $DB->start_delegated_transaction(); + $success = true; + + // Check if there are cohorts associated. + $templatecohorts = template_cohort::get_relations_by_templateid($template->get_id()); + foreach ($templatecohorts as $templatecohort) { + $success = $templatecohort->delete(); + if (!$success) { + break; + } + } + // OK - all set. - return $template->delete(); + if ($success) { + $success = $template->delete(); + } + + if ($success) { + // Commit the transaction. + $transaction->allow_commit(); + } else { + $transaction->rollback(new moodle_exception('Error while deleting the template.')); + } + + return $success; } /** diff --git a/admin/tool/lp/classes/template_cohort.php b/admin/tool/lp/classes/template_cohort.php index 4f4a0b6a769..dd4afe0ca45 100644 --- a/admin/tool/lp/classes/template_cohort.php +++ b/admin/tool/lp/classes/template_cohort.php @@ -149,6 +149,31 @@ class template_cohort extends persistent { return $relation; } + /** + * Get a relations by templateid. + * + * This does not perform any validation on the data passed. If the relation exists in the database + * then it is loaded in a the model, if not then it is up to the developer to save the model. + * + * @param int $templateid + * @return template_cohort[] array of template cohort + */ + public static function get_relations_by_templateid($templateid) { + global $DB; + + $params = array( + 'templateid' => $templateid + ); + + $relations = array(); + $records = $DB->get_records(self::TABLE, $params); + foreach ($records as $record) { + $relations[] = new template_cohort(0, $record); + } + + return $relations; + } + /** * Return an array of templates persistent with their missing userids. * diff --git a/admin/tool/lp/tests/api_test.php b/admin/tool/lp/tests/api_test.php index 21bc400c984..9d0090198fe 100644 --- a/admin/tool/lp/tests/api_test.php +++ b/admin/tool/lp/tests/api_test.php @@ -324,7 +324,7 @@ class tool_lp_api_testcase extends advanced_testcase { $relatedcompetencies = $compduplicated1->get_related_competencies(); $comprelated = current($relatedcompetencies); $this->assertEquals($comprelated->get_idnumber(), $competency2->get_idnumber()); - + // Check if config rule have been ported correctly. $competency4duplicated = competency::get_record(array( 'idnumber' => $competency4->get_idnumber(), @@ -342,8 +342,7 @@ class tool_lp_api_testcase extends advanced_testcase { $competenciesidsrules[] = $value['id']; } $this->assertTrue($competency4duplicated->is_parent_of($competenciesidsrules)); - - + } /** @@ -628,7 +627,6 @@ class tool_lp_api_testcase extends advanced_testcase { $tpl1 = $lpg->create_template(); $tpl2 = $lpg->create_template(); - // Create plans with data not matching templates. $time = time(); $plan1 = $lpg->create_plan(array('templateid' => $tpl1->get_id(), 'userid' => $u1->id, @@ -1660,6 +1658,36 @@ class tool_lp_api_testcase extends advanced_testcase { $this->assertEquals(0, \tool_lp\template_cohort::count_records_select('templateid = :id', array('id' => $t2->get_id()))); } + public function test_delete_template() { + $this->resetAfterTest(true); + $this->setAdminUser(); + + $dg = $this->getDataGenerator(); + $lpg = $this->getDataGenerator()->get_plugin_generator('tool_lp'); + + $c1 = $dg->create_cohort(); + $c2 = $dg->create_cohort(); + $template = $lpg->create_template(); + $id = $template->get_id(); + + // Create 2 template cohorts. + $tc1 = $lpg->create_template_cohort(array('templateid' => $template->get_id(), 'cohortid' => $c1->id)); + $tc1 = $lpg->create_template_cohort(array('templateid' => $template->get_id(), 'cohortid' => $c2->id)); + + // Check pre-test. + $this->assertTrue(tool_lp\template::record_exists($id)); + $this->assertEquals(2, \tool_lp\template_cohort::count_records(array('templateid' => $id))); + + $result = api::delete_template($template->get_id()); + $this->assertTrue($result); + + // Check that the template deos not exist anymore. + $this->assertFalse(tool_lp\template::record_exists($id)); + + // Test if associated cohorts are also deleted. + $this->assertEquals(0, \tool_lp\template_cohort::count_records(array('templateid' => $id))); + } + public function test_delete_template_cohort() { $this->resetAfterTest(true); $this->setAdminUser();