From 8a28dbd4e1596cb2363dad5d3f852d43c9be191e Mon Sep 17 00:00:00 2001 From: Andrew Robert Nicols Date: Tue, 6 Mar 2012 14:06:04 +0000 Subject: [PATCH] MDL-31914 Ensure that completion criteria are deleted when removing a course module --- course/lib.php | 2 ++ lib/db/upgrade.php | 21 ++++++++++++++++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/course/lib.php b/course/lib.php index 5d168df1ead..71982bcbb49 100644 --- a/course/lib.php +++ b/course/lib.php @@ -2856,6 +2856,8 @@ function delete_course_module($id) { // very quick on an empty table) $DB->delete_records('course_modules_completion', array('coursemoduleid' => $cm->id)); $DB->delete_records('course_modules_availability', array('coursemoduleid'=> $cm->id)); + $DB->delete_records('course_completion_criteria', array('moduleinstance' => $cm->id, + 'criteriatype' => COMPLETION_CRITERIA_TYPE_ACTIVITY)); delete_context(CONTEXT_MODULE, $cm->id); return $DB->delete_records('course_modules', array('id'=>$cm->id)); diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 660e2a7e10d..032f2e627a6 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -7030,6 +7030,25 @@ FROM upgrade_main_savepoint(true, 2011120501.12); } + if ($oldversion < 2011120502.07) { + require_once($CFG->libdir . '/completion/completion_criteria.php'); + // Delete orphaned criteria which were left when modules were removed + if ($DB->get_dbfamily() === 'mysql') { + $sql = "DELETE cc FROM {course_completion_criteria} cc + LEFT JOIN {course_modules} cm ON cm.id = cc.moduleinstance + WHERE cm.id IS NULL AND cc.criteriatype = ".COMPLETION_CRITERIA_TYPE_ACTIVITY; + } else { + $sql = "DELETE FROM {course_completion_criteria} + WHERE NOT EXISTS ( + SELECT 'x' FROM {course_modules} + WHERE {course_modules}.id = {course_completion_criteria}.moduleinstance) + AND cc.criteriatype = ".COMPLETION_CRITERIA_TYPE_ACTIVITY; + } + $DB->execute($sql); + + // Main savepoint reached + upgrade_main_savepoint(true, 2011120502.07); + } + return true; } -