MDL-69496 quiz: Only validate completion if unlocked

Quiz completion settings are only validated if they are unlocked.
Undefined behaviour in the forms API results in the completion
settings 'require passing grade' and 'completion attempts exhausted'
not being sent to the process options function if completion
settings are locked. This resulted in the completion attempts
exhausted setting being disabled whenever the quiz was saved
as it did not detect the require passing grade setting.
This changes the behaviour so that validation is only performed
if the completion settings are unlocked.
A behat test is included to ensure the setting does not change.
This commit is contained in:
PraiseSatan
2021-11-17 09:11:29 +11:00
parent ef9ffcd16d
commit 982d1bb1c8
2 changed files with 67 additions and 8 deletions
+11 -8
View File
@@ -1128,14 +1128,17 @@ function quiz_process_options($quiz) {
$quiz->reviewoverallfeedback &= ~mod_quiz_display_options::DURING;
// Ensure that disabled checkboxes in completion settings are set to 0.
if (empty($quiz->completionusegrade)) {
$quiz->completionpassgrade = 0;
}
if (empty($quiz->completionpassgrade)) {
$quiz->completionattemptsexhausted = 0;
}
if (empty($quiz->completionminattemptsenabled)) {
$quiz->completionminattempts = 0;
// But only if the completion settinsg are unlocked.
if (!empty($quiz->completionunlocked)) {
if (empty($quiz->completionusegrade)) {
$quiz->completionpassgrade = 0;
}
if (empty($quiz->completionpassgrade)) {
$quiz->completionattemptsexhausted = 0;
}
if (empty($quiz->completionminattemptsenabled)) {
$quiz->completionminattempts = 0;
}
}
}
@@ -0,0 +1,56 @@
@mod @mod_quiz @core_completion
Feature: Ensure saving a quiz does not modify the completion settings.
In order to reliably use completion
As a teacher
I need to be able to update the quiz
without changing the completion settings.
Background:
Given the following "users" exist:
| username | firstname | lastname | email |
| student1 | Student | 1 | student1@example.com |
| teacher1 | Teacher | 1 | teacher1@example.com |
And the following "courses" exist:
| fullname | shortname | category | enablecompletion |
| Course 1 | C1 | 0 | 1 |
And the following "course enrolments" exist:
| user | course | role |
| teacher1 | C1 | editingteacher |
| student1 | C1 | student |
And the following config values are set as admin:
| grade_item_advanced | hiddenuntil |
And the following "question categories" exist:
| contextlevel | reference | name |
| Course | C1 | Test questions |
And the following "questions" exist:
| questioncategory | qtype | name | questiontext |
| Test questions | truefalse | First question | Answer the first question |
And the following "activity" exists:
| activity | quiz |
| course | C1 |
| idnumber | quiz1 |
| name | Test quiz |
| section | 1 |
| attempts | 2 |
| gradepass | 5.00 |
| completion | 2 |
| completionview | 0 |
| completionusegrade | 1 |
| completionpassgrade | 1 |
| completionattemptsexhausted | 1 |
And quiz "Test quiz" contains the following questions:
| question | page |
| First question | 1 |
And user "student1" has attempted "Test quiz" with responses:
| slot | response |
| 1 | True |
Scenario: Ensure saving quiz activty does not change completion settings
Given I am on the "Test quiz" "mod_quiz > View" page logged in as "teacher1"
When I navigate to "Settings" in current page administration
Then the "completionattemptsexhausted" "field" should be disabled
And the field "completionattemptsexhausted" matches value "1"
And I press "Save and display"
And I navigate to "Settings" in current page administration
And the "completionattemptsexhausted" "field" should be disabled
And the field "completionattemptsexhausted" matches value "1"