set_user_preferences(array('grade_report_show' . $toggle_type => $toggle));
}
+//first make sure we have proper final grades - this must be done before constructing of the grade tree
+grade_regrade_final_grades($courseid);
+
// Initialise the grader report object
$report = new grade_report_grader($courseid, $gpr, $context, $page, $sortitemid);
$report->process_action($target, $action);
}
-// first make sure we have all final grades
-// TODO: check that no grade_item has needsupdate set
-grade_regrade_final_grades($courseid);
-
$report->load_users();
$numusers = $report->get_numusers();
$report->load_final_grades();
// Do not show any icons if no grade (no record in DB to match)
// TODO: change edit/hide/etc. links to use itemid and userid to allow creating of new grade objects
- if (!empty($grade->id) && $USER->gradeediting) {
+ if (!$item->needsupdate and !empty($grade->id) and $USER->gradeediting) {
$states = array('is_hidden' => $item->hidden,
'is_locked' => $item->locked,
'is_editable' => $item->gradetype != GRADE_TYPE_NONE && !$grade->locked && !$item->locked);
// if in editting mode, we need to print either a text box
// or a drop down (for scales)
// grades in item of type grade category or course are not directly editable
- if ($USER->gradeediting) {
+ if ($item->needsupdate) {
+ $studentshtml .= '<span class="gradingerror">'.get_string('error').'</span>';
+
+ } else if ($USER->gradeediting) {
// We need to retrieve each grade_grade object from DB in order to
// know if they are hidden/locked
$studentshtml .= '<span onmouseover="' . $overlib . '" onmouseout="return nd();">';
}
- if ($gradedisplaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_LETTER) {
+ if ($item->needsupdate) {
+ $studentshtml .= '<span class="gradingerror">'.get_string('error').'</span>';
+
+ } else if ($gradedisplaytype == GRADE_REPORT_GRADE_DISPLAY_TYPE_LETTER) {
$letters = grade_report::get_grade_letters();
if (!is_null($gradeval)) {
$studentshtml .= grade_grade::get_letter($letters, $gradeval, $grademin, $grademax);
$result = $grade->update_feedback($feedback, $feedbackformat, $usermodified);
}
- if (!$this->needsupdate) {
+ if ($this->is_course_item() and !$this->needsupdate) {
+ if (!grade_regrade_final_grades($this->courseid, $userid, $this)) {
+ $this->force_regrading();
+ }
+
+ } else if (!$this->needsupdate) {
$course_item = grade_item::fetch_course_item($this->courseid);
if (!$course_item->needsupdate) {
if (!grade_regrade_final_grades($this->courseid, $userid, $this)) {
if (!empty($updated_item) and $updated_item->id == $gid) {
$grade_items[$gid]->needsupdate = 1;
- } else if ($grade_items[$gid]->is_category_item() or $grade_items[$gid]->is_calculated()) {
+ } else if ($grade_items[$gid]->is_course_item() or $grade_items[$gid]->is_category_item() or $grade_items[$gid]->is_calculated()) {
$grade_items[$gid]->needsupdate = 1;
}
// construct depends_on lookup array
$depends_on[$gid] = $grade_items[$gid]->depends_on();
}
- $errors = array();
- $finalitems = array();
+ $errors = array();
$finalids = array();
- while (count($grade_items) > 0) {
- $count = 0; // count how many items were updated in this cycle
- foreach ($grade_items as $gid=>$gitem) {
- $grade_item =& $grade_items[$gid];
- if (!$grade_item->needsupdate) {
- $finalitems[$gid] = $grade_item;
- $finalids[] = $gid;
- unset($grade_items[$gid]);
+ $gids = array_keys($grade_items);
+
+ while (count($finalids) < count($gids)) { // work until all grades are final or error found
+ $count = 0;
+ foreach ($gids as $gid) {
+ if (in_array($gid, $finalids)) {
+ continue; // already final
+ }
+
+ if (!$grade_items[$gid]->needsupdate) {
+ $finalids[] = $gid; // we can make it final - does not need update
continue;
}
foreach ($depends_on[$gid] as $did) {
if (!in_array($did, $finalids)) {
$doupdate = false;
- break;
+ continue; // this item depends on something that is not yet in finals array
}
}
//oki - let's update, calculate or aggregate :-)
if ($doupdate) {
- $result = $grade_item->regrade_final_grades($userid);
+ $result = $grade_items[$gid]->regrade_final_grades($userid);
if ($result === true) {
- $grade_item->regrading_finished();
+ $grade_items[$gid]->regrading_finished();
$count++;
- $finalitems[$gid] = $grade_item;
$finalids[] = $gid;
- unset($grade_items[$gid]);
} else {
- $grade_item->force_regrading();
+ $grade_items[$gid]->force_regrading();
$errors[$gid] = $result;
}
}
}
if ($count == 0) {
- foreach($grade_items as $grade_item) {
- $grade_item->force_regrading();
- $errors[$grade_item->id] = 'Probably circular reference or broken calculation formula'; // TODO: localize
+ foreach($gids as $gid) {
+ if (in_array($gid, $finalids)) {
+ continue; // this one is ok
+ }
+ $grade_items[$gid]->force_regrading();
+ $errors[$grade_items[$gid]->id] = 'Probably circular reference or broken calculation formula'; // TODO: localize
}
- break;
+ break; // oki, found error
}
}