From 0a802c9c4e38f820a1cd1821d9c31a1fa573f4f4 Mon Sep 17 00:00:00 2001 From: Andrew Nicols Date: Fri, 29 Jan 2016 14:02:03 +0800 Subject: [PATCH] MDL-49324 grades: Create helper function for regrading on report view --- grade/edit/tree/index.php | 12 ++------ grade/report/grader/index.php | 12 ++------ grade/report/outcomes/index.php | 11 +------ grade/report/overview/index.php | 11 +------ grade/report/singleview/index.php | 11 +------ grade/report/user/index.php | 11 +------ lib/gradelib.php | 50 +++++++++++++++++++++++++++++++ 7 files changed, 58 insertions(+), 60 deletions(-) diff --git a/grade/edit/tree/index.php b/grade/edit/tree/index.php index 081ec40f4c3..92f8391f685 100644 --- a/grade/edit/tree/index.php +++ b/grade/edit/tree/index.php @@ -238,16 +238,8 @@ if ($data = data_submitted() and confirm_sesskey()) { } } -// Do this check just before printing the grade header (and only do it once). -if (grade_needs_regrade_final_grades($courseid)) { - $PAGE->set_heading($course->fullname); - echo $OUTPUT->header(); - echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades')); - $progress = new \core\progress\display(true); - grade_regrade_final_grades($courseid, null, null, $progress); - echo $OUTPUT->continue_button($PAGE->url); - echo $OUTPUT->footer(); - die(); +if (grade_regrade_final_grades_if_required($course)) { + $recreatetree = true; } print_grade_page_head($courseid, 'settings', 'setup', get_string('gradebooksetup', 'grades')); diff --git a/grade/report/grader/index.php b/grade/report/grader/index.php index dcd5b04e00c..7885fdc90d8 100644 --- a/grade/report/grader/index.php +++ b/grade/report/grader/index.php @@ -123,16 +123,8 @@ if (!empty($target) && !empty($action) && confirm_sesskey()) { $reportname = get_string('pluginname', 'gradereport_grader'); // Do this check just before printing the grade header (and only do it once). -if (grade_needs_regrade_final_grades($courseid)) { - $PAGE->set_heading($course->fullname); - $progress = new \core\progress\display(true); - echo $OUTPUT->header(); - echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades')); - grade_regrade_final_grades($courseid, null, null, $progress); - echo $OUTPUT->continue_button($PAGE->url); - echo $OUTPUT->footer(); - die(); -} +grade_regrade_final_grades_if_required($course); + // Print header print_grade_page_head($COURSE->id, 'report', 'grader', $reportname, false, $buttons); diff --git a/grade/report/outcomes/index.php b/grade/report/outcomes/index.php index df3a7c075f4..092373ade80 100644 --- a/grade/report/outcomes/index.php +++ b/grade/report/outcomes/index.php @@ -40,16 +40,7 @@ $context = context_course::instance($course->id); require_capability('gradereport/outcomes:view', $context); // First make sure we have proper final grades. -if (grade_needs_regrade_final_grades($courseid)) { - $PAGE->set_heading($course->fullname); - $progress = new \core\progress\display(true); - echo $OUTPUT->header(); - echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades')); - grade_regrade_final_grades($courseid, null, null, $progress); - echo $OUTPUT->continue_button($PAGE->url); - echo $OUTPUT->footer(); - die(); -} +grade_regrade_final_grades_if_required($course); // Grab all outcomes used in course. $report_info = array(); diff --git a/grade/report/overview/index.php b/grade/report/overview/index.php index 6cb2c615a1e..14eef55bc6b 100644 --- a/grade/report/overview/index.php +++ b/grade/report/overview/index.php @@ -108,16 +108,7 @@ if (!isset($USER->grade_last_report)) { $USER->grade_last_report[$course->id] = 'overview'; // First make sure we have proper final grades. -if (grade_needs_regrade_final_grades($courseid)) { - $PAGE->set_heading($course->fullname); - $progress = new \core\progress\display(true); - echo $OUTPUT->header(); - echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades')); - grade_regrade_final_grades($courseid, null, null, $progress); - echo $OUTPUT->continue_button($PAGE->url); - echo $OUTPUT->footer(); - die(); -} +grade_regrade_final_grades_if_required($course); if (has_capability('moodle/grade:viewall', $context) && $courseid != SITEID) { // Please note this would be extremely slow if we wanted to implement this properly for all teachers. diff --git a/grade/report/singleview/index.php b/grade/report/singleview/index.php index fed131a7cae..6485af201d3 100644 --- a/grade/report/singleview/index.php +++ b/grade/report/singleview/index.php @@ -79,16 +79,7 @@ if (!isset($USER->grade_last_report)) { $USER->grade_last_report[$course->id] = 'singleview'; // First make sure we have proper final grades. -if (grade_needs_regrade_final_grades($courseid)) { - $PAGE->set_heading($course->fullname); - $progress = new \core\progress\display(true); - echo $OUTPUT->header(); - echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades')); - grade_regrade_final_grades($courseid, null, null, $progress); - echo $OUTPUT->continue_button($PAGE->url); - echo $OUTPUT->footer(); - die(); -} +grade_regrade_final_grades_if_required($course); $report = new gradereport_singleview($courseid, $gpr, $context, $itemtype, $itemid); diff --git a/grade/report/user/index.php b/grade/report/user/index.php index f8578cc3e6c..1e8460e24a0 100644 --- a/grade/report/user/index.php +++ b/grade/report/user/index.php @@ -80,16 +80,7 @@ if (!isset($USER->grade_last_report)) { $USER->grade_last_report[$course->id] = 'user'; // First make sure we have proper final grades. -if (grade_needs_regrade_final_grades($courseid)) { - $PAGE->set_heading($course->fullname); - $progress = new \core\progress\display(true); - echo $OUTPUT->header(); - echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades')); - grade_regrade_final_grades($courseid, null, null, $progress); - echo $OUTPUT->continue_button($PAGE->url); - echo $OUTPUT->footer(); - die(); -} +grade_regrade_final_grades_if_required($course); if (has_capability('moodle/grade:viewall', $context)) { //Teachers will see all student reports $groupmode = groups_get_course_groupmode($course); // Groups are being used diff --git a/lib/gradelib.php b/lib/gradelib.php index 4fc6950650d..91f911c58e0 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -336,6 +336,56 @@ function grade_needs_regrade_final_grades($courseid) { return $course_item->needsupdate; } +/** + * Return true if the regrade process is likely to be time consuming and + * will therefore require the progress bar. + * + * @param int $courseid The course ID + * @return bool Whether the regrade process is likely to be time consuming + */ +function grade_needs_regrade_progress_bar($courseid) { + global $DB; + $grade_items = grade_item::fetch_all(array('courseid' => $courseid)); + + list($sql, $params) = $DB->get_in_or_equal(array_keys($grade_items), SQL_PARAMS_NAMED, 'gi'); + $gradecount = $DB->count_records_select('grade_grades', 'id ' . $sql, $params); + + // This figure may seem arbitrary, but after analysis it seems that 100 grade_grades can be calculated in ~= 0.5 seconds. + // Any longer than this and we want to show the progress bar. + return $gradecount > 100; +} + +/** + * Check whether regarding of final grades is required and, if so, perform the regrade. + * + * If the regrade is expected to be time consuming (see grade_needs_regrade_progress_bar), then this + * function will output the progress bar, and redirect to the current PAGE->url after regrading + * completes. Otherwise the regrading will happen immediately and the page will be loaded as per + * normal. + * + * @param stdClass $course The course to regrade + * @return bool Whether the regrade process has taken place + */ +function grade_regrade_final_grades_if_required($course) { + global $PAGE, $OUTPUT; + + if (!grade_needs_regrade_final_grades($course->id)) { + return false; + } + + if (grade_needs_regrade_progress_bar($course->id)) { + $PAGE->set_heading($course->fullname); + echo $OUTPUT->header(); + echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades')); + $progress = new \core\progress\display(true); + grade_regrade_final_grades($course->id, null, null, $progress); + echo $OUTPUT->continue_button($PAGE->url); + echo $OUTPUT->footer(); + die(); + } else { + return grade_regrade_final_grades($course->id); + } +} /** * Returns grading information for given activity, optionally with user grades -- 2.43.0