MDL-11069 reimplemented grade export flag handling

This commit is contained in:
skodak 2007-09-04 21:56:30 +00:00
parent 6db368e117
commit eb8599199e
5 changed files with 95 additions and 29 deletions

View File

@ -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);
}
}
?>

View File

@ -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();

View File

@ -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;
}

View File

@ -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();

View File

@ -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');