]> git.mjollnir.org Git - moodle.git/commitdiff
MDL-11069 reimplemented grade export flag handling
authorskodak <skodak>
Tue, 4 Sep 2007 21:56:30 +0000 (21:56 +0000)
committerskodak <skodak>
Tue, 4 Sep 2007 21:56:30 +0000 (21:56 +0000)
grade/export/lib.php
grade/export/ods/grade_export_ods.php
grade/export/txt/grade_export_txt.php
grade/export/xls/grade_export_xls.php
grade/export/xml/grade_export_xml.php

index 18b61c747ad1902f84b1d61b8523fbe9532b5826..08c087ddc2768e51f32a5ba11a9dd33785bb8422 100755 (executable)
@@ -315,4 +315,70 @@ class grade_export {
     }
 }
 
+/**
+ * This class is used to update the exported field in grade_grades.
+ * It does internal buffering to speedup the db operations.
+ */
+class grade_export_update_buffer {
+    var $update_list;
+    var $export_time;
+
+    /**
+     * Constructor - creates the buffer and initialises the time stamp
+     */
+    function grade_export_update_buffer() {
+        $this->update_list = array();
+        $this->export_time = time();
+    }
+
+    function flush($buffersize) {
+        global $CFG;
+
+        if (count($this->update_list) > $buffersize) {
+            $list = implode(',', $this->update_list);
+            $sql = "UPDATE {$CFG->prefix}grade_grades SET exported = {$this->export_time} WHERE id IN ($list)";
+            execute_sql($sql, false);
+            $this->update_list = array();
+        }
+    }
+
+    /**
+     * Track grade export status
+     * @param object $grade_grade
+     * @return string $status (unknow, new, regrade, nochange)
+     */
+    function track($grade_grade) {
+        if (empty($grade_grade->exported) or empty($grade_grade->timemodified)) {
+            if (is_null($grade_grade->finalgrade)) {
+                // grade does not exist yet
+                $status = 'unknown';
+            } else {
+                $status = 'new';
+                $this->update_list[] = $grade_grade->id;
+            }
+
+        } else if ($grade_grade->exported < $grade_grade->timemodified) {
+            $status = 'regrade';
+            $this->update_list[] = $grade_grade->id;
+
+        } else if ($grade_grade->exported >= $grade_grade->timemodified) {
+            $status = 'nochange';
+
+        } else {
+            // something is wrong?
+            $status = 'unknown';
+        }
+
+        $this->flush(100);
+
+        return $status;
+    }
+
+    /**
+     * Flush and close the buffer.
+     */
+    function close() {
+        $this->flush(0);
+    }
+}
 ?>
