MDL-74314 grade: use repeatable form elements for grade letters.

This commit is contained in:
Paul Holden 2022-03-25 17:36:51 +00:00
parent b81fb00f25
commit e9135d6708
6 changed files with 149 additions and 145 deletions

View File

@ -32,8 +32,11 @@ class edit_letter_form extends moodleform {
public function definition() {
$mform =& $this->_form;
$num = $this->_customdata['num'];
$admin = $this->_customdata['admin'];
[
'lettercount' => $lettercount,
'admin' => $admin,
] = $this->_customdata;
$mform->addElement('header', 'gradeletters', get_string('gradeletters', 'grades'));
@ -46,41 +49,35 @@ class edit_letter_form extends moodleform {
$gradeletter = get_string('gradeletter', 'grades');
$gradeboundary = get_string('gradeboundary', 'grades');
for ($i=1; $i<$num+1; $i++) {
$gradelettername = 'gradeletter'.$i;
$gradeboundaryname = 'gradeboundary'.$i;
// The fields to create the grade letter/boundary.
$elements = [];
$elements[] = $mform->createElement('text', 'gradeletter', "{$gradeletter} {no}");
$elements[] = $mform->createElement('static', '', '', '&ge;');
$elements[] = $mform->createElement('float', 'gradeboundary', "{$gradeboundary} {no}");
$elements[] = $mform->createElement('static', '', '', '%');
$entry = array();
$entry[] = $mform->createElement('text', $gradelettername, $gradeletter . " $i");
$mform->setType($gradelettername, PARAM_TEXT);
// Element options/rules, fields should be disabled unless "Override" is checked for course grade letters.
$options = [];
$options['gradeletter']['type'] = PARAM_TEXT;
if (!$admin) {
$mform->disabledIf($gradelettername, 'override', 'notchecked');
}
$entry[] = $mform->createElement('static', '', '', '&ge;');
$entry[] = $mform->createElement('float', $gradeboundaryname, $gradeboundary." $i");
$entry[] = $mform->createElement('static', '', '', '%');
$mform->addGroup($entry, 'gradeentry'.$i, $gradeletter." $i", array(' '), false);
if (!$admin) {
$mform->disabledIf($gradeboundaryname, 'override', 'notchecked');
}
if (!$admin) {
$options['gradeletter']['disabledif'] = ['override', 'notchecked'];
$options['gradeboundary']['disabledif'] = ['override', 'notchecked'];
}
if ($num > 0) {
$mform->addHelpButton('gradeentry1', 'gradeletter', 'grades');
// Create our repeatable elements, each one a group comprised of the fields defined previously.
$this->repeat_elements([
$mform->createElement('group', 'gradeentry', "{$gradeletter} {no}", $elements, [' '], false)
], $lettercount, $options, 'gradeentrycount', 'gradeentryadd', 3);
// Add a help icon to first element group, if it exists.
if ($mform->elementExists('gradeentry[0]')) {
$mform->addHelpButton('gradeentry[0]', 'gradeletter', 'grades');
}
// hidden params
$mform->addElement('hidden', 'id');
$mform->setType('id', PARAM_INT);
//-------------------------------------------------------------------------------
// buttons
$this->add_action_buttons();
}
}

View File

@ -78,7 +78,6 @@ $strgrades = get_string('grades');
$pagename = get_string('letters', 'grades');
$letters = grade_get_letters($context);
$num = count($letters) + 3;
$override = $DB->record_exists('grade_letters', array('contextid' => $context->id));
@ -129,18 +128,18 @@ if (!$edit) {
$data = new stdClass();
$data->id = $context->id;
$i = 1;
$i = 0;
foreach ($letters as $boundary=>$letter) {
$gradelettername = 'gradeletter'.$i;
$gradeboundaryname = 'gradeboundary'.$i;
$data->$gradelettername = $letter;
$data->$gradeboundaryname = $boundary;
$data->gradeletter[$i] = $letter;
$data->gradeboundary[$i] = $boundary;
$i++;
}
$data->override = $override;
$mform = new edit_letter_form($returnurl.$editparam, array('num'=>$num, 'admin'=>$admin));
// Count number of letters, used to build the repeated elements of the form.
$lettercount = count($letters);
$mform = new edit_letter_form($returnurl.$editparam, ['lettercount' => $lettercount, 'admin' => $admin]);
$mform->set_data($data);
if ($mform->is_cancelled()) {
@ -169,24 +168,19 @@ if (!$edit) {
}
$letters = array();
for ($i=1; $i < $num+1; $i++) {
$gradelettername = 'gradeletter'.$i;
$gradeboundaryname = 'gradeboundary'.$i;
if (property_exists($data, $gradeboundaryname) and $data->$gradeboundaryname != -1) {
$letter = trim($data->$gradelettername);
if ($letter == '') {
continue;
}
$boundary = floatval($data->$gradeboundaryname);
if ($boundary < 0 || $boundary > 100) {
continue; // Skip if out of range.
}
// The keys need to be strings so floats are not truncated.
$letters[number_format($boundary, 5)] = $letter;
for ($i = 0; $i < $data->gradeentrycount; $i++) {
$letter = $data->gradeletter[$i];
if ($letter === '') {
continue;
}
$boundary = floatval($data->gradeboundary[$i]);
if ($boundary < 0 || $boundary > 100) {
continue; // Skip if out of range.
}
// The keys need to be strings so floats are not truncated.
$letters[number_format($boundary, 5)] = $letter;
}
$pool = array();

View File

@ -29,8 +29,8 @@ Feature: We can customise the letter boundary of a course.
And I navigate to "More > Grade letters" in the course gradebook
And I click on "Edit" "button"
And I set the following fields to these values:
| id_override | 1 |
| id_gradeboundary10 | 57 |
| Override site defaults | 1 |
| Letter grade boundary 10 | 57 |
And I press "Save changes"
And I navigate to "View > Grader report" in the course gradebook
And I turn editing mode on

View File

@ -30,8 +30,8 @@ Feature: We can customise the letter boundary of a course in gradebook version 2
And I navigate to "More > Grade letters" in the course gradebook
And I click on "Edit" "button"
And I set the following fields to these values:
| id_override | 1 |
| id_gradeboundary10 | 57 |
| Override site defaults | 1 |
| Letter grade boundary 10 | 57 |
And I press "Save changes"
And I navigate to "View > Grader report" in the course gradebook
And I turn editing mode on

View File

@ -17,19 +17,19 @@ Feature: We can view the logs for any changes to grade letters.
And I navigate to "More > Grade letters" in the course gradebook
And I click on "Edit" "button"
And I set the following fields to these values:
| id_override | 1 |
| id_gradeboundary10 | 57 |
| Override site defaults | 1 |
| Letter grade boundary 10 | 57 |
And I press "Save changes"
And I click on "Edit" "button"
And I set the following fields to these values:
| id_override | 1 |
| id_gradeboundary10 | 50 |
| Override site defaults | 1 |
| Letter grade boundary 10 | 50 |
And I press "Save changes"
And I click on "Edit" "button"
And I set the following fields to these values:
| id_override | 1 |
| id_gradeletter11 | |
| id_gradeboundary11 | |
| Override site defaults | 1 |
| Grade letter 11 | |
| Letter grade boundary 11 | |
And I press "Save changes"
When I navigate to "Reports > Live logs" in site administration
Then I should see "Grade letter created"

View File

@ -21,35 +21,29 @@ Feature: Grade letters can be overridden
Scenario Outline: Grade letters can be completely overridden
When I set the following fields to these values:
| override | 1 |
| Override site defaults | 1 |
| Grade letter 1 | <l1> |
| gradeboundary1 | <b1> |
| Letter grade boundary 1| <b1> |
| Grade letter 2 | <l2> |
| gradeboundary2 | <b2> |
| Letter grade boundary 2| <b2> |
| Grade letter 3 | <l3> |
| gradeboundary3 | <b3> |
| Letter grade boundary 3| <b3> |
| Grade letter 4 | <l4> |
| gradeboundary4 | <b4> |
| Letter grade boundary 4| <b4> |
| Grade letter 5 | <l5> |
| gradeboundary5 | <b5> |
| Letter grade boundary 5| <b5> |
| Grade letter 6 | <l6> |
| gradeboundary6 | <b6> |
| Letter grade boundary 6| <b6> |
| Grade letter 7 | <l7> |
| gradeboundary7 | <b7> |
| Letter grade boundary 7| <b7> |
| Grade letter 8 | <l8> |
| gradeboundary8 | <b8> |
| Letter grade boundary 8| <b8> |
| Grade letter 9 | <l9> |
| gradeboundary9 | <b9> |
| Letter grade boundary 9| <b9> |
| Grade letter 10 | |
| gradeboundary10 | |
| Letter grade boundary 10| |
| Grade letter 11 | |
| gradeboundary11 | |
| Grade letter 12 | |
| gradeboundary12 | |
| Grade letter 13 | |
| gradeboundary13 | |
| Grade letter 14 | |
| gradeboundary14 | |
| Letter grade boundary 11| |
And I press "Save changes"
Then I should see "The default grade letters are currently overridden."
And the following should exist in the "grade-letters-view" table:
@ -74,29 +68,29 @@ Feature: Grade letters can be overridden
| component | stringid | value |
| core_langconfig | decsep | <decsep> |
When I set the following fields to these values:
| override | 1 |
| Override site defaults | 1 |
| Grade letter 1 | <l1> |
| gradeboundary1 | <b1> |
| Letter grade boundary 1| <b1> |
| Grade letter 2 | <l2> |
| gradeboundary2 | <b2> |
| Letter grade boundary 2| <b2> |
| Grade letter 3 | <l3> |
| gradeboundary3 | <b3> |
| Letter grade boundary 3| <b3> |
| Grade letter 4 | |
| gradeboundary4 | |
| Letter grade boundary 4| |
| Grade letter 5 | |
| gradeboundary5 | |
| Letter grade boundary 5| |
| Grade letter 6 | |
| gradeboundary6 | |
| Letter grade boundary 6| |
| Grade letter 7 | |
| gradeboundary7 | |
| Letter grade boundary 7| |
| Grade letter 8 | |
| gradeboundary8 | |
| Letter grade boundary 8| |
| Grade letter 9 | |
| gradeboundary9 | |
| Letter grade boundary 9| |
| Grade letter 10 | |
| gradeboundary10 | |
| Letter grade boundary 10| |
| Grade letter 11 | |
| gradeboundary11 | |
| Letter grade boundary 11| |
And I press "Save changes"
Then I should see "The default grade letters are currently overridden."
And the following should exist in the "grade-letters-view" table:
@ -110,37 +104,62 @@ Feature: Grade letters can be overridden
| . | A | 88.88 | B | 50.00 | C | 0.00 | 100.00 % | 88.88 % | 88.87 % | 50.00 % | 49.99 % | 0.00 % |
| # | A | 88#88 | B | 50#00 | C | 0#00 | 100#00 % | 88#88 % | 88#87 % | 50#00 % | 49#99 % | 0#00 % |
Scenario: Define additional grade letters
Given I set the field "Override site defaults" to "1"
When I press "Add 3 field(s) to form"
And I set the following fields to these values:
| Grade letter 11 | E |
| Letter grade boundary 11 | 50 |
| Grade letter 12 | F |
| Letter grade boundary 12 | 40 |
| Grade letter 13 | G |
| Letter grade boundary 13 | 30 |
| Grade letter 14 | U |
| Letter grade boundary 14 | 0 |
And I press "Save changes"
Then I should see "The default grade letters are currently overridden."
And the following should exist in the "grade-letters-view" table:
| Highest | Lowest | Letter |
| 100.00 % | 93.00 % | A |
| 92.99 % | 90.00 % | A- |
| 89.99 % | 87.00 % | B+ |
| 86.99 % | 83.00 % | B |
| 82.99 % | 80.00 % | B- |
| 79.99 % | 77.00 % | C+ |
| 76.99 % | 73.00 % | C |
| 72.99 % | 70.00 % | C- |
| 69.99 % | 67.00 % | D+ |
| 66.99 % | 60.00 % | D |
| 59.99 % | 50.00 % | E |
| 49.99 % | 40.00 % | F |
| 39.99 % | 30.00 % | G |
| 29.99 % | 0.00 % | U |
Scenario: I delete a grade letter
Given I set the following fields to these values:
| override | 1 |
| Override site defaults | 1 |
| Grade letter 1 | A |
| gradeboundary1 | 90 |
| Letter grade boundary 1| 90 |
| Grade letter 2 | B |
| gradeboundary2 | 80 |
| Letter grade boundary 2| 80 |
| Grade letter 3 | C |
| gradeboundary3 | 50 |
| Letter grade boundary 3| 50 |
| Grade letter 4 | D |
| gradeboundary4 | 40 |
| Letter grade boundary 4| 40 |
| Grade letter 5 | E |
| gradeboundary5 | 20 |
| Letter grade boundary 5| 20 |
| Grade letter 6 | F |
| gradeboundary6 | 0 |
| Letter grade boundary 6| 0 |
| Grade letter 7 | |
| gradeboundary7 | |
| Letter grade boundary 7| |
| Grade letter 8 | |
| gradeboundary8 | |
| Letter grade boundary 8| |
| Grade letter 9 | |
| gradeboundary9 | |
| Letter grade boundary 9| |
| Grade letter 10 | |
| gradeboundary10 | |
| Letter grade boundary 10| |
| Grade letter 11 | |
| gradeboundary11 | |
| Grade letter 12 | |
| gradeboundary12 | |
| Grade letter 13 | |
| gradeboundary13 | |
| Grade letter 14 | |
| gradeboundary14 | |
| Letter grade boundary 11| |
And I press "Save changes"
And I should see "The default grade letters are currently overridden."
And the following should exist in the "grade-letters-view" table:
@ -153,19 +172,19 @@ Feature: Grade letters can be overridden
| 19.99 % | 0.00 % | F |
When I click on "Edit" "button"
And I set the following fields to these values:
| override | 1 |
| Override site defaults | 1 |
| Grade letter 1 | A |
| gradeboundary1 | 90 |
| Letter grade boundary 1| 90 |
| Grade letter 2 | B |
| gradeboundary2 | 80 |
| Letter grade boundary 2| 80 |
| Grade letter 3 | C |
| gradeboundary3 | 50 |
| Letter grade boundary 3| 50 |
| Grade letter 4 | D |
| gradeboundary4 | 40 |
| Letter grade boundary 4| 40 |
| Grade letter 5 | |
| gradeboundary5 | |
| Letter grade boundary 5| |
| Grade letter 6 | F |
| gradeboundary6 | 0 |
| Letter grade boundary 6| 0 |
And I press "Save changes"
Then I should see "The default grade letters are currently overridden."
And the following should exist in the "grade-letters-view" table:
@ -178,35 +197,29 @@ Feature: Grade letters can be overridden
Scenario: I override grade letters for a second time
Given I set the following fields to these values:
| override | 1 |
| Override site defaults | 1 |
| Grade letter 1 | A+ |
| gradeboundary1 | 90 |
| Letter grade boundary 1| 90 |
| Grade letter 2 | A |
| gradeboundary2 | 80 |
| Letter grade boundary 2| 80 |
| Grade letter 3 | B+ |
| gradeboundary3 | 70 |
| Letter grade boundary 3| 70 |
| Grade letter 4 | B |
| gradeboundary4 | 60 |
| Letter grade boundary 4| 60 |
| Grade letter 5 | C |
| gradeboundary5 | 50 |
| Letter grade boundary 5| 50 |
| Grade letter 6 | D |
| gradeboundary6 | 40 |
| Letter grade boundary 6| 40 |
| Grade letter 7 | F |
| gradeboundary7 | 0 |
| Letter grade boundary 7| 0 |
| Grade letter 8 | |
| gradeboundary8 | |
| Letter grade boundary 8| |
| Grade letter 9 | |
| gradeboundary9 | |
| Letter grade boundary 9| |
| Grade letter 10 | |
| gradeboundary10 | |
| Letter grade boundary 10| |
| Grade letter 11 | |
| gradeboundary11 | |
| Grade letter 12 | |
| gradeboundary12 | |
| Grade letter 13 | |
| gradeboundary13 | |
| Grade letter 14 | |
| gradeboundary14 | |
| Letter grade boundary 11| |
And I press "Save changes"
And I should see "The default grade letters are currently overridden."
And the following should exist in the "grade-letters-view" table:
@ -220,21 +233,21 @@ Feature: Grade letters can be overridden
| 39.99 % | 0.00 % | F |
When I click on "Edit" "button"
And I set the following fields to these values:
| override | 1 |
| Override site defaults | 1 |
| Grade letter 1 | α |
| gradeboundary1 | 95 |
| Letter grade boundary 1| 95 |
| Grade letter 2 | β |
| gradeboundary2 | 85 |
| Letter grade boundary 2| 85 |
| Grade letter 3 | γ |
| gradeboundary3 | 70 |
| Letter grade boundary 3| 70 |
| Grade letter 4 | δ |
| gradeboundary4 | 55 |
| Letter grade boundary 4| 55 |
| Grade letter 5 | |
| gradeboundary5 | |
| Letter grade boundary 5| |
| Grade letter 6 | Ω |
| gradeboundary6 | 0 |
| Letter grade boundary 6| 0 |
| Grade letter 7 | π |
| gradeboundary7 | 90 |
| Letter grade boundary 7| 90 |
And I press "Save changes"
Then I should see "The default grade letters are currently overridden."
And the following should exist in the "grade-letters-view" table: