From 92e3f3efcaeb2da92db507eb4700bcee296d9c93 Mon Sep 17 00:00:00 2001 From: Frederic Massart Date: Tue, 7 Oct 2014 15:56:20 +0800 Subject: [PATCH] MDL-38732 gradereport_grader: Handle simultaneous graders --- grade/report/grader/index.php | 1 + grade/report/grader/lib.php | 19 +++++++++++++++---- lang/en/grades.php | 1 + lib/grade/grade_category.php | 4 ++++ 4 files changed, 21 insertions(+), 4 deletions(-) diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index 435fb5734d1..b9ff46a9458 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -160,6 +160,7 @@ if ($USER->gradeediting[$course->id] && ($report->get_pref('showquickfeedback') echo '
'; echo ''; echo ''; + echo ''; echo ''; echo ''; echo $reporthtml; diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index bebc6c22fbd..e54ace906ac 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -176,6 +176,7 @@ class grade_report_grader extends grade_report { // Were any changes made? $changedgrades = false; + $timepageload = clean_param($data->timepageload, PARAM_INT); foreach ($data as $varname => $students) { @@ -250,10 +251,15 @@ class grade_report_grader extends grade_report { } $errorstr = ''; - // Warn if the grade is out of bounds. - if (is_null($finalgrade)) { - // ok - } else { + $skip = false; + + $dategraded = $oldvalue->get_dategraded(); + if (!empty($dategraded) && $timepageload < $dategraded) { + // Warn if the grade was updated while we were editing this form. + $errorstr = 'gradewasmodifiedduringediting'; + $skip = true; + } else if (!is_null($finalgrade)) { + // Warn if the grade is out of bounds. $bounded = $gradeitem->bounded_grade($finalgrade); if ($bounded > $finalgrade) { $errorstr = 'lessthanmin'; @@ -261,6 +267,7 @@ class grade_report_grader extends grade_report { $errorstr = 'morethanmax'; } } + if ($errorstr) { $userfields = 'id, ' . get_all_user_name_fields(true); $user = $DB->get_record('user', array('id' => $userid), $userfields); @@ -268,6 +275,10 @@ class grade_report_grader extends grade_report { $gradestr->username = fullname($user); $gradestr->itemname = $gradeitem->get_name(); $warnings[] = get_string($errorstr, 'grades', $gradestr); + if ($skip) { + // Skipping the update of this grade it failed the tests above. + continue; + } } } else if ($datatype == 'feedback') { diff --git a/lang/en/grades.php b/lang/en/grades.php index 119f00a0f26..4d5b485a017 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -302,6 +302,7 @@ $string['gradetype_help'] = 'There are 4 grade types: Only value and scale grade types may be aggregated. The grade type for an activity-based grade item is set on the activity settings page.'; $string['gradeview'] = 'View grade'; +$string['gradewasmodifiedduringediting'] = 'The grade entered for {$a->itemname} for {$a->username} was ignored because it was more recently updated by someone else.'; $string['gradeweighthelp'] = 'Grade weight help'; $string['groupavg'] = 'Group average'; $string['hidden'] = 'Hidden'; diff --git a/lib/grade/grade_category.php b/lib/grade/grade_category.php index 453294c183e..07f0b58e726 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -564,6 +564,7 @@ class grade_category extends grade_object { $grade->finalgrade = null; if (!is_null($oldfinalgrade)) { + $grade->timemodified = time(); $grade->update('aggregation'); } return; @@ -606,6 +607,7 @@ class grade_category extends grade_object { $grade->finalgrade = null; if (!is_null($oldfinalgrade)) { + $grade->timemodified = time(); $grade->update('aggregation'); } return; @@ -622,6 +624,7 @@ class grade_category extends grade_object { // update in db if changed if (grade_floats_different($grade->finalgrade, $oldfinalgrade)) { + $grade->timemodified = time(); $grade->update('aggregation'); } @@ -897,6 +900,7 @@ class grade_category extends grade_object { // update in db if changed if (grade_floats_different($grade->finalgrade, $oldfinalgrade)) { + $grade->timemodified = time(); $grade->update('aggregation'); }