From f44557d04578912476d7f27a5b2291afa684c262 Mon Sep 17 00:00:00 2001 From: Damyon Wiese Date: Fri, 29 Mar 2019 09:48:10 +0800 Subject: [PATCH] MDL-63876 badges: Competency deletion Do not delete a competency if it is a criteria for a badge. --- badges/criteria/award_criteria_competency.php | 18 +++++++++++++++++ competency/classes/competency.php | 9 +++++++++ lib/badgeslib.php | 20 +++++++++++++++++++ 3 files changed, 47 insertions(+) diff --git a/badges/criteria/award_criteria_competency.php b/badges/criteria/award_criteria_competency.php index 6a5f5b24584..77a3084e1ed 100644 --- a/badges/criteria/award_criteria_competency.php +++ b/badges/criteria/award_criteria_competency.php @@ -262,4 +262,22 @@ class award_criteria_competency extends award_criteria { public static function is_enabled() { return \core_competency\api::is_enabled(); } + + /** + * Check if any badge has records for competencies. + * + * @param array $competencyids Array of competencies ids. + * @return boolean Return true if competencies were found in any badge. + */ + public static function has_records_for_competencies($competencyids) { + global $DB; + list($insql, $params) = $DB->get_in_or_equal($competencyids, SQL_PARAMS_NAMED); + $sql = "SELECT DISTINCT bc.badgeid + FROM {badge_criteria} bc + JOIN {badge_criteria_param} bcp ON bc.id = bcp.critid + WHERE bc.criteriatype = :criteriatype AND value $insql"; + $params['criteriatype'] = BADGE_CRITERIA_TYPE_COMPETENCY; + + return self::record_exists_sql($sql, $params); + } } diff --git a/competency/classes/competency.php b/competency/classes/competency.php index 9e417e9d014..a6991372910 100644 --- a/competency/classes/competency.php +++ b/competency/classes/competency.php @@ -769,6 +769,8 @@ class competency extends persistent { * @return bool True if we can delete the competencies. */ public static function can_all_be_deleted($ids) { + global $CFG; + if (empty($ids)) { return true; } @@ -792,6 +794,13 @@ class competency extends persistent { if (user_competency_plan::has_records_for_competencies($ids)) { return false; } + + require_once($CFG->libdir . '/badgeslib.php'); + // Check if competency is used in a badge. + if (badge_award_criteria_competency_has_records_for_competencies($ids)) { + return false; + } + return true; } diff --git a/lib/badgeslib.php b/lib/badgeslib.php index 20d25d1d7df..066927c58dd 100644 --- a/lib/badgeslib.php +++ b/lib/badgeslib.php @@ -1591,3 +1591,23 @@ function badges_list_criteria($enabled = true) { } return $types; } + +/** + * Check if any badge has records for competencies. + * + * @param array $competencyids Array of competencies ids. + * @return boolean Return true if competencies were found in any badge. + */ +function badge_award_criteria_competency_has_records_for_competencies($competencyids) { + global $DB; + + list($insql, $params) = $DB->get_in_or_equal($competencyids, SQL_PARAMS_NAMED); + + $sql = "SELECT DISTINCT bc.badgeid + FROM {badge_criteria} bc + JOIN {badge_criteria_param} bcp ON bc.id = bcp.critid + WHERE bc.criteriatype = :criteriatype AND bcp.value $insql"; + $params['criteriatype'] = BADGE_CRITERIA_TYPE_COMPETENCY; + + return $DB->record_exists_sql($sql, $params); +}