]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-9551 Implemented calls of grade_update() function in Quiz
authorskodak <skodak>
Sun, 10 Jun 2007 22:52:41 +0000 (22:52 +0000)
committerskodak <skodak>
Sun, 10 Jun 2007 22:52:41 +0000 (22:52 +0000)
mod/quiz/db/upgrade.php
mod/quiz/lib.php
mod/quiz/locallib.php
mod/quiz/report/overview/report.php
mod/quiz/version.php

index 2eb3824c205cc7a6e600ada47da5b2447146d659..5e2f04e2f8d571dee27685826a28fc1e972c6797 100644 (file)
@@ -47,6 +47,14 @@ function xmldb_quiz_upgrade($oldversion=0) {
         $result = $result && add_index($table, $index);
     }
 
+    if ($result && $oldversion < 2007061100) {
+        require_once $CFG->dirroot.'/mod/quiz/lib.php';
+        // too much debug output
+        $db->debug = false;
+        quiz_update_grades();
+        $db->debug = true;
+    }
+
     return $result;
 }
 
index cbdf9bf109c710ff5895d1186bb81ed5c64507b7..708e194557dff4954e908d5dca6fcf14af8ceba9 100644 (file)
@@ -164,6 +164,8 @@ function quiz_delete_instance($id) {
         }
     }
 
+    quiz_grade_item_delete($quiz);
+
     return $result;
 }
 
@@ -223,20 +225,113 @@ function quiz_cron () {
     return true;
 }
 
-function quiz_grades($quizid) {
-/// Must return an array of grades, indexed by user, and a max grade.
 
-    $quiz = get_record('quiz', 'id', intval($quizid));
-    if (empty($quiz) || empty($quiz->grade)) {
-        return NULL;
+/**
+ * Return grade for given user or all users.
+ *
+ * @param int $quizid id of quiz
+ * @param int $userid optional user id, 0 means all users
+ * @return array array of grades, false if none
+ */
+function quiz_get_user_grades($quiz, $userid=0) {
+    global $CFG;
+
+    $user = $userid ? "AND u.id = $userid" : "";
+
+    $sql = "SELECT u.id, u.id AS userid, g.grade AS gradevalue
+              FROM {$CFG->prefix}user u, {$CFG->prefix}quiz_grades g
+             WHERE u.id = g.userid AND g.quiz = $quiz->id
+                   $user";
+
+    return get_records_sql($sql);
+}
+
+/**
+ * Update grades in central gradebook
+ *
+ * @param object $quiz null means all quizs
+ * @param int $userid specific user only, 0 mean all
+ */
+function quiz_update_grades($quiz=null, $userid=0, $nullifnone=true) {
+    global $CFG;
+    if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+        require_once($CFG->libdir.'/gradelib.php');
     }
 
-    $return = new stdClass;
-    $return->grades = get_records_menu('quiz_grades', 'quiz', $quiz->id, '', 'userid, grade');
-    $return->maxgrade = get_field('quiz', 'grade', 'id', $quiz->id);
-    return $return;
+    if ($quiz != null) {
+        if ($grades = quiz_get_user_grades($quiz, $userid)) {
+            grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, $grades);
+
+        } else if ($userid and $nullifnone) {
+            $grade = new object();
+            $grade->itemid     = $quiz->id;
+            $grade->userid     = $userid;
+            $grade->gradevalue = NULL;
+            grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, $grade);
+        }
+
+    } else {
+        $sql = "SELECT a.*, cm.idnumber as cmidnumber, a.course as courseid
+                  FROM {$CFG->prefix}quiz a, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
+                 WHERE m.name='quiz' AND m.id=cm.module AND cm.instance=a.id";
+        if ($rs = get_recordset_sql($sql)) {
+            if ($rs->RecordCount() > 0) {
+                while ($quiz = rs_fetch_next_record($rs)) {
+                    quiz_grade_item_update($quiz);
+                    if ($quiz->grade != 0) {
+                        quiz_update_grades($quiz, 0, false);
+                    }
+                }
+            }
+            rs_close($rs);
+        }
+    }
 }
 
+/**
+ * Create grade item for given quiz
+ *
+ * @param object $quiz object with extra cmidnumber
+ * @return int 0 if ok, error code otherwise
+ */
+function quiz_grade_item_update($quiz) {
+    global $CFG;
+    if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+        require_once($CFG->libdir.'/gradelib.php');
+    }
+
+    if (array_key_exists('cmidnumber', $quiz)) { //it may not be always present
+        $params = array('itemname'=>$quiz->name, 'idnumber'=>$quiz->cmidnumber);
+    } else {
+        $params = array('itemname'=>$quiz->name);
+    }
+
+    if ($quiz->grade > 0) {
+        $params['gradetype'] = GRADE_TYPE_VALUE;
+        $params['grademax']  = $quiz->grade;
+        $params['grademin']  = 0;
+
+    } else {
+        $params['gradetype'] = GRADE_TYPE_NONE;
+    }
+
+    return grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, NULL, $params);
+}
+
+/**
+ * Delete grade item for given quiz
+ *
+ * @param object $quiz object
+ * @return object quiz
+ */
+function quiz_grade_item_delete($quiz) {
+    global $CFG;
+    require_once($CFG->libdir.'/gradelib.php');
+
+    return grade_update('mod/quiz', $quiz->course, 'mod', 'quiz', $quiz->id, 0, NULL, array('deleted'=>1));
+}
+
+
 function quiz_get_participants($quizid) {
 /// Returns an array of users who have data in a given quiz
 /// (users with records in quiz_attempts and quiz_question_versions)
@@ -694,6 +789,9 @@ function quiz_after_add_or_update($quiz) {
             add_event($event);
         }
     }
+
+    //update related grade item
+    quiz_grade_item_update($quiz);
 }
 
 function quiz_get_view_actions() {
index be2caf21bb8f70377f7401ddf1a285bd1bd12e93..85ce51df08c264989bd5f39f0f17d6209d425fee 100644 (file)
@@ -386,6 +386,10 @@ function quiz_set_grade($newgrade, &$quiz) {
         ", false);
     }
 
+    // update grade item and send all grades to gradebook
+    quiz_grade_item_update($quiz);
+    quiz_update_grades($quiz);
+
     if ($success) {
         return commit_sql();
     } else {
@@ -436,6 +440,8 @@ function quiz_save_best_grade($quiz, $userid = null) {
             return false;
         }
     }
+
+    quiz_update_grades($quiz, $userid);
     return true;
 }
 
index 2ea1f07642e91df38c05b723ad44542e3925c4fd..d30c3928aca6dd5e64da6293cbee754767e9c60c 100644 (file)
@@ -50,6 +50,7 @@ class quiz_report extends quiz_default_report {
                         } else {
                             quiz_save_best_grade($quiz, $userid);
                         }
+                        quiz_update_grades($quiz, $userid);
                     }
                 }
             break;
index 30f67250df03b429f58622cd918649ece204b61f..8a945eb022fbbe778b2be57d98e22a10b41cac74 100644 (file)
@@ -5,8 +5,8 @@
 //  This fragment is called by moodle_needs_upgrading() and /admin/index.php
 ////////////////////////////////////////////////////////////////////////////////
 
-$module->version  = 2007022800;   // The (date) version of this module
-$module->requires = 2007020200;   // Requires this Moodle version
+$module->version  = 2007061100;   // The (date) version of this module
+$module->requires = 2007060502;   // Requires this Moodle version
 $module->cron     = 0;            // How often should cron check this module (seconds)?
 
 ?>