MDL-71796 mod_scorm: fix custom completion logic

This commit is contained in:
Simey Lameze
2021-07-05 17:47:44 +08:00
parent aeb47889fa
commit 4fc4c6b54b
3 changed files with 12 additions and 10 deletions
@@ -67,18 +67,14 @@ class custom_completion extends activity_custom_completion {
// Get available status list.
$statuses = array_flip(\scorm_status_options());
$statusbits = 0;
$requiredcompletionstatusid = $this->cm->customdata['customcompletionrules']['completionstatusrequired'] ?? 0;
$isanystatus = ($requiredcompletionstatusid == array_sum($statuses));
// Check at least one track meets the required completion status value(s).
foreach ($tracks as $track) {
if (array_key_exists($track->value, $statuses)) {
$statusbits |= $statuses[$track->value];
}
// All completion status requirements met.
if ($statusbits == $requiredcompletionstatusid) {
if (array_key_exists($track->value, $statuses)
&& ($isanystatus || $statuses[$track->value] == $requiredcompletionstatusid)) {
$status = COMPLETION_COMPLETE;
break;
}
@@ -93,7 +93,7 @@ Feature: View activity completion in the SCORM activity
And the "Receive a score of 3 or more" completion condition of "Music history" is displayed as "failed"
And the "Do all parts of this activity" completion condition of "Music history" is displayed as "done"
And the "Receive a grade" completion condition of "Music history" is displayed as "done"
And the "Complete and pass the activity" completion condition of "Music history" is displayed as "failed"
And the "Complete and pass the activity" completion condition of "Music history" is displayed as "done"
@javascript
Scenario: Use manual completion
+8 -2
View File
@@ -105,11 +105,17 @@ class custom_completion_test extends advanced_testcase {
'completionstatusrequired', 4, [$completioncompleted], 1, COMPLETION_COMPLETE, null
],
'Completion status Passed and Completed required, user has only completed, can make another attempt' => [
'completionstatusrequired', 6, [$completioncompleted], 0, COMPLETION_INCOMPLETE, null
'completionstatusrequired', 6, [$completioncompleted], 0, COMPLETION_COMPLETE, null
],
'Completion status Passed and Completed required, user has completed and passed' => [
'completionstatusrequired', 6, [$completionpassed, $completioncompleted], 0, COMPLETION_COMPLETE, null
],
'Completion status Passed and Completed required, user has not passed or completed, but has another attempt' => [
'completionstatusrequired', 6, [$completionincomplete], 2, COMPLETION_INCOMPLETE, null
],
'Completion status Passed and Completed required, user has used all attempts, but not passed or completed' => [
'completionstatusrequired', 6, [$completionincomplete], 1, COMPLETION_COMPLETE_FAIL, null
],
'Completion status Passed required, user has used all attempts and completed, but not passed' => [
'completionstatusrequired', 2, [$completioncompleted], 1, COMPLETION_COMPLETE_FAIL, null
],
@@ -117,7 +123,7 @@ class custom_completion_test extends advanced_testcase {
'completionstatusrequired', 4, [$completionincomplete], 1, COMPLETION_COMPLETE_FAIL, null
],
'Completion status Passed and Completed required, user has used all attempts, but not passed' => [
'completionstatusrequired', 6, [$completionincomplete, $completioncompleted], 2, COMPLETION_COMPLETE_FAIL, null
'completionstatusrequired', 6, [$completionincomplete, $completioncompleted], 2, COMPLETION_COMPLETE, null
],
'Completion score required, user has no score' => [
'completionscorerequired', 80, [], 0, COMPLETION_INCOMPLETE, null