index 1c3a2261a7bc465cd2d90bd5b2e91dd909bf6b3f..5f254a719ed365e4f66eef70419096272edfb87b 100755 (executable)
@@ -67,6 +67,7 @@ class grade_export_ods extends grade_export {
 
     /// Print all the lines of data.
         $i = 0;
+        $geub = new grade_export_update_buffer();
         $gui = new graded_users_iterator($this->course, $this->columns, $this->groupid);
         $gui->init();
         while ($userdata = $gui->next_user()) {
@@ -81,6 +82,10 @@ class grade_export_ods extends grade_export {
             $myxls->write_string($i,5,$user->email);
             $j=6;
             foreach ($userdata->grades as $itemid => $grade) {
+                if ($export_tracking) {
+                    $status = $geub->track($grade);
+                }
+
                 $gradestr = $this->format_grade($grade);
                 if (is_numeric($gradestr)) {
                     $myxls->write_number($i,$j++,$gradestr);
@@ -93,11 +98,10 @@ class grade_export_ods extends grade_export {
                 if ($this->export_feedback) {
                     $myxls->write_string($i, $j++, $this->format_feedback($userdata->feedbacks[$itemid]));
                 }
-
-                //TODO: reimplement export handling flag
             }
         }
         $gui->close();
+        $geub->close();
 
     /// Close the workbook
         $workbook->close();
index 789183858b938a71bc74119809a85a22f9ab8089..033c00b1353a2d125d5f03eaa05f0b533736401e 100755 (executable)
@@ -59,7 +59,7 @@ class grade_export_txt extends grade_export {
             case 'comma':
                 $separator = ",";
                 break;
-            case 'tab':   
+            case 'tab':
             default:
                 $separator = "\t";
         }
@@ -91,6 +91,7 @@ class grade_export_txt extends grade_export {
         echo "\n";
 
 /// Print all the lines of data.
+        $geub = new grade_export_update_buffer();
         $gui = new graded_users_iterator($this->course, $this->columns, $this->groupid);
         $gui->init();
         while ($userdata = $gui->next_user()) {
@@ -100,17 +101,20 @@ class grade_export_txt extends grade_export {
             echo $user->firstname.$separator.$user->lastname.$separator.$user->idnumber.$separator.$user->institution.$separator.$user->department.$separator.$user->email;
 
             foreach ($userdata->grades as $itemid => $grade) {
+                if ($export_tracking) {
+                    $status = $geub->track($grade);
+                }
+
                 echo $separator.$this->format_grade($grade);
 
                 if ($this->export_feedback) {
                     echo $separator.$this->format_feedback($userdata->feedbacks[$itemid]);
                 }
-
-                //TODO: reimplement export handling flag
             }
             echo "\n";
         }
         $gui->close();
+        $geub->close();
 
         exit;
     }
index cfb51b8f0e2c9ba7771693ced2193d8f601f416a..f35d16415ca3b1f45350064b9eb0a96d83f9280a 100755 (executable)
@@ -67,6 +67,7 @@ class grade_export_xls extends grade_export {
 
     /// Print all the lines of data.
         $i = 0;
+        $geub = new grade_export_update_buffer();
         $gui = new graded_users_iterator($this->course, $this->columns, $this->groupid);
         $gui->init();
         while ($userdata = $gui->next_user()) {
@@ -81,6 +82,10 @@ class grade_export_xls extends grade_export {
             $myxls->write_string($i,5,$user->email);
             $j=6;
             foreach ($userdata->grades as $itemid => $grade) {
+                if ($export_tracking) {
+                    $status = $geub->track($grade);
+                }
+
                 $gradestr = $this->format_grade($grade);
                 if (is_numeric($gradestr)) {
                     $myxls->write_number($i,$j++,$gradestr);
@@ -93,11 +98,10 @@ class grade_export_xls extends grade_export {
                 if ($this->export_feedback) {
                     $myxls->write_string($i, $j++, $this->format_feedback($userdata->feedbacks[$itemid]));
                 }
-
-                //TODO: reimplement export handling flag
             }
         }
         $gui->close();
+        $geub->close();
 
     /// Close the workbook
         $workbook->close();
index 48fa2bf4f1631387a2a817c442ba665f535fe748..4c3fc4caef732346e86083a94e1325421a3972f7 100755 (executable)
@@ -55,6 +55,9 @@ class grade_export_xml extends grade_export {
         /// time stamp to ensure uniqueness of batch export
         fwrite($handle,  '<results batch="xml_export_'.time().'">'."\n");
 
+        $export_buffer = array();
+
+        $geub = new grade_export_update_buffer();
         $gui = new graded_users_iterator($this->course, $this->columns, $this->groupid);
         $gui->init();
         while ($userdata = $gui->next_user()) {
@@ -67,21 +70,12 @@ class grade_export_xml extends grade_export {
                 $gradestr = $this->format_grade($grade);
 
                 fwrite($handle,  "\t<result>\n");
-                // if exported, check grade_history, if modified after export, set state to regrade
-                $status = 'new';
-/*                if (!empty($grade_grade->exported)) {
-                    //TODO: use timemodified or something else instead
-                    if (record_exists_select('grade_history', 'itemid = '.$gradeitem->id.' AND userid = '.$userid.' AND timemodified > '.$grade_grade->exported)) {
-                        $status = 'regrade';
-                    } else {
-                        $status = 'new';
-                    }
-                } else {
-                    // never exported
-                    $status = 'new';
+
+                if ($export_tracking) {
+                    $status = $geub->track($grade);
+                    fwrite($handle,  "\t\t<state>$status</state>\n");
                 }
-*/
-                fwrite($handle,  "\t\t<state>$status</state>\n");
+
                 // only need id number
                 fwrite($handle,  "\t\t<assignment>{$grade_item->idnumber}</assignment>\n");
                 // this column should be customizable to use either student id, idnumber, uesrname or email.
@@ -92,18 +86,12 @@ class grade_export_xml extends grade_export {
                     fwrite($handle,  "\t\t<feedback>$feedbackstr</feedback>\n");
                 }
                 fwrite($handle,  "\t</result>\n");
-
-                // timestamp this if needed
-/*                if ($export) {
-                    $grade_grade->exported = time();
-                    // update the time stamp;
-                    $grade_grade->update();
-                }
-*/
             }
         }
         fwrite($handle,  "</results>");
         fclose($handle);
+        $gui->close();
+        $geub->close();
 
         @header('Cache-Control: private, must-revalidate, pre-check=0, post-check=0, max-age=0');
         @header('Expires: '. gmdate('D, d M Y H:i:s', 0) .' GMT');