From 474bad4698416bf14df79011815c5bf3f5aa59d4 Mon Sep 17 00:00:00 2001 From: nicolasconnault Date: Wed, 11 Jul 2007 16:54:11 +0000 Subject: [PATCH] MDL-9628 Enabling multiple feedback and grades update. Feedbacks now working, but grades don't (at least scales don't) --- grade/report/grader/index.php | 96 +++++++++++++++++++++++------------ lib/grade/grade_item.php | 1 + 2 files changed, 65 insertions(+), 32 deletions(-) diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index 8deebf0cc2576..686a05e98cd40 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -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; } @@ -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); } } diff --git a/lib/grade/grade_item.php b/lib/grade/grade_item.php index 2bc262d3604cd..2c7ba0a667e50 100644 --- a/lib/grade/grade_item.php +++ b/lib/grade/grade_item.php @@ -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;