MDL-52206 core: Add completion criteria to course_modules

This commit is contained in:
Peter 2019-12-04 10:14:31 +08:00 committed by Peter Dias
parent 663137748e
commit 90acd8d381
19 changed files with 113 additions and 17 deletions

View file

@ -2867,6 +2867,7 @@ class core_course_external extends external_api {
'visibleoncoursepage' => new external_value(PARAM_INT, 'If visible on course page', VALUE_OPTIONAL),
'visibleold' => new external_value(PARAM_INT, 'Visible old', VALUE_OPTIONAL),
'completiongradeitemnumber' => new external_value(PARAM_INT, 'Completion grade item', VALUE_OPTIONAL),
'completionpassgrade' => new external_value(PARAM_INT, 'Completion pass grade setting', VALUE_OPTIONAL),
'completionview' => new external_value(PARAM_INT, 'Completion view setting', VALUE_OPTIONAL),
'completionexpected' => new external_value(PARAM_INT, 'Completion time expected', VALUE_OPTIONAL),
'showdescription' => new external_value(PARAM_INT, 'If the description is showed', VALUE_OPTIONAL),

View file

@ -461,6 +461,7 @@ function get_array_of_activities($courseid) {
$mod[$seq]->extra = "";
$mod[$seq]->completiongradeitemnumber =
$rawmods[$seq]->completiongradeitemnumber;
$mod[$seq]->completionpassgrade = $rawmods[$seq]->completionpassgrade;
$mod[$seq]->completionview = $rawmods[$seq]->completionview;
$mod[$seq]->completionexpected = $rawmods[$seq]->completionexpected;
$mod[$seq]->showdescription = $rawmods[$seq]->showdescription;

View file

@ -72,6 +72,7 @@ function add_moduleinfo($moduleinfo, $course, $mform = null) {
$completion = new completion_info($course);
if ($completion->is_enabled()) {
$newcm->completion = $moduleinfo->completion;
$newcm->completionpassgrade = $moduleinfo->completionpassgrade ?? 0;
if ($moduleinfo->completiongradeitemnumber === '') {
$newcm->completiongradeitemnumber = null;
} else {
@ -432,6 +433,8 @@ function set_moduleinfo_defaults($moduleinfo) {
if (isset($moduleinfo->completionusegrade) && $moduleinfo->completionusegrade) {
$moduleinfo->completiongradeitemnumber = 0;
} else if (!isset($moduleinfo->completiongradeitemnumber)) {
// If there is no gradeitemnumber set, make sure to disable completionpassgrade.
$moduleinfo->completionpassgrade = 0;
$moduleinfo->completiongradeitemnumber = null;
}
@ -544,6 +547,7 @@ function update_moduleinfo($cm, $moduleinfo, $course, $mform = null) {
// the activity may be locked; if so, these should not be updated.
if (!empty($moduleinfo->completionunlocked)) {
$cm->completion = $moduleinfo->completion;
$cm->completionpassgrade = $moduleinfo->completionpassgrade ?? 0;
if ($moduleinfo->completiongradeitemnumber === '') {
$cm->completiongradeitemnumber = null;
} else {
@ -712,6 +716,7 @@ function get_moduleinfo_data($cm, $course) {
$data->completionview = $cm->completionview;
$data->completionexpected = $cm->completionexpected;
$data->completionusegrade = is_null($cm->completiongradeitemnumber) ? 0 : 1;
$data->completionpassgrade = $cm->completionpassgrade;
$data->completiongradeitemnumber = $cm->completiongradeitemnumber;
$data->showdescription = $cm->showdescription;
$data->tags = core_tag_tag::get_item_tags_array('core', 'course_modules', $cm->id);

View file

@ -372,6 +372,12 @@ abstract class moodleform_mod extends moodleform {
}
if ($mform->elementExists('completionpassgrade')) {
$mform->freeze('completionpassgrade');
// Has the completion pass grade completion criteria been set?
// If it has then we shouldn't change the gradepass field.
if ($mform->exportValue('completionpassgrade')) {
$mform->freeze('gradepass');
}
}
if ($mform->elementExists('completiongradeitemnumber')) {
$mform->freeze('completiongradeitemnumber');

View file

@ -221,6 +221,7 @@ class core_course_courselib_testcase extends advanced_testcase {
$moduleinfo->completion = COMPLETION_TRACKING_AUTOMATIC;
$moduleinfo->completionview = COMPLETION_VIEW_REQUIRED;
$moduleinfo->completiongradeitemnumber = 1;
$moduleinfo->completionpassgrade = 0;
$moduleinfo->completionexpected = time() + (7 * 24 * 3600);
// Conditional activity.
@ -283,6 +284,7 @@ class core_course_courselib_testcase extends advanced_testcase {
$this->assertEquals($moduleinfo->completion, $dbcm->completion);
$this->assertEquals($moduleinfo->completionview, $dbcm->completionview);
$this->assertEquals($moduleinfo->completiongradeitemnumber, $dbcm->completiongradeitemnumber);
$this->assertEquals($moduleinfo->completionpassgrade, $dbcm->completionpassgrade);
$this->assertEquals($moduleinfo->completionexpected, $dbcm->completionexpected);
$this->assertEquals($moduleinfo->availability, $dbcm->availability);
$this->assertEquals($moduleinfo->showdescription, $dbcm->showdescription);
@ -504,6 +506,7 @@ class core_course_courselib_testcase extends advanced_testcase {
$moduleinfo->completion = COMPLETION_TRACKING_AUTOMATIC;
$moduleinfo->completionview = COMPLETION_VIEW_REQUIRED;
$moduleinfo->completiongradeitemnumber = 1;
$moduleinfo->completionpassgrade = 0;
$moduleinfo->completionexpected = time() + (7 * 24 * 3600);
$moduleinfo->completionunlocked = 1;
@ -561,6 +564,7 @@ class core_course_courselib_testcase extends advanced_testcase {
$this->assertEquals($moduleinfo->completion, $dbcm->completion);
$this->assertEquals($moduleinfo->completionview, $dbcm->completionview);
$this->assertEquals($moduleinfo->completiongradeitemnumber, $dbcm->completiongradeitemnumber);
$this->assertEquals($moduleinfo->completionpassgrade, $dbcm->completionpassgrade);
$this->assertEquals($moduleinfo->completionexpected, $dbcm->completionexpected);
$this->assertEquals($moduleinfo->availability, $dbcm->availability);
$this->assertEquals($moduleinfo->showdescription, $dbcm->showdescription);

View file

@ -2306,14 +2306,17 @@ class externallib_test extends externallib_advanced_testcase {
$this->resetAfterTest(true);
$this->setAdminUser();
$course = self::getDataGenerator()->create_course();
$course = self::getDataGenerator()->create_course(['enablecompletion' => 1]);
$record = array(
'course' => $course->id,
'name' => 'First Assignment'
);
$options = array(
'idnumber' => 'ABC',
'visible' => 0
'visible' => 0,
'completion' => COMPLETION_TRACKING_AUTOMATIC,
'completiongradeitemnumber' => 0,
'completionpassgrade' => 1,
);
// Hidden activity.
$assign = self::getDataGenerator()->create_module('assign', $record, $options);
@ -2370,7 +2373,7 @@ class externallib_test extends externallib_advanced_testcase {
$this->assertCount(0, $result['warnings']);
// Test we retrieve all the fields.
$this->assertCount(28, $result['cm']);
$this->assertCount(29, $result['cm']);
$this->assertEquals($record['name'], $result['cm']['name']);
$this->assertEquals($options['idnumber'], $result['cm']['idnumber']);
$this->assertEquals(100, $result['cm']['grade']);
@ -2438,7 +2441,7 @@ class externallib_test extends externallib_advanced_testcase {
$this->assertCount(0, $result['warnings']);
// Test we retrieve all the fields.
$this->assertCount(26, $result['cm']);
$this->assertCount(27, $result['cm']);
$this->assertEquals($record['name'], $result['cm']['name']);
$this->assertEquals($record['grade'], $result['cm']['grade']);
$this->assertEquals($options['idnumber'], $result['cm']['idnumber']);

View file

@ -112,6 +112,7 @@ class core_course_modlib_testcase extends advanced_testcase {
$expecteddata->completionview = $assigncm->completionview;
$expecteddata->completionexpected = $assigncm->completionexpected;
$expecteddata->completionusegrade = is_null($assigncm->completiongradeitemnumber) ? 0 : 1;
$expecteddata->completionpassgrade = $assigncm->completionpassgrade;
$expecteddata->completiongradeitemnumber = null;
$expecteddata->showdescription = $assigncm->showdescription;
$expecteddata->tags = core_tag_tag::get_item_tags_array('core', 'course_modules', $assigncm->id);
@ -138,6 +139,7 @@ class core_course_modlib_testcase extends advanced_testcase {
}
}
$expecteddata->gradepass = '0.00';
$expecteddata->completionpassgrade = $assigncm->completionpassgrade;
// Unset untestable.
unset($expecteddata->cmid);