diff --git a/grade/grading/form/lib.php b/grade/grading/form/lib.php index 1e483e34973..92c2c973e6f 100644 --- a/grade/grading/form/lib.php +++ b/grade/grading/form/lib.php @@ -693,13 +693,26 @@ abstract class gradingform_instance { return $this->controller; } + /** + * Returns the specified element from object $this->data + * + * @param string $key + * @return mixed + */ + public function get_data($key) { + if (isset($this->data->$key)) { + return $this->data->$key; + } + return null; + } + /** * Returns instance id * * @return int */ public function get_id() { - return $this->data->id; + return $this->get_data('id'); } /** @@ -708,7 +721,7 @@ abstract class gradingform_instance { * @return int */ public function get_status() { - return $this->data->status; + return $this->get_data('status'); } /** diff --git a/grade/grading/form/rubric/lang/en/gradingform_rubric.php b/grade/grading/form/rubric/lang/en/gradingform_rubric.php index a50423a39b0..1db144cd97e 100644 --- a/grade/grading/form/rubric/lang/en/gradingform_rubric.php +++ b/grade/grading/form/rubric/lang/en/gradingform_rubric.php @@ -82,5 +82,6 @@ $string['regradeoption1'] = 'Mark for regrade'; $string['needregrademessage'] = 'Rubric definition was changed after this student had been graded. You must update the grade otherwise it will not be shown to student.'; $string['rubricnotcompleted'] = 'Please choose something for each criterion'; +$string['restoredfromdraft'] = 'Please note: You did not submit the last attempt to grade this person. The grading is restored from draft. To cancel the changes press "Cancel" button below'; $string['backtoediting'] = 'Back to editing'; \ No newline at end of file diff --git a/grade/grading/form/rubric/lib.php b/grade/grading/form/rubric/lib.php index 512e005af9a..2685be059ec 100644 --- a/grade/grading/form/rubric/lib.php +++ b/grade/grading/form/rubric/lib.php @@ -483,6 +483,36 @@ class gradingform_rubric_controller extends gradingform_controller { $DB->delete_records_list('gradingform_rubric_criteria', 'id', $criteria); } + /** + * If instanceid is specified and grading instance exists and it is created by this rater for + * this item, this instance is returned. + * If there exists a draft for this raterid+itemid, take this draft (this is the change from parent) + * Otherwise new instance is created for the specified rater and itemid + * + * @param int $instanceid + * @param int $raterid + * @param int $itemid + * @return gradingform_instance + */ + public function get_or_create_instance($instanceid, $raterid, $itemid) { + global $DB; + if ($instanceid && + $instance = $DB->get_record('grading_instances', array('id' => $instanceid, 'raterid' => $raterid, 'itemid' => $itemid), '*', IGNORE_MISSING)) { + return $this->get_instance($instance); + } + if ($itemid && $raterid) { + if ($rs = $DB->get_records('grading_instances', array('raterid' => $raterid, 'itemid' => $itemid), 'timemodified DESC', '*', 0, 1)) { + $record = reset($rs); + $currentinstance = $this->get_current_instance($raterid, $itemid); + if ($record->status == gradingform_rubric_instance::INSTANCE_STATUS_INCOMPLETE && $record->timemodified > $currentinstance->get_data('timemodified')) { + $record->isrestored = true; + return $this->get_instance($record); + } + } + } + return $this->create_instance($raterid, $itemid); + } + /** * Returns html code to be included in student's feedback. * @@ -725,6 +755,23 @@ class gradingform_rubric_instance extends gradingform_instance { if ($currentinstance && $currentinstance->get_status() == gradingform_instance::INSTANCE_STATUS_NEEDUPDATE) { $html .= html_writer::tag('div', get_string('needregrademessage', 'gradingform_rubric'), array('class' => 'gradingform_rubric-regrade')); } + $haschanges = false; + if ($currentinstance) { + $curfilling = $currentinstance->get_rubric_filling(); + foreach ($curfilling['criteria'] as $criterionid => $curvalues) { + $value['criteria'][$criterionid]['savedlevelid'] = $curvalues['levelid']; + $newremark = null; + $newlevelid = null; + if (isset($value['criteria'][$criterionid]['remark'])) $newremark = $value['criteria'][$criterionid]['remark']; + if (isset($value['criteria'][$criterionid]['levelid'])) $newlevelid = $value['criteria'][$criterionid]['levelid']; + if ($newlevelid != $curvalues['levelid'] || $newremark != $curvalues['remark']) { + $haschanges = true; + } + } + } + if ($this->get_data('isrestored') && $haschanges) { + $html .= html_writer::tag('div', get_string('restoredfromdraft', 'gradingform_rubric'), array('class' => 'gradingform_rubric-restored')); + } $html .= $this->get_controller()->get_renderer($page)->display_rubric($criteria, $options, $mode, $gradingformelement->getName(), $value); return $html; } diff --git a/grade/grading/form/rubric/renderer.php b/grade/grading/form/rubric/renderer.php index 768749a9068..77b68f699bb 100644 --- a/grade/grading/form/rubric/renderer.php +++ b/grade/grading/form/rubric/renderer.php @@ -355,6 +355,9 @@ class gradingform_rubric_renderer extends plugin_renderer_base { $level['class'] .= ' checked'; //in mode DISPLAY_EVAL the class 'checked' will be added by JS if it is enabled. If JS is not enabled, the 'checked' class will only confuse } + if (isset($criterionvalue['savedlevelid']) && ((int)$criterionvalue['savedlevelid'] === $levelid)) { + $level['class'] .= ' currentchecked'; + } $level['tdwidth'] = 100/count($criterion['levels']); $levels_str .= $this->level_template($mode, $options, $elementname, $id, $level); } diff --git a/grade/grading/form/rubric/styles.css b/grade/grading/form/rubric/styles.css index 57616a425ee..4428ac3921e 100644 --- a/grade/grading/form/rubric/styles.css +++ b/grade/grading/form/rubric/styles.css @@ -82,6 +82,7 @@ .gradingform_rubric.editor .criterion.last .controls .movedown input {display:none;} /* evaluation */ +.gradingform_rubric .criterion .levels .level.currentchecked {background:#fff0f0;} .gradingform_rubric .criterion .levels .level.checked {background:#d0ffd0;border:1px solid #555;} .gradingform_rubric.evaluate .criterion .levels .level:hover {background:#30ff30;} @@ -114,4 +115,5 @@ */ .gradingform_rubric-regrade {padding:10px;background:#FFDDDD;border:1px solid #F00;margin-bottom:10px;} +.gradingform_rubric-restored {padding:10px;background:#FFFFDD;border:1px solid #FF0;margin-bottom:10px;} .gradingform_rubric-error {color:red;font-weight:bold;}