* @param int $idnumber grade item Primary Key
* @return array An array of grade items
*/
-function grade_get_items($courseid, $itemtype=NULL, $itemmodule=NULL, $iteminstance=NULL, $itemname=NULL, $itemnumber=NULL, $idnumber=NULL) {
+function grade_get_items($courseid, $itemtype=NULL, $itemmodule=NULL, $iteminstance=NULL, $itemnumber=NULL, $itemname=NULL, $idnumber=NULL) {
$grade_item = new grade_item(compact('courseid', 'itemtype', 'itemmodule', 'iteminstance', 'itemname', 'itemnumber', 'idnumber'), false);
$grade_items = $grade_item->fetch_all_using_this();
return $grade_items;
}
/**
- * For backward compatibility with old third-party modules, this function is called
- * via to admin/cron.php to search all mod/xxx/lib.php files for functions named xxx_grades(),
- * if the current modules does not have grade events registered with the grade book.
- * Once the data is extracted, the events_trigger() function can be called to initiate
- * an event as usual and copy/ *upgrade the data in the gradebook tables.
+ * For backwards compatibility with old third-party modules, this function can
+ * be used to import all grades from activities with legacy grading.
*/
function grade_grab_legacy_grades() {
continue;
}
- $fullmod = $CFG->dirroot .'/mod/'. $mod;
+ 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')) {
if (function_exists($gradefunc)) {
// get all instance of the activity
- $sql = "SELECT a.*, cm.idnumber as cmidnumber, a.course as courseid, 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";
+ $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";
if ($modinstances = get_records_sql($sql)) {
foreach ($modinstances as $modinstance) {
- // for each instance, call the xxx_grades() function
- if ($grades = $gradefunc($modinstance->id)) {
-
- $grademax = $grades->maxgrade;
- $scaleid = 0;
- if (!is_numeric($grademax)) {
- // scale name is provided as a string, try to find it
- if (!$scale = get_record('scale', 'name', $grademax)) {
- debugging('Incorrect scale name! name:'.$grademax);
- continue;
- }
- $scaleid = $scale->id;
- }
-
- if (!$grade_item = grade_get_legacy_grade_item($modinstance, $grademax, $scaleid)) {
- debugging('Can not get/create legacy grade item!');
- continue;
- }
-
- foreach ($grades->grades as $userid=>$usergrade) {
- // make the grade_added eventdata
- $eventdata = new object();
- $eventdata->itemid = $grade_item->id;
- $eventdata->userid = $userid;
-
- if ($usergrade == '-') {
- // no grade
- $eventdata->gradevalue = null;
-
- } else if ($scaleid) {
- // scale in use, words used
- $gradescale = explode(",", $scale->scale);
- $eventdata->gradevalue = array_search($usergrade, $gradescale) + 1;
-
- } else {
- // good old numeric value
- $eventdata->gradevalue = $usergrade;
- }
-
- events_trigger('grade_updated', $eventdata);
- }
- }
+ grade_update_mod_grades($modinstance);
}
}
}
}
}
+/**
+ * Force full update of module grades in central gradebook - works for both legacy and converted activities.
+ * @param object $modinstance object with extra cmidnumber and modname property
+ * @return boolean success
+ */
+function grade_update_mod_grades($modinstance) {
+ global $CFG;
+
+ $fullmod = $CFG->dirroot.'/mod/'.$modinstance->modname;
+ if (!file_exists($fullmod.'/lib.php')) {
+ debugging('missing lib.php file in module');
+ return false;
+ }
+ include_once($fullmod.'/lib.php');
+
+ // does it use legacy grading?
+ $gradefunc = $modinstance->modname.'_grades';
+ $updategradesfunc = $modinstance->modname.'_update_grades';
+ $updateitemfunc = $modinstance->modname.'_grade_item_update';
+
+ if (function_exists($gradefunc)) {
+ if ($oldgrades = $gradefunc($modinstance->id)) {
+
+ $grademax = $oldgrades->maxgrade;
+ $scaleid = NULL;
+ if (!is_numeric($grademax)) {
+ // scale name is provided as a string, try to find it
+ if (!$scale = get_record('scale', 'name', $grademax)) {
+ debugging('Incorrect scale name! name:'.$grademax);
+ return false;
+ }
+ $scaleid = $scale->id;
+ }
+
+ if (!$grade_item = grade_get_legacy_grade_item($modinstance, $grademax, $scaleid)) {
+ debugging('Can not get/create legacy grade item!');
+ return false;
+ }
+
+ $grades = array();
+ foreach ($oldgrades->grades as $userid=>$usergrade) {
+ $grade = new object();
+ $grade->userid = $userid;
+
+ if ($usergrade == '-') {
+ // no grade
+ $grade->gradevalue = null;
+
+ } else if ($scaleid) {
+ // scale in use, words used
+ $gradescale = explode(",", $scale->scale);
+ $grade->gradevalue = array_search($usergrade, $gradescale) + 1;
+
+ } else {
+ // good old numeric value
+ $grade->gradevalue = $usergrade;
+ }
+ $grades[] = $grade;
+ }
+
+ grade_update('legacygrab', $grade_item->courseid, $grade_item->itemtype, $grade_item->itemmodule,
+ $grade_item->iteminstance, $grade_item->itemnumber, $grades);
+ }
+
+ } else if (function_exists($updategradesfunc) and function_exists($updateitemfunc)) {
+ //new grading supported, force updating of grades
+ $updateitemfunc($modinstance);
+ $updategradesfunc($modinstance);
+
+ } else {
+ // mudule does not support grading
+ }
+
+ return true;
+}
/**
- * Get (create if needed) grade item for legacy modules.
+ * Get and update/create grade item for legacy modules.
*/
function grade_get_legacy_grade_item($modinstance, $grademax, $scaleid) {
// does it already exist?
- if ($grade_items = grade_get_items($modinstances->courseid, 'mod', $modinstance->modname, $modinstances->id)) {
+ if ($grade_items = grade_get_items($modinstance->course, 'mod', $modinstance->modname, $modinstance->id, 0)) {
if (count($grade_items) > 1) {
+ debugging('Multiple legacy grade_items found.');
return false;
}
$grade_item = reset($grade_items);
- $updated = false;
- if ($scaleid) {
- if ($grade_item->scaleid != $scaleid) {
- $grade_item->gradetype = GRADE_TYPE_SCALE;
- $grade_item->scaleid = $scaleid;
- $updated = true;;
- }
+ if (is_null($grademax) and is_null($scaleid)) {
+ $grade_item->gradetype = GRADE_TYPE_NONE;
- } else if ($grade_item->scaleid != $scaleid or $grade_item->grademax != $grademax) {
- $grade_item->gradetype = GRADE_TYPE_VALUE;
- $grade_item->scaleid = 0;
- $grade_item->grademax = $grademax;
- $grade_item->grademin = 0;
- $updated = true;;
- }
+ } else if ($scaleid) {
+ $grade_item->gradetype = GRADE_TYPE_SCALE;
+ $grade_item->scaleid = $scaleid;
- if ($grade_item->itemname != $modinstance->name) {
- $grade_item->itemname = $modinstance->name;
- $updated = true;;
+ } else {
+ $grade_item->gradetype = GRADE_TYPE_VALUE;
+ $grade_item->grademax = $grademax;
+ $grade_item->grademin = 0;
}
- if ($grade_item->idnumber != $modinstance->cmidnumber) {
- $grade_item->idnumber = $modinstance->cmidnumber;
- $updated = true;;
- }
+ $grade_item->itemname = $modinstance->name;
+ $grade_item->idnumber = $modinstance->cmidnumber;
- if ($updated) {
- $grade_item->update();
- }
+ $grade_item->update();
return $grade_item;
}
// create new one
- $params = array('courseid' =>$modinstance->courseid,
+ $params = array('courseid' =>$modinstance->course,
'itemtype' =>'mod',
'itemmodule' =>$modinstance->modname,
'iteminstance'=>$modinstance->id,
+ 'itemnumber' =>0,
'itemname' =>$modinstance->name,
'idnumber' =>$modinstance->cmidnumber);
- if ($scaleid) {
+ if (is_null($grademax) and is_null($scaleid)) {
+ $params['gradetype'] = GRADE_TYPE_NONE;
+
+ } else if ($scaleid) {
$params['gradetype'] = GRADE_TYPE_SCALE;
$params['scaleid'] = $scaleid;
}
if (!$itemid = grade_create_item($params)) {
+ debugging('Can not create new legacy grade item');
return false;
}