From: skodak Date: Fri, 3 Aug 2007 19:25:22 +0000 (+0000) Subject: MDL-10711 adding deleting of grade data when deleting module or course X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=f615fbaba0cdb58c991af6fe17e90a937a7c17b8;p=moodle.git MDL-10711 adding deleting of grade data when deleting module or course --- diff --git a/course/lib.php b/course/lib.php index 7b0ba2fa98..e53aeea90c 100644 --- a/course/lib.php +++ b/course/lib.php @@ -2076,15 +2076,27 @@ function set_coursemodule_visible($id, $visible, $prevstateoverrides=false) { * */ function delete_course_module($id) { + global $CFG; + require_once($CFG->libdir.'/gradelib.php'); + if (!$cm = get_record('course_modules', 'id', $id)) { return true; } $modulename = get_field('modules', 'name', 'id', $cm->module); + //delete events from calendar if ($events = get_records_select('event', "instance = '$cm->instance' AND modulename = '$modulename'")) { foreach($events as $event) { delete_event($event->id); } } + //delete grade items, outcome items and grades attached to modules + if ($grade_items = grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$modulename, + 'iteminstance'=>$cm->instance, 'courseid'=>$cm->course))) { + foreach ($grade_items as $grade_item) { + $grade_item->delete('moddelete'); + } + + } return delete_records('course_modules', 'id', $cm->id); } diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index f636b6046f..52e08292b6 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -1604,6 +1604,8 @@ function xmldb_main_upgrade($oldversion=0) { if ($result && $oldversion < 2007072209) { $tables = array('grade_category', 'grade_item', + 'grade_letter', + 'grade_preferences', 'grade_exceptions'); foreach ($tables as $table) { diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 3c2b877359..2bfad2337c 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -189,25 +189,42 @@ class grade_category extends grade_object { * @return boolean success */ function delete($source=null) { - if ($this->is_course_category()) { - debuggin('Can not delete top course category!'); - return false; - } - - $this->force_regrading(); - $grade_item = $this->load_grade_item(); - $parent = $this->load_parent_category(); - // Update children's categoryid/parent field first - if ($children = grade_item::fetch_all(array('categoryid'=>$this->id))) { - foreach ($children as $child) { - $child->set_parent($parent->id); + if ($this->is_course_category()) { + if ($categories = grade_category::fetch_all(array('courseid'=>$this->courseid))) { + foreach ($categories as $category) { + if ($category->id == $this->id) { + continue; // do not delete course category yet + } + $category->delete($source); + } } - } - if ($children = grade_category::fetch_all(array('parent'=>$this->id))) { - foreach ($children as $child) { - $child->set_parent($parent->id); + + if ($items = grade_item::fetch_all(array('courseid'=>$this->courseid))) { + foreach ($items as $item) { + if ($item->id == $grade_item->id) { + continue; // do not delete course item yet + } + $item->delete($source); + } + } + + } else { + $this->force_regrading(); + + $parent = $this->load_parent_category(); + + // Update children's categoryid/parent field first + if ($children = grade_item::fetch_all(array('categoryid'=>$this->id))) { + foreach ($children as $child) { + $child->set_parent($parent->id); + } + } + if ($children = grade_category::fetch_all(array('parent'=>$this->id))) { + foreach ($children as $child) { + $child->set_parent($parent->id); + } } } @@ -254,7 +271,10 @@ class grade_category extends grade_object { } /** - * TODO document + * Internal function - used only from fetch_course_category() + * Normal insert() can not be used for course category + * @param int $courseid + * @return bool success */ function insert_course_category($courseid) { $this->courseid = $courseid; diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 614e0adb29..f096574adb 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -299,13 +299,10 @@ class grade_item extends grade_object { * @return boolean success */ function delete($source=null) { - if ($this->is_course_item()) { - debuggin('Can not delete course or category item!'); - return false; + if (!$this->is_course_item()) { + $this->force_regrading(); } - $this->force_regrading(); - if ($grades = grade_grade::fetch_all(array('itemid'=>$this->id))) { foreach ($grades as $grade) { $grade->delete($source); diff --git a/lib/gradelib.php b/lib/gradelib.php index 72f6d0d91d..eedccdd282 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -754,6 +754,40 @@ function grade_get_legacy_grade_item($modinstance, $grademax, $scaleid) { return $grade_item; } +/** + * Remove all grade related course data - history is kept + * @param int $courseid + * @showfeedback boolean print feedback + */ +function remove_course_grades($courseid, $showfeedback) { + $strdeleted = get_string('deleted'); + + $course_category = grade_category::fetch_course_category($courseid); + $course_category->delete('coursedelete'); + if ($showfeedback) { + notify($strdeleted.' - '.get_string('grades', 'grades').', '.get_string('items', 'grades').', '.get_string('categories', 'grades')); + } + + if ($outcomes = grade_outcome::fetch_all(array('courseid'=>$courseid))) { + foreach ($outcomes as $outcome) { + $outcome->delete('coursedelete'); + } + } + delete_records('grade_outcomes_courses', 'courseid', $courseid); + if ($showfeedback) { + notify($strdeleted.' - '.get_string('outcomes', 'grades')); + } + + if ($scales = grade_scale::fetch_all(array('courseid'=>$courseid))) { + foreach ($scales as $scale) { + $scale->delete('coursedelete'); + } + } + if ($showfeedback) { + notify($strdeleted.' - '.get_string('scales')); + } + +} /** * Builds an array of percentages indexed by integers for the purpose of building a select drop-down element. diff --git a/lib/moodlelib.php b/lib/moodlelib.php index e800ec7e60..f46956c8d7 100644 --- a/lib/moodlelib.php +++ b/lib/moodlelib.php @@ -2968,6 +2968,7 @@ function set_login_session_preferences() { */ function delete_course($courseid, $showfeedback = true) { global $CFG; + require_once($CFG->libdir.'/gradelib.php'); $result = true; if (!remove_course_contents($courseid, $showfeedback)) { @@ -2977,6 +2978,8 @@ function delete_course($courseid, $showfeedback = true) { $result = false; } + remove_course_grades($courseid, $showfeedback); + if (!delete_records("course", "id", $courseid)) { if ($showfeedback) { notify("An error occurred while deleting the main course record."); @@ -3150,11 +3153,6 @@ function remove_course_contents($courseid, $showfeedback=true) { 'log' => 'course', // Delete logs 'course_sections' => 'course', // Delete any course stuff 'course_modules' => 'course', - 'grade_category' => 'courseid', // Delete gradebook stuff - 'grade_exceptions' => 'courseid', - 'grade_item' => 'courseid', - 'grade_letter' => 'courseid', - 'grade_preferences' => 'courseid', 'backup_courses' => 'courseid', // Delete scheduled backup stuff 'backup_log' => 'courseid' );