Skip to content

Commit

Permalink
MDL-9628 Enabling multiple feedback and grades update. Feedbacks now …
Browse files Browse the repository at this point in the history
…working, but grades don't (at least scales don't)
  • Loading branch information
nicolasconnault committed Jul 11, 2007
1 parent 91a23ef commit 474bad4
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 32 deletions.
96 changes: 64 additions & 32 deletions grade/report/grader/index.php
Expand Up @@ -58,20 +58,28 @@ function grader_report_print_toggle($type, $baseurl, $return=false) {
}


/// processing posted grades here
/// processing posted grades & feedback here

if ($data = data_submitted() and confirm_sesskey()) {

// always initialize all arrays
$queue = array();

foreach ($data as $varname => $postedgrade) {
foreach ($data as $varname => $postedvalue) {
// this is a bit tricky - we have to first load all grades into memory,
// check if changed and only then start updating the final grades because
// columns might depend one on another - the result would be overriden calculated and category grades

// skip, not a grade
if (!strstr($varname, 'grade')) {
$needsupdate = false;
$note = false; // TODO implement note??

// skip, not a grade nor feedback
$data_type = '';
if (strstr($varname, 'grade')) {
$data_type = 'grade';
} elseif (strstr($varname, 'feedback')) {
$data_type = 'feedback';
} else {
continue;
}

Expand All @@ -84,47 +92,71 @@ function grader_report_print_toggle($type, $baseurl, $return=false) {
error('Incorrect grade item id');
}

if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
if ($postedgrade == -1) { // -1 means no grade
$finalgrade = null;
} else {
$finalgrade = (float)$postedgrade;
}
} else {
if ($postedgrade == '') { // empty string means no grade
$finalgrade = null;
// Pre-process grade
if ($data_type == 'grade') {

if ($grade_item->gradetype == GRADE_TYPE_SCALE) {
if ($postedvalue == -1) { // -1 means no grade
$finalgrade = null;
} else {
$finalgrade = (float)$postedvalue;
}
} else {
$finalgrade = format_grade($postedgrade);
if ($postedvalue == '') { // empty string means no grade
$finalgrade = null;
} else {
$finalgrade = format_grade($postedvalue);
}
}
}

if (!is_null($finalgrade) and ($finalgrade < $grade_item->grademin or $finalgrade > $grade_item->grademax)) {
$gradeserror[$grade_item->id][$userid] = 'outofrange'; //TODO: localize
// another possiblity is to use bounded number instead
continue;
if (!is_null($finalgrade) and ($finalgrade < $grade_item->grademin or $finalgrade > $grade_item->grademax)) {
$gradeserror[$grade_item->id][$userid] = 'outofrange'; //TODO: localize
// another possiblity is to use bounded number instead
continue;
}
}

// Get the grade object to compare old value with new value
if ($grade = grade_grades::fetch(array('userid'=>$userid, 'itemid'=>$grade_item->id))) {
if (!is_null($grade->finalgrade)) {
$grade->finalgrade = (float)$grade->finalgrade;
}
if ($grade->finalgrade === $finalgrade) {
// we must not update all grades, only changed ones - we do not want to mark everything as overriden
continue;
if ($data_type == 'feedback') {
$finalgrade = false;
$text = $grade->load_text();
if ($text != s($postedvalue)) {
$feedback = s($postedvalue);
$feedbackformat = GRADER_REPORT_FEEDBACK_FORMAT_TEXT;
$needsupdate = true;
}
} elseif ($data_type == 'grade') {
$feedback = false;
$feedbackformat = false;
if (!is_null($grade->finalgrade)) {
$grade->finalgrade = (float)$grade->finalgrade;
}
if ($grade->finalgrade === $finalgrade) {
$needsupdate = true;
}
}
}

$gradedata = new object();
$gradedata->grade_item = $grade_item;
$gradedata->finalgrade = $finalgrade;
$gradedata->userid = $userid;
}

$queue[] = $gradedata;
// we must not update all grades, only changed ones - we do not want to mark everything as overriden
if ($needsupdate) {
$gradedata = new object();
$gradedata->grade_item = $grade_item;
$gradedata->userid = $userid;
$gradedata->note = $note;
$gradedata->finalgrade = $finalgrade;
$gradedata->feedback = $feedback;
$gradedata->feedbackformat = $feedbackformat;

$queue[] = $gradedata;
}
}

// now we update the new final grade for each changed grade
foreach ($queue as $gradedata) {
$gradedata->grade_item->update_final_grade($gradedata->userid, $gradedata->finalgrade, 'gradebook');
$gradedata->grade_item->update_final_grade($gradedata->userid, $gradedata->finalgrade, 'gradebook',
$gradedata->note, $gradedata->feedback, $gradedata->feedbackformat);
}
}

Expand Down
1 change: 1 addition & 0 deletions lib/grade/grade_item.php
Expand Up @@ -1059,6 +1059,7 @@ function depends_on() {
* @param mixed $feedback teachers feedback as string - false means do not change
* @param int $feedbackformat
* @return boolean success
* TODO Allow for a change of feedback without a change of finalgrade. Currently I get notice about uninitialised $result
*/
function update_final_grade($userid, $finalgrade=false, $source=NULL, $note=NULL, $feedback=false, $feedbackformat=FORMAT_MOODLE, $usermodified=null) {
global $USER;
Expand Down

0 comments on commit 474bad4

Please sign in to comment.