MDL-49324 grades: Create helper function for regrading on report view
authorAndrew Nicols <andrew@nicols.co.uk>
Fri, 29 Jan 2016 06:02:03 +0000 (14:02 +0800)
committerAndrew Nicols <andrew@nicols.co.uk>
Wed, 24 Feb 2016 06:39:08 +0000 (14:39 +0800)
grade/edit/tree/index.php
grade/report/grader/index.php
grade/report/outcomes/index.php
grade/report/overview/index.php
grade/report/singleview/index.php
grade/report/user/index.php
lib/gradelib.php

index 081ec40..92f8391 100644 (file)
@@ -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'));
index dcd5b04..7885fdc 100644 (file)
@@ -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);
 
index df3a7c0..092373a 100644 (file)
@@ -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();
index 6cb2c61..14eef55 100644 (file)
@@ -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.
index fed131a..6485af2 100644 (file)
@@ -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);
 
index f8578cc..1e8460e 100644 (file)
@@ -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
index 4fc6950..91f911c 100644 (file)
@@ -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