From 2b5ceeba2b83582531cf769f8633b87748af8d54 Mon Sep 17 00:00:00 2001 From: Queenie Ma Date: Fri, 6 Mar 2015 13:16:16 -0800 Subject: [PATCH] CCLE-5076 - Reimplement core edit "CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook" * Cherry-picked changes from CCLE-4458 core edit * Kept Moodle changes to grade/edit/letter/index.php from MDL-39692 --- admin/settings/grades.php | 32 ++++++++++++++- grade/edit/letter/edit_form.php | 89 +++++++++++++++++++++++++++++++++++++---- lang/en/grades.php | 9 +++++ lib/gradelib.php | 37 ++++++++++++++--- 4 files changed, 153 insertions(+), 14 deletions(-) diff --git a/admin/settings/grades.php b/admin/settings/grades.php index ff0697d..831b9e4 100644 --- a/admin/settings/grades.php +++ b/admin/settings/grades.php @@ -181,8 +181,38 @@ if ((has_capability('moodle/grade:manage', $systemcontext) $outcomes = new admin_externalpage('outcomes', new lang_string('outcomes', 'grades'), $CFG->wwwroot.'/grade/edit/outcome/index.php', 'moodle/grade:manage'); $ADMIN->add('grades', $outcomes); } - $letters = new admin_externalpage('letters', new lang_string('letters', 'grades'), $CFG->wwwroot.'/grade/edit/letter/index.php', 'moodle/grade:manageletters'); + + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + // $letters = new admin_externalpage('letters', new lang_string('letters', 'grades'), $CFG->wwwroot.'/grade/edit/letter/index.php', 'moodle/grade:manageletters'); + // $ADMIN->add('grades', $letters); + + $letters_str = new lang_string('letters', 'grades'); + $letters_base = $CFG->wwwroot.'/grade/edit/letter'; + $letters = new admin_externalpage('letters', $letters_str, $letters_base . '/index.php', 'moodle/grade:manageletters'); + $ADMIN->add('grades', $letters); + + $letters_settings_str = new lang_string('letter', 'grades') . ' ' . new lang_string('edit') . ' ' . new lang_string('settings'); + $temp = new admin_settingpage('letterssettings', $letters_settings_str, 'moodle/grade:manageletters'); + if ($ADMIN->fulltree) { + $temp->add(new admin_setting_configcheckbox('grade_letters_custom', + new lang_string('letterscustompercents', 'grades'), new lang_string('letterscustompercents_help', 'grades'), 0)); + + $temp->add(new admin_setting_configcheckbox('grade_letters_strict', + new lang_string('lettersstrictletter', 'grades'), new lang_string('lettersstrictletter_help', 'grades'), 0)); + + $params = array('courseid' => 0); + + $db_scales = $DB->get_records_menu('scale', $params, '', 'id, name'); + + $scales = array(0 => new lang_string('lettersdefaultletters', 'grades')) + $db_scales; + + $temp->add(new admin_setting_configselect('grade_letters_names', + new lang_string('lettersnames', 'grades'), + new lang_string('lettersname_help', 'grades'), 0, $scales)); + } + $ADMIN->add('grades', $temp); + // END UCLA MOD: CCLE-4458 // The plugins must implement a settings.php file that adds their admin settings to the $settings object diff --git a/grade/edit/letter/edit_form.php b/grade/edit/letter/edit_form.php index baa4087..b047e70 100644 --- a/grade/edit/letter/edit_form.php +++ b/grade/edit/letter/edit_form.php @@ -31,6 +31,10 @@ require_once $CFG->libdir.'/formslib.php'; class edit_letter_form extends moodleform { public function definition() { + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + global $DB; + // END UCLA MOD: CCLE-4458 + $mform =& $this->_form; $num = $this->_customdata['num']; $admin = $this->_customdata['admin']; @@ -46,16 +50,70 @@ class edit_letter_form extends moodleform { $gradeletter = get_string('gradeletter', 'grades'); $gradeboundary = get_string('gradeboundary', 'grades'); - $percentages = array(-1 => get_string('unused', 'grades')); + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + //$percentages = array(-1 => get_string('unused', 'grades')); + //for ($i=100; $i > -1; $i--) { + // $percentages[$i] = "$i %"; + //} + // + //for($i=1; $i<$num+1; $i++) { + // $gradelettername = 'gradeletter'.$i; + // $gradeboundaryname = 'gradeboundary'.$i; + // + // $mform->addElement('text', $gradelettername, $gradeletter." $i"); + // if ($i == 1) { + // $mform->addHelpButton($gradelettername, 'gradeletter', 'grades'); + // } + // $mform->setType($gradelettername, PARAM_TEXT); + // + // if (!$admin) { + // $mform->disabledIf($gradelettername, 'override', 'notchecked'); + // $mform->disabledIf($gradelettername, $gradeboundaryname, 'eq', -1); + // } + // + // $mform->addElement('select', $gradeboundaryname, $gradeboundary." $i", $percentages); + // if ($i == 1) { + // $mform->addHelpButton($gradeboundaryname, 'gradeboundary', 'grades'); + // } + // $mform->setDefault($gradeboundaryname, -1); + // $mform->setType($gradeboundaryname, PARAM_INT); + // + // if (!$admin) { + // $mform->disabledIf($gradeboundaryname, 'override', 'notchecked'); + // } + //} + $unused_str = get_string('unused', 'grades'); + + $percentages = array(-1 => $unused_str); for ($i=100; $i > -1; $i--) { $percentages[$i] = "$i %"; } + $custom = get_config('moodle', 'grade_letters_custom'); + $strict = get_config('moodle', 'grade_letters_strict'); + + $default = get_config('moodle', 'grade_letters_names'); + + if ($default and $scale = $DB->get_record('scale', array('id' => $default))) { + $default_letters = $scale->scale; + } else { + $default_letters = get_string('lettersdefaultletters', 'grades'); + } + + $default_letters = array_reverse(explode(',', $default_letters)); + $letters = array('' => get_string('unused', 'grades')) + + array_combine($default_letters, $default_letters); + for($i=1; $i<$num+1; $i++) { $gradelettername = 'gradeletter'.$i; $gradeboundaryname = 'gradeboundary'.$i; - $mform->addElement('text', $gradelettername, $gradeletter." $i"); + if ($strict) { + $mform->addElement('select', $gradelettername, $gradeletter." $i", $letters); + } else { + $mform->addElement('text', $gradelettername, $gradeletter." $i"); + } + if ($i == 1) { $mform->addHelpButton($gradelettername, 'gradeletter', 'grades'); } @@ -63,21 +121,38 @@ class edit_letter_form extends moodleform { if (!$admin) { $mform->disabledIf($gradelettername, 'override', 'notchecked'); - $mform->disabledIf($gradelettername, $gradeboundaryname, 'eq', -1); + + if ($custom) { + $mform->disabledIf($gradeboundaryname, $gradelettername, 'eq', ''); + } else { + $mform->disabledIf($gradelettername, $gradeboundaryname, 'eq', -1); + } + } + + if ($custom) { + $mform->addElement('text', $gradeboundaryname, $gradeboundary." $i"); + + $mform->addRule($gradeboundaryname, null, 'numeric', '', 'client'); + + $mform->setType($gradeboundaryname, PARAM_FLOAT); + $mform->setDefault($gradeboundaryname, ''); + } else { + $mform->addElement('select', $gradeboundaryname, $gradeboundary." $i", $percentages); + + $mform->setType($gradeboundaryname, PARAM_INT); + $mform->setDefault($gradeboundaryname, -1); } - $mform->addElement('select', $gradeboundaryname, $gradeboundary." $i", $percentages); if ($i == 1) { $mform->addHelpButton($gradeboundaryname, 'gradeboundary', 'grades'); } - $mform->setDefault($gradeboundaryname, -1); - $mform->setType($gradeboundaryname, PARAM_INT); if (!$admin) { $mform->disabledIf($gradeboundaryname, 'override', 'notchecked'); } } - + // END UCLA MOD: CCLE-4458 + // hidden params $mform->addElement('hidden', 'id'); $mform->setType('id', PARAM_INT); diff --git a/lang/en/grades.php b/lang/en/grades.php index ddee89d..a638e95 100644 --- a/lang/en/grades.php +++ b/lang/en/grades.php @@ -710,3 +710,12 @@ $string['writinggradebookinfo'] = 'Writing gradebook settings'; $string['xml'] = 'XML'; $string['yes'] = 'Yes'; $string['yourgrade'] = 'Your grade'; + +$string['letterscustompercents'] = 'Custom Percentages'; +$string['letterscustompercents_help'] = 'Allows for users to enter a value for the percents.'; +$string['lettersdefaultletters'] = 'F,D,C,B,A'; +$string['lettersstrictletter'] = 'Strict Letter names'; +$string['lettersstrictletter_help'] = 'This setting forces the default letter names defined with the selected Letter names.'; +$string['lettersnames'] = 'Letter names'; +$string['lettersname_help'] = 'This setting forces the default letter names defined with this system scale. __Note__: The default letter names are A-F.'; +// END UCLA MOD: CCLE-4458 diff --git a/lib/gradelib.php b/lib/gradelib.php index d1bb710..e53ab6d 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -699,7 +699,10 @@ function grade_format_gradevalue($value, &$grade_item, $localized=true, $display return grade_format_gradevalue_percentage($value, $grade_item, $decimals, $localized); case GRADE_DISPLAY_TYPE_LETTER: - return grade_format_gradevalue_letter($value, $grade_item); + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + //return grade_format_gradevalue_letter($value, $grade_item); + return grade_format_gradevalue_letter($value, $grade_item, $decimals, $localized); + // END UCLA MOD: CCLE-4458 case GRADE_DISPLAY_TYPE_REAL_PERCENTAGE: return grade_format_gradevalue_real($value, $grade_item, $decimals, $localized) . ' (' . @@ -707,23 +710,35 @@ function grade_format_gradevalue($value, &$grade_item, $localized=true, $display case GRADE_DISPLAY_TYPE_REAL_LETTER: return grade_format_gradevalue_real($value, $grade_item, $decimals, $localized) . ' (' . - grade_format_gradevalue_letter($value, $grade_item) . ')'; + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + // grade_format_gradevalue_letter($value, $grade_item) . ')'; + grade_format_gradevalue_letter($value, $grade_item, $decimals, $localized) . ')'; + // END UCLA MOD: CCLE-4458 case GRADE_DISPLAY_TYPE_PERCENTAGE_REAL: return grade_format_gradevalue_percentage($value, $grade_item, $decimals, $localized) . ' (' . grade_format_gradevalue_real($value, $grade_item, $decimals, $localized) . ')'; case GRADE_DISPLAY_TYPE_LETTER_REAL: - return grade_format_gradevalue_letter($value, $grade_item) . ' (' . + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + //return grade_format_gradevalue_letter($value, $grade_item) . ' (' . + return grade_format_gradevalue_letter($value, $grade_item, $decimals, $localized) . ' (' . + // END UCLA MOD: CCLE-4458 grade_format_gradevalue_real($value, $grade_item, $decimals, $localized) . ')'; case GRADE_DISPLAY_TYPE_LETTER_PERCENTAGE: - return grade_format_gradevalue_letter($value, $grade_item) . ' (' . + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + //return grade_format_gradevalue_letter($value, $grade_item) . ' (' . + return grade_format_gradevalue_letter($value, $grade_item, $decimals, $localized) . ' (' . + // END UCLA MOD: CCLE-4458 grade_format_gradevalue_percentage($value, $grade_item, $decimals, $localized) . ')'; case GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER: return grade_format_gradevalue_percentage($value, $grade_item, $decimals, $localized) . ' (' . - grade_format_gradevalue_letter($value, $grade_item) . ')'; + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + // grade_format_gradevalue_letter($value, $grade_item) . ')'; + grade_format_gradevalue_letter($value, $grade_item, $decimals, $localized) . ')'; + // END UCLA MOD: CCLE-4458 default: return ''; } @@ -780,7 +795,12 @@ function grade_format_gradevalue_percentage($value, $grade_item, $decimals, $loc * @param object $grade_item Grade item object * @return string */ -function grade_format_gradevalue_letter($value, $grade_item) { + +// START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook +//function grade_format_gradevalue_letter($value, $grade_item) { +function grade_format_gradevalue_letter($value, $grade_item, $decimals, $localized) { +// END UCLA MOD: CCLE-4458 + $context = context_course::instance($grade_item->courseid, IGNORE_MISSING); if (!$letters = grade_get_letters($context)) { return ''; // no letters?? @@ -792,6 +812,11 @@ function grade_format_gradevalue_letter($value, $grade_item) { $value = grade_grade::standardise_score($value, $grade_item->grademin, $grade_item->grademax, 0, 100); $value = bounded_number(0, $value, 100); // just in case + + // START UCLA MOD: CCLE-4458 - Letter grade range mismatch with calculated grade in Gradebook + $value = format_float($value, $decimals, $localized); + // END UCLA MOD: CCLE-4458 + foreach ($letters as $boundary => $letter) { if ($value >= $boundary) { return format_string($letter); -- 2.2.1