From: skodak Date: Mon, 11 Jun 2007 11:25:24 +0000 (+0000) Subject: MDL-9550 Implement calls of grade_update() function in Lesson X-Git-Url: http://git.mjollnir.org/gw?a=commitdiff_plain;h=92bcca38cd5ab4093c930510b0570d3017d7bd37;p=moodle.git MDL-9550 Implement calls of grade_update() function in Lesson --- diff --git a/mod/lesson/db/upgrade.php b/mod/lesson/db/upgrade.php index 85798a6d48..202c134089 100644 --- a/mod/lesson/db/upgrade.php +++ b/mod/lesson/db/upgrade.php @@ -56,6 +56,14 @@ function xmldb_lesson_upgrade($oldversion=0) { $result = $result && change_field_notnull($table, $field); } + if ($result && $oldversion < 2007061100) { + require_once($CFG->dirroot.'/mod/lesson/lib.php'); + // too much debug output + $db->debug = false; + lesson_update_grades(); + $db->debug = true; + } + return $result; } diff --git a/mod/lesson/essay.php b/mod/lesson/essay.php index 72535e885f..2d0dbbc56b 100644 --- a/mod/lesson/essay.php +++ b/mod/lesson/essay.php @@ -114,6 +114,10 @@ } else { lesson_set_message(get_string('updatefailed', 'lesson')); } + + // update central gradebook + lesson_update_grades($lesson, $grade->userid); + redirect("$CFG->wwwroot/mod/lesson/essay.php?id=$cm->id"); } else { error('Something is wrong with the form data'); diff --git a/mod/lesson/index.php b/mod/lesson/index.php index eb61157e84..ea05cc7f82 100644 --- a/mod/lesson/index.php +++ b/mod/lesson/index.php @@ -87,11 +87,8 @@ } else { // it's a student, show their grade $grade_value = 0; - if ($return = lesson_grades($lesson->id)) { - // grades are stored as percentages - if (isset($return->grades[$USER->id])) { - $grade_value = $return->grades[$USER->id]; - } + if ($return = lesson_get_user_grades($lesson, $USER->id)) { + $grade_value = $return[$USER->id]->gradevalue; } } $table->data[] = array ($lesson->section, $link, $grade_value, $due); diff --git a/mod/lesson/lib.php b/mod/lesson/lib.php index 9cd26f4d41..781a90b622 100644 --- a/mod/lesson/lib.php +++ b/mod/lesson/lib.php @@ -100,6 +100,8 @@ function lesson_add_instance($lesson) { add_event($event); + lesson_grade_item_update(stripslashes_recursive($lesson)); + return $lesson->id; } @@ -193,7 +195,15 @@ function lesson_update_instance($lesson) { add_event($event); - return update_record("lesson", $lesson); + $result = update_record("lesson", $lesson); + + // update grade item definition + lesson_grade_item_update(stripslashes_recursive($lesson)); + + // update grades - TODO: do it only when grading style changes + lesson_update_grades(stripslashes_recursive($lesson), 0, false); + + return $result; } @@ -245,6 +255,8 @@ function lesson_delete_instance($id) { } } + lesson_grade_item_delete($lesson); + return $result; } @@ -385,48 +397,140 @@ function lesson_cron () { return true; } -/*******************************************************************/ -function lesson_grades($lessonid) { -/// Must return an array of grades for a given instance of this module, -/// indexed by user. It also returns a maximum allowed grade. +/** + * Return grade for given user or all users. + * + * @param int $lessonid id of lesson + * @param int $userid optional user id, 0 means all users + * @return array array of grades, false if none + */ +function lesson_get_user_grades($lesson, $userid=0) { global $CFG; - if (!$lesson = get_record("lesson", "id", $lessonid)) { - return NULL; - } + $user = $userid ? "AND u.id = $userid" : ""; + $fuser = $userid ? "AND uu.id = $userid" : ""; + if ($lesson->retake) { if ($lesson->usemaxgrade) { - $grades = get_records_sql_menu("SELECT userid,MAX(grade) FROM {$CFG->prefix}lesson_grades WHERE - lessonid = $lessonid GROUP BY userid"); + $sql = "SELECT u.id, u.id AS userid, MAX(g.grade) AS gradevalue + FROM {$CFG->prefix}user u, {$CFG->prefix}lesson_grades g + WHERE u.id = g.userid AND g.lessonid = $lesson->id + $user + GROUP BY u.id"; } else { - $grades = get_records_sql_menu("SELECT userid,AVG(grade) FROM {$CFG->prefix}lesson_grades WHERE - lessonid = $lessonid GROUP BY userid"); + $sql = "SELECT u.id, u.id AS userid, AVG(g.grade) AS gradevalue + FROM {$CFG->prefix}user u, {$CFG->prefix}lesson_grades g + WHERE u.id = g.userid AND g.lessonid = $lesson->id + $user + GROUP BY u.id"; } + } else { - // Retakes is turned Off; only count first attempt - $firstgrades = get_records_sql("SELECT userid, MIN(completed), grade FROM {$CFG->prefix}lesson_grades WHERE lessonid = $lessonid GROUP BY userid"); - $grades = array(); - if (!empty($firstgrades)) { - foreach($firstgrades as $userid => $info) { - $grades[$userid] = $info->grade; - } - } + // use only first attempts (with lowest id in lesson_grades table) + $firstonly = "SELECT uu.id AS userid, MIN(gg.id) AS firstcompleted + FROM {$CFG->prefix}user uu, {$CFG->prefix}lesson_grades gg + WHERE uu.id = gg.userid AND gg.lessonid = $lesson->id + $fuser + GROUP BY uu.id"; + + $sql = "SELECT u.id, u.id AS userid, g.grade AS gradevalue + FROM {$CFG->prefix}user u, {$CFG->prefix}lesson_grades g, ($firstonly) f + WHERE u.id = g.userid AND g.lessonid = $lesson->id + AND g.id = f.firstcompleted AND g.userid=f.userid + $user"; + } + + return get_records_sql($sql); +} + +/** + * Update grades in central gradebook + * + * @param object $lesson null means all lessons + * @param int $userid specific user only, 0 mean all + */ +function lesson_update_grades($lesson=null, $userid=0, $nullifnone=true) { + global $CFG; + if (!function_exists('grade_update')) { //workaround for buggy PHP versions + require_once($CFG->libdir.'/gradelib.php'); } - // convert grades from percentages and tidy the numbers - if (!$lesson->practice) { // dont display practice lessons - if ($grades) { - foreach ($grades as $userid => $grade) { - $return->grades[$userid] = number_format($grade * $lesson->grade / 100.0, 1); + + if ($lesson != null) { + if ($grades = lesson_get_user_grades($lesson, $userid)) { + grade_update('mod/lesson', $lesson->course, 'mod', 'lesson', $lesson->id, 0, $grades); + + } else if ($userid and $nullifnone) { + $grade = new object(); + $grade->itemid = $lesson->id; + $grade->userid = $userid; + $grade->gradevalue = NULL; + grade_update('mod/lesson', $lesson->course, 'mod', 'lesson', $lesson->id, 0, $grade); + } + + } else { + $sql = "SELECT l.*, cm.idnumber as cmidnumber, l.course as courseid + FROM {$CFG->prefix}lesson l, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m + WHERE m.name='lesson' AND m.id=cm.module AND cm.instance=l.id"; + if ($rs = get_recordset_sql($sql)) { + if ($rs->RecordCount() > 0) { + while ($lesson = rs_fetch_next_record($rs)) { + lesson_grade_item_update($lesson); + if ($lesson->grade != 0) { + lesson_update_grades($lesson, 0, false); + } + } } + rs_close($rs); } - $return->maxgrade = $lesson->grade; + } +} - return $return; +/** + * Create grade item for given lesson + * + * @param object $lesson object with extra cmidnumber + * @return int 0 if ok, error code otherwise + */ +function lesson_grade_item_update($lesson) { + global $CFG; + if (!function_exists('grade_update')) { //workaround for buggy PHP versions + require_once($CFG->libdir.'/gradelib.php'); + } + + if (array_key_exists('cmidnumber', $lesson)) { //it may not be always present + $params = array('itemname'=>$lesson->name, 'idnumber'=>$lesson->cmidnumber); } else { - return NULL; + $params = array('itemname'=>$lesson->name); } + + if ($lesson->grade > 0) { + $params['gradetype'] = GRADE_TYPE_VALUE; + $params['grademax'] = 100; //means 100% + $params['grademin'] = 0; + $params['multfactor'] = $lesson->grade / 100.0; + + } else { + $params['gradetype'] = GRADE_TYPE_NONE; + $params['multfactor'] = 1.0; + } + + return grade_update('mod/lesson', $lesson->course, 'mod', 'lesson', $lesson->id, 0, NULL, $params); +} + +/** + * Delete grade item for given lesson + * + * @param object $lesson object + * @return object lesson + */ +function lesson_grade_item_delete($lesson) { + global $CFG; + require_once($CFG->libdir.'/gradelib.php'); + + return grade_update('mod/lesson', $lesson->course, 'mod', 'lesson', $lesson->id, 0, NULL, array('deleted'=>1)); } + /*******************************************************************/ function lesson_get_participants($lessonid) { //Must return an array of user records (all data) who are participants diff --git a/mod/lesson/report.php b/mod/lesson/report.php index 18ed7102cd..188e65bf01 100644 --- a/mod/lesson/report.php +++ b/mod/lesson/report.php @@ -8,6 +8,7 @@ **/ require_once('../../config.php'); + require_once('lib.php'); require_once('locallib.php'); $id = required_param('id', PARAM_INT); // Course Module ID @@ -71,7 +72,10 @@ /// Remove seen branches and update the retry number delete_records('lesson_branch', 'userid', $userid, 'lessonid', $lesson->id, 'retry', $try); execute_sql("UPDATE {$CFG->prefix}lesson_branch SET retry = retry - 1 WHERE userid = $userid AND lessonid = $lesson->id AND retry > $try", false); - + + /// update central gradebook + lesson_update_grades($lesson, $userid); + $modifier++; } } diff --git a/mod/lesson/version.php b/mod/lesson/version.php index d27a3cb72b..244c4ec150 100644 --- a/mod/lesson/version.php +++ b/mod/lesson/version.php @@ -8,8 +8,8 @@ * @package lesson **/ -$module->version = 2007020201; // The current module version (Date: YYYYMMDDXX) -$module->requires = 2007020200; // Requires this Moodle version +$module->version = 2007061100; // The current module version (Date: YYYYMMDDXX) +$module->requires = 2007060502; // Requires this Moodle version $module->cron = 0; // Period for cron to check this module (secs) ?> diff --git a/mod/lesson/view.php b/mod/lesson/view.php index d7723112b6..c56ab0d86b 100644 --- a/mod/lesson/view.php +++ b/mod/lesson/view.php @@ -911,7 +911,11 @@ } else { echo get_string("welldone", "lesson"); } - } + } + + // update central gradebook + lesson_update_grades($lesson, $USER->id); + } else { // display for teacher echo "

".get_string("displayofgrade", "lesson")."

\n";