}
}
+/**
+ * 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);
+ }
+}
?>
/// 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()) {
$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);
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();
case 'comma':
$separator = ",";
break;
- case 'tab':
+ case 'tab':
default:
$separator = "\t";
}
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()) {
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;
}
/// 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()) {
$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);
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();
/// 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()) {
$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.
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');