]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-9550 Implement calls of grade_update() function in Lesson
authorskodak <skodak>
Mon, 11 Jun 2007 11:25:24 +0000 (11:25 +0000)
committerskodak <skodak>
Mon, 11 Jun 2007 11:25:24 +0000 (11:25 +0000)
mod/lesson/db/upgrade.php
mod/lesson/essay.php
mod/lesson/index.php
mod/lesson/lib.php
mod/lesson/report.php
mod/lesson/version.php
mod/lesson/view.php

index 85798a6d481aa393d88b3705b3147fa152586302..202c1340892291472ccca96df9a60fa4fe324473 100644 (file)
@@ -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;
 }
 
index 72535e885f9ba8d1ebffbe5ae239b37cada02793..2d0dbbc56b543bc634f9529ae4e84796e8b3869b 100644 (file)
                 } 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');
index eb61157e84bb176ddb94d1305da569974e5b4530..ea05cc7f82ee11f9fa469c456f8cc80a502067f8 100644 (file)
             } 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);
index 9cd26f4d4185658e5ce7fb15a2f63b64a1569cff..781a90b622075a6888913b59691b9f4a03ccc524 100644 (file)
@@ -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
index 18ed7102cd62f2c32b449aa6186457f2fdd571fb..188e65bf01bac487ef059acbf9a80b8784d3afc8 100644 (file)
@@ -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
                 /// 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++;
                 }
             }
index d27a3cb72bffe0460f53852e8778acf02a372009..244c4ec15014cc18cb8d07d324721e8316abec40 100644 (file)
@@ -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)
 
 ?>
index d7723112b64812c5710a0533c34c29cba8a4a93e..c56ab0d86b07a3b61d254e6713dce59e93251d8d 100644 (file)
                 } else {
                     echo get_string("welldone", "lesson");
                 }
-            }   
+            }
+
+            // update central gradebook
+            lesson_update_grades($lesson, $USER->id);
+
         } else { 
             // display for teacher
             echo "<p style=\"text-align:center;\">".get_string("displayofgrade", "lesson")."</p>\n";