From 09171b955eae828ea1731588a8e42fa6106bdbac 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 | 17 +++++++++++++++-- lang/en/grades.php | 1 + lib/grade/grade_category.php | 3 +++ 4 files changed, 20 insertions(+), 2 deletions(-) diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index 1174375775e..2e7022b7f82 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -191,6 +191,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 f9feea807d8..aa4a8edf28c 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -185,6 +185,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) { @@ -259,8 +260,15 @@ class grade_report_grader extends grade_report { } $errorstr = ''; - // Warn if the grade is out of bounds. - if (!is_null($finalgrade)) { + $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'; @@ -268,6 +276,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); @@ -275,6 +284,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 118d3663db4..769c54c408b 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -322,6 +322,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['gradevaluetoobig'] = 'One of the grade values is larger than the allowed grade maximum of {$a}'; $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 b70030cead0..01a8449c577 100644 --- a/lib/grade/grade_category.php +++ b/lib/grade/grade_category.php @@ -628,6 +628,7 @@ class grade_category extends grade_object { $grade->finalgrade = null; if (!is_null($oldfinalgrade)) { + $grade->timemodified = time(); $success = $grade->update('aggregation'); // If successful trigger a user_graded event. @@ -712,6 +713,7 @@ class grade_category extends grade_object { $grade->finalgrade = null; if (!is_null($oldfinalgrade)) { + $grade->timemodified = time(); $success = $grade->update('aggregation'); // If successful trigger a user_graded event. @@ -754,6 +756,7 @@ class grade_category extends grade_object { if (grade_floats_different($grade->finalgrade, $oldfinalgrade) || grade_floats_different($grade->rawgrademax, $oldrawgrademax) || grade_floats_different($grade->rawgrademin, $oldrawgrademin)) { + $grade->timemodified = time(); $success = $grade->update('aggregation'); // If successful trigger a user_graded event.