Skip to content

Commit

Permalink
Merge branch 'MDL-48168' of git://github.com/timhunt/moodle
Browse files Browse the repository at this point in the history
  • Loading branch information
danpoltawski committed Nov 11, 2014
2 parents 20ac3aa + 080839c commit 4bd5445
Show file tree
Hide file tree
Showing 3 changed files with 90 additions and 126 deletions.
127 changes: 1 addition & 126 deletions mod/quiz/edit.php
Original file line number Diff line number Diff line change
Expand Up @@ -149,140 +149,15 @@
}

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);
}

Expand Down
89 changes: 89 additions & 0 deletions mod/quiz/tests/behat/editing_set_marks_with_attempts.feature
Original file line number Diff line number Diff line change
@@ -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"

0 comments on commit 4bd5445

Please sign in to comment.