MDL-10711 adding deleting of grade data when deleting module or course

This commit is contained in:
skodak 2007-08-03 19:25:22 +00:00
parent f2c883562d
commit f615fbaba0
6 changed files with 90 additions and 27 deletions

View File

@ -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);
}

View File

@ -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) {

View File

@ -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;

View File

@ -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);

View File

@ -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.

View File

@ -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'
);