From eb8599199e587f3909d0944facd8839728f36c14 Mon Sep 17 00:00:00 2001 From: skodak Date: Tue, 4 Sep 2007 21:56:30 +0000 Subject: [PATCH] MDL-11069 reimplemented grade export flag handling --- grade/export/lib.php | 66 +++++++++++++++++++++++++++ grade/export/ods/grade_export_ods.php | 8 +++- grade/export/txt/grade_export_txt.php | 10 ++-- grade/export/xls/grade_export_xls.php | 8 +++- grade/export/xml/grade_export_xml.php | 32 ++++--------- 5 files changed, 95 insertions(+), 29 deletions(-) diff --git a/grade/export/lib.php b/grade/export/lib.php index 18b61c747a..08c087ddc2 100755 --- a/grade/export/lib.php +++ b/grade/export/lib.php @@ -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); + } +} ?> diff --git a/grade/export/ods/grade_export_ods.php b/grade/export/ods/grade_export_ods.php index 1c3a2261a7..5f254a719e 100755 --- a/grade/export/ods/grade_export_ods.php +++ b/grade/export/ods/grade_export_ods.php @@ -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(); diff --git a/grade/export/txt/grade_export_txt.php b/grade/export/txt/grade_export_txt.php index 789183858b..033c00b135 100755 --- a/grade/export/txt/grade_export_txt.php +++ b/grade/export/txt/grade_export_txt.php @@ -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; } diff --git a/grade/export/xls/grade_export_xls.php b/grade/export/xls/grade_export_xls.php index cfb51b8f0e..f35d16415c 100755 --- a/grade/export/xls/grade_export_xls.php +++ b/grade/export/xls/grade_export_xls.php @@ -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(); diff --git a/grade/export/xml/grade_export_xml.php b/grade/export/xml/grade_export_xml.php index 48fa2bf4f1..4c3fc4caef 100755 --- a/grade/export/xml/grade_export_xml.php +++ b/grade/export/xml/grade_export_xml.php @@ -55,6 +55,9 @@ class grade_export_xml extends grade_export { /// time stamp to ensure uniqueness of batch export fwrite($handle, ''."\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\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$status\n"); } -*/ - fwrite($handle, "\t\t$status\n"); + // only need id number fwrite($handle, "\t\t{$grade_item->idnumber}\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$feedbackstr\n"); } fwrite($handle, "\t\n"); - - // timestamp this if needed -/* if ($export) { - $grade_grade->exported = time(); - // update the time stamp; - $grade_grade->update(); - } -*/ } } fwrite($handle, ""); 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'); -- 2.39.5