MDL-48168 quiz editing: max grade should be editable after attempts
authorTim Hunt <T.J.Hunt@open.ac.uk>
Mon, 10 Nov 2014 18:46:53 +0000 (18:46 +0000)
committerTim Hunt <T.J.Hunt@open.ac.uk>
Mon, 10 Nov 2014 19:00:05 +0000 (19:00 +0000)
Note that there was a lot of legacy code left from Moodle 2.7 which is
no longer required, and I took this opportunity to delete it.

mod/quiz/edit.php
mod/quiz/tests/behat/editing_set_marks_no_attempts.feature [moved from mod/quiz/tests/behat/editing_set_marks.feature with 100% similarity]
mod/quiz/tests/behat/editing_set_marks_with_attempts.feature [new file with mode: 0644]

index 0b90650..79ec061 100644 (file)
@@ -149,140 +149,15 @@ if ((optional_param('addrandom', false, PARAM_BOOL)) && confirm_sesskey()) {
 }
 
 if (optional_param('savechanges', false, PARAM_BOOL) && confirm_sesskey()) {
-    $structure->check_can_be_edited();
-    $deletepreviews = false;
-    $recomputesummarks = false;
-
-    $rawdata = (array) data_submitted();
-    $moveonpagequestions = array();
-    $moveselectedonpage = optional_param('moveselectedonpagetop', 0, PARAM_INT);
-    if (!$moveselectedonpage) {
-        $moveselectedonpage = optional_param('moveselectedonpagebottom', 0, PARAM_INT);
-    }
-
-    $newslotorder = array();
-    foreach ($rawdata as $key => $value) {
-        if (preg_match('!^g([0-9]+)$!', $key, $matches)) {
-            // Parse input for question -> grades.
-            $slotnumber = $matches[1];
-            $newgrade = unformat_float($value);
-            quiz_update_slot_maxmark($DB->get_record('quiz_slots',
-                    array('quizid' => $quiz->id, 'slot' => $slotnumber), '*', MUST_EXIST), $newgrade);
-            $deletepreviews = true;
-            $recomputesummarks = true;
-
-        } else if (preg_match('!^o(pg)?([0-9]+)$!', $key, $matches)) {
-            // Parse input for ordering info.
-            $slotnumber = $matches[2];
-            // Make sure two questions don't overwrite each other. If we get a second
-            // question with the same position, shift the second one along to the next gap.
-            $value = clean_param($value, PARAM_INT);
-            while (array_key_exists($value, $newslotorder)) {
-                $value++;
-            }
-            if ($matches[1]) {
-                // This is a page-break entry.
-                $newslotorder[$value] = 0;
-            } else {
-                $newslotorder[$value] = $slotnumber;
-            }
-            $deletepreviews = true;
-        }
-    }
-
-    if ($moveselectedonpage) {
-
-        // Make up a $newslotorder, then let the next if statement do the work.
-        $oldslots = $DB->get_records('quiz_slots', array('quizid' => $quiz->id), 'slot');
-
-        $beforepage = array();
-        $onpage = array();
-        $afterpage = array();
-        foreach ($oldslots as $oldslot) {
-            if (in_array($oldslot->slot, $selectedslots)) {
-                $onpage[] = $oldslot;
-            } else if ($oldslot->page <= $moveselectedonpage) {
-                $beforepage[] = $oldslot;
-            } else {
-                $afterpage[] = $oldslot;
-            }
-        }
-
-        $newslotorder = array();
-        $currentpage = 1;
-        $index = 10;
-        foreach ($beforepage as $slot) {
-            while ($currentpage < $slot->page) {
-                $newslotorder[$index] = 0;
-                $index += 10;
-                $currentpage += 1;
-            }
-            $newslotorder[$index] = $slot->slot;
-            $index += 10;
-        }
-
-        while ($currentpage < $moveselectedonpage) {
-            $newslotorder[$index] = 0;
-            $index += 10;
-            $currentpage += 1;
-        }
-        foreach ($onpage as $slot) {
-            $newslotorder[$index] = $slot->slot;
-            $index += 10;
-        }
-
-        foreach ($afterpage as $slot) {
-            while ($currentpage < $slot->page) {
-                $newslotorder[$index] = 0;
-                $index += 10;
-                $currentpage += 1;
-            }
-            $newslotorder[$index] = $slot->slot;
-            $index += 10;
-        }
-    }
-
-    // If ordering info was given, reorder the questions.
-    if ($newslotorder) {
-        ksort($newslotorder);
-        $currentpage = 1;
-        $currentslot = 1;
-        $slotreorder = array();
-        $slotpages = array();
-        foreach ($newslotorder as $slotnumber) {
-            if ($slotnumber == 0) {
-                $currentpage += 1;
-                continue;
-            }
-            $slotreorder[$slotnumber] = $currentslot;
-            $slotpages[$currentslot] = $currentpage;
-            $currentslot += 1;
-        }
-        $trans = $DB->start_delegated_transaction();
-        update_field_with_unique_index('quiz_slots',
-                'slot', $slotreorder, array('quizid' => $quiz->id));
-        foreach ($slotpages as $slotnumber => $page) {
-            $DB->set_field('quiz_slots', 'page', $page, array('quizid' => $quiz->id, 'slot' => $slotnumber));
-        }
-        $trans->allow_commit();
-        $deletepreviews = true;
-    }
 
     // If rescaling is required save the new maximum.
     $maxgrade = unformat_float(optional_param('maxgrade', -1, PARAM_RAW));
     if ($maxgrade >= 0) {
         quiz_set_grade($maxgrade, $quiz);
-    }
-
-    if ($deletepreviews) {
-        quiz_delete_previews($quiz);
-    }
-    if ($recomputesummarks) {
-        quiz_update_sumgrades($quiz);
-        quiz_update_all_attempt_sumgrades($quiz);
         quiz_update_all_final_grades($quiz);
         quiz_update_grades($quiz, 0, true);
     }
+
     redirect($afteractionurl);
 }
 
