Proyectos de Subversion Moodle

Rev

Rev 1 | Mostrar el archivo completo | | | Autoría | Ultima modificación | Ver Log |

Rev 1 Rev 1441
Línea 380... Línea 380...
380
 *
380
 *
381
 * @param stdClass $course The course to regrade
381
 * @param stdClass $course The course to regrade
382
 * @param callable $callback A function to call if regrading took place
382
 * @param callable $callback A function to call if regrading took place
383
 * @return moodle_url|false The URL to redirect to if redirecting
383
 * @return moodle_url|false The URL to redirect to if redirecting
384
 */
384
 */
385
function grade_regrade_final_grades_if_required($course, callable $callback = null) {
385
function grade_regrade_final_grades_if_required($course, ?callable $callback = null) {
386
    global $PAGE, $OUTPUT;
386
    global $PAGE;
Línea 387... Línea 387...
387
 
387
 
388
    if (!grade_needs_regrade_final_grades($course->id)) {
388
    if (!grade_needs_regrade_final_grades($course->id)) {
389
        return false;
389
        return false;
Línea 390... Línea 390...
390
    }
390
    }
391
 
-
 
392
    if (grade_needs_regrade_progress_bar($course->id)) {
-
 
393
        if ($PAGE->state !== moodle_page::STATE_IN_BODY) {
391
 
394
            $PAGE->set_heading($course->fullname);
-
 
395
            echo $OUTPUT->header();
-
 
396
        }
-
 
397
        echo $OUTPUT->heading(get_string('recalculatinggrades', 'grades'));
392
    if (grade_needs_regrade_progress_bar($course->id)) {
398
        $progress = new \core\progress\display(true);
-
 
399
        $status = grade_regrade_final_grades($course->id, null, null, $progress);
-
 
400
 
-
 
401
        // Show regrade errors and set the course to no longer needing regrade (stop endless loop).
-
 
402
        if (is_array($status)) {
-
 
403
            foreach ($status as $error) {
-
 
404
                $errortext = new \core\output\notification($error, \core\output\notification::NOTIFY_ERROR);
-
 
405
                echo $OUTPUT->render($errortext);
-
 
406
            }
-
 
407
            $courseitem = grade_item::fetch_course_item($course->id);
-
 
408
            $courseitem->regrading_finished();
-
 
409
        }
-
 
410
 
-
 
411
        if ($callback) {
393
        // Queue ad-hoc task and redirect.
412
            //
-
 
413
            $url = call_user_func($callback);
-
 
414
        }
-
 
415
 
-
 
416
        if (empty($url)) {
-
 
417
            $url = $PAGE->url;
-
 
418
        }
-
 
419
 
-
 
420
        echo $OUTPUT->continue_button($url);
-
 
421
        echo $OUTPUT->footer();
394
        grade_regrade_final_grades($course->id, async: true);
422
        die();
395
        return $callback ? call_user_func($callback) : $PAGE->url;
423
    } else {
396
    } else {
424
        $result = grade_regrade_final_grades($course->id);
397
        $result = grade_regrade_final_grades($course->id);
425
        if ($callback) {
398
        if ($callback) {
Línea 530... Línea 503...
530
                        $grade->feedback       = $grade_grades[$userid]->feedback;
503
                        $grade->feedback       = $grade_grades[$userid]->feedback;
531
                        $grade->feedbackformat = $grade_grades[$userid]->feedbackformat;
504
                        $grade->feedbackformat = $grade_grades[$userid]->feedbackformat;
532
                        $grade->usermodified   = $grade_grades[$userid]->usermodified;
505
                        $grade->usermodified   = $grade_grades[$userid]->usermodified;
533
                        $grade->datesubmitted  = $grade_grades[$userid]->get_datesubmitted();
506
                        $grade->datesubmitted  = $grade_grades[$userid]->get_datesubmitted();
534
                        $grade->dategraded     = $grade_grades[$userid]->get_dategraded();
507
                        $grade->dategraded     = $grade_grades[$userid]->get_dategraded();
-
 
508
                        $grade->deductedmark   = $grade_grades[$userid]->deductedmark;
Línea 535... Línea 509...
535
 
509
 
536
                        // create text representation of grade
510
                        // create text representation of grade
537
                        if ($grade_item->gradetype == GRADE_TYPE_TEXT or $grade_item->gradetype == GRADE_TYPE_NONE) {
511
                        if ($grade_item->gradetype == GRADE_TYPE_TEXT or $grade_item->gradetype == GRADE_TYPE_NONE) {
538
                            $grade->grade          = null;
512
                            $grade->grade          = null;
Línea 1151... Línea 1125...
1151
 *
1125
 *
1152
 * @param int $courseid The course ID
1126
 * @param int $courseid The course ID
1153
 * @param int $userid If specified try to do a quick regrading of the grades of this user only
1127
 * @param int $userid If specified try to do a quick regrading of the grades of this user only
1154
 * @param object $updated_item Optional grade item to be marked for regrading. It is required if $userid is set.
1128
 * @param object $updated_item Optional grade item to be marked for regrading. It is required if $userid is set.
1155
 * @param \core\progress\base $progress If provided, will be used to update progress on this long operation.
1129
 * @param \core\progress\base $progress If provided, will be used to update progress on this long operation.
-
 
1130
 * @param bool $async If true, and we are recalculating an entire course's grades, defer processing to an ad-hoc task.
1156
 * @return array|true true if ok, array of errors if problems found. Grade item id => error message
1131
 * @return array|true true if ok, array of errors if problems found. Grade item id => error message
1157
 */
1132
 */
1158
function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null, $progress=null) {
1133
function grade_regrade_final_grades($courseid, $userid=null, $updated_item=null, $progress=null, bool $async = false) {
1159
    // This may take a very long time and extra memory.
1134
    // This may take a very long time and extra memory.
1160
    \core_php_time_limit::raise();
1135
    \core_php_time_limit::raise();
1161
    raise_memory_limit(MEMORY_EXTRA);
1136
    raise_memory_limit(MEMORY_EXTRA);
Línea 1162... Línea 1137...
1162
 
1137
 
Línea 1177... Línea 1152...
1177
        }
1152
        }
Línea 1178... Línea 1153...
1178
 
1153
 
1179
    } else {
1154
    } else {
1180
        if (!$course_item->needsupdate) {
1155
        if (!$course_item->needsupdate) {
-
 
1156
            // nothing to do :-)
-
 
1157
            if ($progress instanceof \core\progress\stored) {
-
 
1158
                // The regrade was already run elsewhere without the stored progress, so just start and end it now.
-
 
1159
                $progress->start_progress(get_string('recalculatinggrades', 'grades'));
-
 
1160
                $progress->end_progress();
-
 
1161
            }
-
 
1162
            return true;
-
 
1163
        }
-
 
1164
        // Defer recalculation to an ad-hoc task.
-
 
1165
        if ($async) {
-
 
1166
            $regradecache = cache::make_from_params(
-
 
1167
                mode: cache_store::MODE_REQUEST,
-
 
1168
                component: 'core',
-
 
1169
                area: 'grade_regrade_final_grades',
-
 
1170
                options: [
-
 
1171
                    'simplekeys' => true,
-
 
1172
                    'simpledata' => true,
-
 
1173
                ],
-
 
1174
            );
-
 
1175
            // If the courseid already exists in the cache, return so we don't do this multiple times per request.
-
 
1176
            if ($regradecache->get($courseid)) {
-
 
1177
                return true;
-
 
1178
            }
-
 
1179
            $task = \core_course\task\regrade_final_grades::create($courseid);
-
 
1180
            $taskid = \core\task\manager::queue_adhoc_task($task, true);
-
 
1181
            if ($taskid) {
-
 
1182
                $task->set_id($taskid);
-
 
1183
                $task->initialise_stored_progress();
-
 
1184
            }
1181
            // nothing to do :-)
1185
            $regradecache->set($courseid, true);
1182
            return true;
1186
            return true;
1183
        }
1187
        }
Línea 1184... Línea 1188...
1184
    }
1188
    }
Línea 1219... Línea 1223...
1219
            $depends_on[$gid] = $grade_items[$gid]->depends_on();
1223
            $depends_on[$gid] = $grade_items[$gid]->depends_on();
1220
            $progresstotal++;
1224
            $progresstotal++;
1221
        }
1225
        }
1222
    }
1226
    }
Línea 1223... Línea 1227...
1223
 
1227
 
Línea 1224... Línea 1228...
1224
    $progress->start_progress('regrade_course', $progresstotal);
1228
    $progress->start_progress(get_string('recalculatinggrades', 'grades'), $progresstotal);
1225
 
1229
 
1226
    $errors = array();
1230
    $errors = array();
1227
    $finalids = array();
1231
    $finalids = array();
Línea 1599... Línea 1603...
1599
 
1603
 
1600
    //refetch all grades
1604
    //refetch all grades
Línea 1601... Línea 1605...
1601
    grade_grab_course_grades($courseid);
1605
    grade_grab_course_grades($courseid);
1602
 
1606
 
1603
    // recalculate all grades
1607
    // recalculate all grades
1604
    grade_regrade_final_grades($courseid);
1608
    grade_regrade_final_grades($courseid, async: true);
Línea 1605... Línea 1609...
1605
    return true;
1609
    return true;
1606
}
1610
}