MDL-7028 gradebook related changes for course reset; merged from MOODLE_19_STABLE

This commit is contained in:
skodak
2007-11-28 09:43:47 +00:00
parent 2f60b31e90
commit f0362b5db2
2 changed files with 76 additions and 61 deletions
+11 -1
View File
@@ -331,6 +331,16 @@ class grade_item extends grade_object {
* @return boolean success
*/
function delete($source=null) {
$this->delete_all_grades($source);
return parent::delete($source);
}
/**
* Delete all grades
* @param string $source from where was the object deleted (mod/forum, manual, etc.)
* @return boolean success
*/
function delete_all_grades($source=null) {
if (!$this->is_course_item()) {
$this->force_regrading();
}
@@ -341,7 +351,7 @@ class grade_item extends grade_object {
}
}
return parent::delete($source);
return true;
}
/**
+65 -60
View File
@@ -47,7 +47,7 @@ require_once($CFG->libdir . '/grade/grade_outcome.php');
* or key means do not change existing.
*
* Only following grade item properties can be changed 'itemname', 'idnumber', 'gradetype', 'grademax',
* 'grademin', 'scaleid', 'multfactor', 'plusfactor', 'deleted' and 'hidden'.
* 'grademin', 'scaleid', 'multfactor', 'plusfactor', 'deleted' and 'hidden'. 'reset' means delete all current grades including locked ones.
*
* Manual, course or category items can not be updated by this function.
@@ -153,6 +153,12 @@ function grade_update($source, $courseid, $itemtype, $itemmodule, $iteminstance,
}
}
/// reset grades if requested
if (!empty($itemdetails['reset'])) {
$grade_item->delete_all_grades('reset');
return GRADE_UPDATE_OK;
}
/// Some extra checks
// do we use grading?
if ($grade_item->gradetype == GRADE_TYPE_NONE) {
@@ -952,38 +958,20 @@ function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null)
/**
* For backwards compatibility with old third-party modules, this function can
* be used to import all grades from activities with legacy grading.
* @param int $courseid or null if all courses
* @param int $courseid
*/
function grade_grab_legacy_grades($courseid=null) {
function grade_grab_legacy_grades($courseid) {
global $CFG;
if (!$mods = get_list_of_plugins('mod') ) {
error('No modules installed!');
}
if ($courseid) {
$course_sql = " AND cm.course=$courseid";
} else {
$course_sql = "";
}
foreach ($mods as $mod) {
if ($mod == 'NEWMODULE') { // Someone has unzipped the template, ignore it
continue;
}
if (!$module = get_record('modules', 'name', $mod)) {
//not installed
continue;
}
if (!$module->visible) {
//disabled module
continue;
}
$fullmod = $CFG->dirroot.'/mod/'.$mod;
// include the module lib once
@@ -993,59 +981,56 @@ function grade_grab_legacy_grades($courseid=null) {
// if present sync the grades with new grading system
$gradefunc = $mod.'_grades';
if (function_exists($gradefunc)) {
// get all instance of the activity
$sql = "SELECT a.*, cm.idnumber as cmidnumber, m.name as modname
FROM {$CFG->prefix}$mod a, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
WHERE m.name='$mod' AND m.id=cm.module AND cm.instance=a.id $course_sql";
if ($modinstances = get_records_sql($sql)) {
foreach ($modinstances as $modinstance) {
grade_update_mod_grades($modinstance);
}
}
grade_grab_course_grades($courseid, $mod);
}
}
}
}
/**
* For testing purposes mainly, reloads grades from all non legacy modules into gradebook.
* Refetches data from all course activities
* @param int $courseid
* @param string $modname
* @return success
*/
function grade_grab_grades() {
function grade_grab_course_grades($courseid, $modname=null) {
global $CFG;
if ($modname) {
$sql = "SELECT a.*, cm.idnumber as cmidnumber, m.name as modname
FROM {$CFG->prefix}$modname a, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
WHERE m.name='$modname' AND m.visible=1 AND m.id=cm.module AND cm.instance=a.id AND cm.course=$courseid";
if ($modinstances = get_records_sql($sql)) {
foreach ($modinstances as $modinstance) {
grade_update_mod_grades($modinstance);
}
}
return;
}
if (!$mods = get_list_of_plugins('mod') ) {
error('No modules installed!');
}
foreach ($mods as $mod) {
if ($mod == 'NEWMODULE') { // Someone has unzipped the template, ignore it
continue;
}
if (!$module = get_record('modules', 'name', $mod)) {
//not installed
continue;
}
if (!$module->visible) {
//disabled module
continue;
}
$fullmod = $CFG->dirroot.'/mod/'.$mod;
// include the module lib once
if (file_exists($fullmod.'/lib.php')) {
include_once($fullmod.'/lib.php');
// look for modname_grades() function - old gradebook pulling function
// if present sync the grades with new grading system
$gradefunc = $mod.'_update_grades';
if (function_exists($gradefunc)) {
$gradefunc();
// get all instance of the activity
$sql = "SELECT a.*, cm.idnumber as cmidnumber, m.name as modname
FROM {$CFG->prefix}$mod a, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
WHERE m.name='$mod' AND m.visible=1 AND m.id=cm.module AND cm.instance=a.id AND cm.course=$courseid";
if ($modinstances = get_records_sql($sql)) {
foreach ($modinstances as $modinstance) {
grade_update_mod_grades($modinstance);
}
}
}
}
@@ -1301,18 +1286,38 @@ function grade_cron() {
//TODO: do not run this cleanup every cron invocation
// cleanup history tables
if (!empty($CFG->gradehistorylifetime)) { // value in days
$histlifetime = $now - ($CFG->gradehistorylifetime * 3600 * 24);
$tables = array('grade_outcomes_history', 'grade_categories_history', 'grade_items_history', 'grade_grades_history', 'scale_history');
foreach ($tables as $table) {
if (delete_records_select($table, "timemodified < '$histlifetime'")) {
mtrace(" Deleted old grade history records from '$table'");
}
if (!empty($CFG->gradehistorylifetime)) { // value in days
$histlifetime = $now - ($CFG->gradehistorylifetime * 3600 * 24);
$tables = array('grade_outcomes_history', 'grade_categories_history', 'grade_items_history', 'grade_grades_history', 'scale_history');
foreach ($tables as $table) {
if (delete_records_select($table, "timemodified < $histlifetime")) {
mtrace(" Deleted old grade history records from '$table'");
}
}
}
}
/**
* Resel all course grades
* @param int $courseid
* @return success
*/
function grade_course_reset($courseid) {
// no recalculations
grade_force_full_regrading($courseid);
$grade_items = grade_item::fetch_all(array('courseid'=>$courseid));
foreach ($grade_items as $gid=>$grade_item) {
$grade_item->delete_all_grades('reset');
}
//refetch all grades
grade_grab_course_grades($courseid);
// recalculate all grades
grade_regrade_final_grades($courseid);
return true;
}
?>