}
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);
}
--- /dev/null
+@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"