From 0f60e9fe539e6fe3e88b5edec5e15c2931697cfa Mon Sep 17 00:00:00 2001 From: Andrew Davis Date: Mon, 29 Apr 2013 10:15:08 +0800 Subject: [PATCH] MDL-32913 core_grade:made it more obvious when the gradebook is broken due to a broken calculation --- grade/export/lib.php | 10 ++++++++++ grade/export/ods/index.php | 1 + grade/export/txt/index.php | 1 + grade/export/xls/index.php | 1 + grade/export/xml/index.php | 1 + grade/lib.php | 5 ++++- lang/en/error.php | 1 + lang/en/grades.php | 1 + lib/gradelib.php | 4 ++-- 9 files changed, 22 insertions(+), 3 deletions(-) diff --git a/grade/export/lib.php b/grade/export/lib.php index c736b2364a1..9d60306cdeb 100644 --- a/grade/export/lib.php +++ b/grade/export/lib.php @@ -420,3 +420,13 @@ class grade_export_update_buffer { } } +/** + * Verify that there is a valid set of grades to export. + * @param $courseid int The course being exported + */ +function export_verify_grades($courseid) { + $regraderesult = grade_regrade_final_grades($courseid); + if (is_array($regraderesult)) { + throw new moodle_exception('gradecantregrade', 'error', '', implode(',', $regraderesult)); + } +} diff --git a/grade/export/ods/index.php b/grade/export/ods/index.php index 5b1c33c260c..7eee25afe05 100644 --- a/grade/export/ods/index.php +++ b/grade/export/ods/index.php @@ -34,6 +34,7 @@ require_capability('moodle/grade:export', $context); require_capability('gradeexport/ods:view', $context); print_grade_page_head($COURSE->id, 'export', 'ods', get_string('exportto', 'grades') . ' ' . get_string('pluginname', 'gradeexport_ods')); +export_verify_grades($COURSE->id); if (!empty($CFG->gradepublishing)) { $CFG->gradepublishing = has_capability('gradeexport/ods:publish', $context); diff --git a/grade/export/txt/index.php b/grade/export/txt/index.php index 68370fc4688..3f0f43bd781 100644 --- a/grade/export/txt/index.php +++ b/grade/export/txt/index.php @@ -34,6 +34,7 @@ require_capability('moodle/grade:export', $context); require_capability('gradeexport/txt:view', $context); print_grade_page_head($COURSE->id, 'export', 'txt', get_string('exportto', 'grades') . ' ' . get_string('pluginname', 'gradeexport_txt')); +export_verify_grades($COURSE->id); if (!empty($CFG->gradepublishing)) { $CFG->gradepublishing = has_capability('gradeexport/txt:publish', $context); diff --git a/grade/export/xls/index.php b/grade/export/xls/index.php index 41230a23f4c..942f74ceef2 100644 --- a/grade/export/xls/index.php +++ b/grade/export/xls/index.php @@ -34,6 +34,7 @@ require_capability('moodle/grade:export', $context); require_capability('gradeexport/xls:view', $context); print_grade_page_head($COURSE->id, 'export', 'xls', get_string('exportto', 'grades') . ' ' . get_string('pluginname', 'gradeexport_xls')); +export_verify_grades($COURSE->id); if (!empty($CFG->gradepublishing)) { $CFG->gradepublishing = has_capability('gradeexport/xls:publish', $context); diff --git a/grade/export/xml/index.php b/grade/export/xml/index.php index d96848922a8..57271fd65e2 100644 --- a/grade/export/xml/index.php +++ b/grade/export/xml/index.php @@ -34,6 +34,7 @@ require_capability('moodle/grade:export', $context); require_capability('gradeexport/xml:view', $context); print_grade_page_head($COURSE->id, 'export', 'xml', get_string('exportto', 'grades') . ' ' . get_string('pluginname', 'gradeexport_xml')); +export_verify_grades($COURSE->id); if (!empty($CFG->gradepublishing)) { $CFG->gradepublishing = has_capability('gradeexport/xml:publish', $context); diff --git a/grade/lib.php b/grade/lib.php index 3e499bf8d48..419b13dc3b0 100644 --- a/grade/lib.php +++ b/grade/lib.php @@ -128,7 +128,10 @@ class graded_users_iterator { $this->close(); - grade_regrade_final_grades($this->course->id); + $regraderesult = grade_regrade_final_grades($this->course->id); + if (is_array($regraderesult)) { + throw new moodle_exception('gradecantregrade', 'error', '', implode(',', $regraderesult)); + } $course_item = grade_item::fetch_course_item($this->course->id); if ($course_item->needsupdate) { // can not calculate all final grades - sorry diff --git a/lang/en/error.php b/lang/en/error.php index aafb38333ae..2f2623ec657 100644 --- a/lang/en/error.php +++ b/lang/en/error.php @@ -240,6 +240,7 @@ $string['filternotinstalled'] = 'Filter {$a} is not currently installed'; $string['forumblockingtoomanyposts'] = 'You have exceeded the posting threshold set for this forum'; $string['generalexceptionmessage'] = 'Exception - {$a}'; $string['gradepubdisable'] = 'Grade publishing disabled'; +$string['gradecantregrade'] = 'An error occurred during grade calculation: {$a}'; $string['groupalready'] = 'User already belongs to group {$a}'; $string['groupexistforcourse'] = 'Group "{$a}" already exists for this course'; $string['groupexistforcoursewithidnumber'] = '{$a->problemgroup}: Group "{$a->name}" with an idnumber of "{$a->idnumber}" already exists for this course'; diff --git a/lang/en/grades.php b/lang/en/grades.php index a9fb4d4d935..cd32c838898 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -173,6 +173,7 @@ $string['enableoutcomes_help'] = 'Support for Outcomes (also known as Competenci $string['encoding'] = 'Encoding'; $string['errorcalculationnoequal'] = 'Formula must start with equal sign (=1+2)'; $string['errorcalculationunknown'] = 'Invalid formula'; +$string['errorcalculationbroken'] = 'Probably circular reference or broken calculation formula'; $string['errorgradevaluenonnumeric'] = 'Received non-numeric for low or high grade for'; $string['errornocalculationallowed'] = 'Calculations are not allowed for this item'; $string['errornocategorisedid'] = 'Could not get an uncategorised id!'; diff --git a/lib/gradelib.php b/lib/gradelib.php index f8742c23a3a..3ae134f4e8d 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -1097,9 +1097,9 @@ function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null) continue; // this one is ok } $grade_items[$gid]->force_regrading(); - $errors[$grade_items[$gid]->id] = 'Probably circular reference or broken calculation formula'; // TODO: localize + $errors[$grade_items[$gid]->id] = get_string('errorcalculationbroken', 'grades'); } - break; // oki, found error + break; // Found error. } }