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.