diff --git a/mod/quiz/tests/behat/editing_set_marks_with_attempts.feature b/mod/quiz/tests/behat/editing_set_marks_with_attempts.feature
new file mode 100644 (file)
index 0000000..033d5ba
--- /dev/null
@@ -0,0 +1,89 @@
+@mod @mod_quiz
+Feature: In order to create a quiz that awards marks the way I want
+  As a teacher
+  I must be able to set the marks I want on the Edit quiz page (even after the quiz has been attempted).
+
+  Background:
+    Given the following "users" exist:
+      | username | firstname | lastname | email               |
+      | teacher1 | T1        | Teacher1 | teacher1@moodle.com |
+      | student1 | S1        | Student1 | student1@moodle.com |
+    And the following "courses" exist:
+      | fullname | shortname | category |
+      | Course 1 | C1        | 0        |
+    And the following "course enrolments" exist:
+      | user     | course | role           |
+      | teacher1 | C1     | editingteacher |
+      | student1 | C1     | student        |
+    And the following "activities" exist:
+      | activity   | name   | course | idnumber | grade | decimalpoints | questiondecimalpoints |
+      | quiz       | Quiz 1 | C1     | quiz1    | 20    | 2             | -1                    |
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I add a "True/False" question to the "Quiz 1" quiz with:
+      | Question name | First question |
+      | Question text | Answer me      |
+      | Default mark  | 2.0            |
+    And I add a "True/False" question to the "Quiz 1" quiz with:
+      | Question name | Second question |
+      | Question text | Answer again    |
+      | Default mark  | 3.0             |
+    And I log out
+    And I log in as "student1"
+    And I follow "Course 1"
+    And I follow "Quiz 1"
+    And I press "Attempt quiz now"
+    And I log out
+    And I log in as "teacher1"
+    And I follow "Course 1"
+    And I follow "Quiz 1"
+    And I navigate to "Edit quiz" node in "Quiz administration"
+
+  @javascript
+  Scenario: Set the max mark for a question.
+    When I set the max mark for question "First question" to "7.0"
+    Then I should see "7.00"
+    And I should see "3.00"
+    And I should see "Total of marks: 10.00"
+
+    When I follow "Edit maximum mark"
+    And I wait until "li input[name=maxmark]" "css_element" exists
+    And I take focus off "li input[name=maxmark]" "css_element"
+    Then I should see "7.00"
+    And I should see "3.00"
+    And I should see "Total of marks: 10.00"
+    And "li input[name=maxmark]" "css_element" should not exist
+
+  @javascript
+  Scenario: Set the overall Maximum grade.
+    When I set the field "maxgrade" to "10.0"
+    And I press "savechanges"
+    Then the field "maxgrade" matches value "10.00"
+    And I should see "2.00"
+    And I should see "3.00"
+    And I should see "Total of marks: 5.00"
+
+  @javascript
+  Scenario: Verify the number of decimal places shown is what the quiz settings say it should be.
+    # Then the field "maxgrade" matches value "20.00" -- with exact match on decimal places.
+    Then "//input[@name = 'maxgrade' and @value = '20.00']" "xpath_element" should exist
+    And I should see "2.00"
+    And I should see "3.00"
+    And I should see "Total of marks: 5.00"
+    And I should not see "2.000"
+    And I should not see "3.000"
+    And I should not see "Total of marks: 5.000"
+    When I follow "Edit settings"
+    And I set the following fields to these values:
+      | Decimal places in grades | 3 |
+      | Decimal places in question grades | 5 |
+    And I press "Save and display"
+    And I follow "Edit quiz"
+    # Then the field "maxgrade" matches value "20.000" -- with exact match on decimal places.
+    Then "//input[@name = 'maxgrade' and @value = '20.000']" "xpath_element" should exist
+    And I should see "2.00000"
+    And I should see "3.00000"
+    And I should see "Total of marks: 5.000"
+    And I should not see "2.000000"
+    And I should not see "3.000000"
+    And I should not see "Total of marks: 5.0000"