diff --git a/admin/settings/grades.php b/admin/settings/grades.php index 05ea2f682d8..fa7b765948e 100644 --- a/admin/settings/grades.php +++ b/admin/settings/grades.php @@ -31,11 +31,20 @@ if (has_capability('moodle/grade:manage', $systemcontext) // enable publishing in exports/imports $temp->add(new admin_setting_configcheckbox('gradepublishing', get_string('gradepublishing', 'grades'), get_string('configgradepublishing', 'grades'), 0)); + $display_types = array(GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'), + GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'), + GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades'), + GRADE_DISPLAY_TYPE_REAL_PERCENTAGE => get_string('realpercentage', 'grades'), + GRADE_DISPLAY_TYPE_REAL_LETTER => get_string('realletter', 'grades'), + GRADE_DISPLAY_TYPE_LETTER_REAL => get_string('letterreal', 'grades'), + GRADE_DISPLAY_TYPE_LETTER_PERCENTAGE => get_string('letterpercentage', 'grades'), + GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER => get_string('percentageletter', 'grades'), + GRADE_DISPLAY_TYPE_PERCENTAGE_REAL => get_string('percentagereal', 'grades') + ); + asort($display_types); + $temp->add(new admin_setting_configselect('grade_export_displaytype', get_string('gradeexportdisplaytype', 'grades'), - get_string('configgradeexportdisplaytype', 'grades'), GRADE_DISPLAY_TYPE_REAL, - array(GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'), - GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'), - GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades')))); + get_string('configgradeexportdisplaytype', 'grades'), GRADE_DISPLAY_TYPE_REAL, $display_types)); $temp->add(new admin_setting_configselect('grade_export_decimalpoints', get_string('gradeexportdecimalpoints', 'grades'), get_string('configexportdecimalpoints', 'grades'), 2, @@ -104,7 +113,12 @@ if (has_capability('moodle/grade:manage', $systemcontext) get_string('configgradedisplaytype', 'grades'), GRADE_DISPLAY_TYPE_REAL, array(GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'), GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'), - GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades')))); + GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades'), + GRADE_DISPLAY_TYPE_REAL_PERCENTAGE => get_string('realpercentage', 'grades'), + GRADE_DISPLAY_TYPE_REAL_LETTER => get_string('realletter', 'grades'), + GRADE_DISPLAY_TYPE_LETTER_REAL => get_string('letterreal', 'grades'), + GRADE_DISPLAY_TYPE_LETTER_PERCENTAGE => get_string('letterpercentage', 'grades'), + GRADE_DISPLAY_TYPE_PERCENTAGE_REAL => get_string('percentagereal', 'grades')))); $temp->add(new admin_setting_configselect('grade_decimalpoints', get_string('decimalpoints', 'grades'), get_string('configdecimalpoints', 'grades'), 2, diff --git a/grade/edit/tree/item_form.php b/grade/edit/tree/item_form.php index 03da5e72522..68b14744487 100644 --- a/grade/edit/tree/item_form.php +++ b/grade/edit/tree/item_form.php @@ -93,10 +93,20 @@ class edit_item_form extends moodleform { /// grade display prefs $default_gradedisplaytype = grade_get_setting($COURSE->id, 'displaytype', $CFG->grade_displaytype); - $options = array(GRADE_DISPLAY_TYPE_DEFAULT => get_string('default', 'grades'), - GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'), - GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'), - GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades')); + $options = array(GRADE_DISPLAY_TYPE_DEFAULT => get_string('default', 'grades'), + GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'), + GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'), + GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades'), + GRADE_DISPLAY_TYPE_REAL_PERCENTAGE => get_string('realpercentage', 'grades'), + GRADE_DISPLAY_TYPE_REAL_LETTER => get_string('realletter', 'grades'), + GRADE_DISPLAY_TYPE_LETTER_REAL => get_string('letterreal', 'grades'), + GRADE_DISPLAY_TYPE_LETTER_PERCENTAGE => get_string('letterpercentage', 'grades'), + GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER => get_string('percentageletter', 'grades'), + GRADE_DISPLAY_TYPE_PERCENTAGE_REAL => get_string('percentagereal', 'grades') + ); + + asort($options); + foreach ($options as $key=>$option) { if ($key == $default_gradedisplaytype) { $options[GRADE_DISPLAY_TYPE_DEFAULT] = get_string('defaultprev', 'grades', $option); diff --git a/lang/en_utf8/grades.php b/lang/en_utf8/grades.php index 35d1b2a6162..09a11ef5407 100644 --- a/lang/en_utf8/grades.php +++ b/lang/en_utf8/grades.php @@ -300,6 +300,8 @@ $string['lessthanmin'] = 'The grade entered for $a->itemname for $a->username is $string['lettergrade'] = 'Letter grade'; $string['lettergradenonnumber'] = 'Low and/or High grade were non-numeric for'; $string['letter'] = 'Letter'; +$string['letterpercentage'] = 'Letter (percentage)'; +$string['letterreal'] = 'Letter (real)'; $string['letters'] = 'Letters'; $string['linkedactivity'] = 'Linked activity'; $string['linkedactivityhelp'] = 'Specifies an optional activity to which this outcome item is linked. This is used to measure student performance on criteria not assessed by the activity grade.'; @@ -391,6 +393,8 @@ $string['parentcategory'] = 'Parent category'; $string['pctoftotalgrade'] = '%% of total grade'; $string['percent'] = 'Percent'; $string['percentage'] = 'Percentage'; +$string['percentageletter'] = 'Percentage (letter)'; +$string['percentagereal'] = 'Percentage (real)'; $string['percentascending'] = 'Sort by percent ascending'; $string['percentdescending'] = 'Sort by percent descending'; $string['percentshort'] = '%%'; @@ -417,6 +421,8 @@ $string['rangesdisplaytype'] = 'Range display type'; $string['rank'] = 'Rank'; $string['rawpct'] = 'Raw %%'; $string['real'] = 'Real'; +$string['realletter'] = 'Real (letter)'; +$string['realpercentage'] = 'Real (percentage)'; $string['regradeanyway'] = 'Regrade anyway'; $string['removeallcoursegrades'] = 'Delete all grades'; $string['removeallcourseitems'] = 'Delete all items and categories'; diff --git a/lib/grade/constants.php b/lib/grade/constants.php index 6852a1e5d4c..fd84192f66a 100644 --- a/lib/grade/constants.php +++ b/lib/grade/constants.php @@ -66,6 +66,12 @@ define('GRADE_DISPLAY_TYPE_DEFAULT', 0); define('GRADE_DISPLAY_TYPE_REAL', 1); define('GRADE_DISPLAY_TYPE_PERCENTAGE', 2); define('GRADE_DISPLAY_TYPE_LETTER', 3); +define('GRADE_DISPLAY_TYPE_REAL_PERCENTAGE', 12); +define('GRADE_DISPLAY_TYPE_REAL_LETTER', 13); +define('GRADE_DISPLAY_TYPE_LETTER_REAL', 31); +define('GRADE_DISPLAY_TYPE_LETTER_PERCENTAGE', 32); +define('GRADE_DISPLAY_TYPE_PERCENTAGE_LETTER', 23); +define('GRADE_DISPLAY_TYPE_PERCENTAGE_REAL', 21); define('GRADE_REPORT_AGGREGATION_POSITION_FIRST', 0); define('GRADE_REPORT_AGGREGATION_POSITION_LAST', 1); diff --git a/lib/gradelib.php b/lib/gradelib.php index 49dc2178127..e88540b7b29 100644 --- a/lib/gradelib.php +++ b/lib/gradelib.php @@ -664,48 +664,84 @@ function grade_format_gradevalue($value, &$grade_item, $localized=true, $display switch ($displaytype) { case GRADE_DISPLAY_TYPE_REAL: - if ($grade_item->gradetype == GRADE_TYPE_SCALE) { - if (!$scale = $grade_item->load_scale()) { - return get_string('error'); - } - - $value = (int)bounded_number($grade_item->grademin, $value, $grade_item->grademax); - return format_string($scale->scale_items[$value-1]); - - } else { - return format_float($value, $decimals, $localized); - } + return grade_format_gradevalue_real($value, $grade_item, $decimals, $localized); case GRADE_DISPLAY_TYPE_PERCENTAGE: - $min = $grade_item->grademin; - $max = $grade_item->grademax; - if ($min == $max) { - return ''; - } - $value = bounded_number($min, $value, $max); - $percentage = (($value-$min)*100)/($max-$min); - return format_float($percentage, $decimals, $localized).' %'; + return grade_format_gradevalue_percentage($value, $grade_item, $decimals, $localized); case GRADE_DISPLAY_TYPE_LETTER: - $context = get_context_instance(CONTEXT_COURSE, $grade_item->courseid); - if (!$letters = grade_get_letters($context)) { - return ''; // no letters?? - } + return 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 - foreach ($letters as $boundary => $letter) { - if ($value >= $boundary) { - return format_string($letter); - } - } - return '-'; // no match? maybe '' would be more correct + case GRADE_DISPLAY_TYPE_REAL_PERCENTAGE: + return grade_format_gradevalue_real($value, $grade_item, $decimals, $localized) . ' (' . + grade_format_gradevalue_percentage($value, $grade_item, $decimals, $localized) . ')'; + case GRADE_DISPLAY_TYPE_REAL_LETTER: + return grade_format_gradevalue_real($value, $grade_item, $decimals, $localized) . ' (' . + grade_format_gradevalue_letter($value, $grade_item) . ')'; + + 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) . ' (' . + grade_format_gradevalue_real($value, $grade_item, $decimals, $localized) . ')'; + + case GRADE_DISPLAY_TYPE_LETTER_PERCENTAGE: + return grade_format_gradevalue_letter($value, $grade_item) . ' (' . + 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) . ')'; default: return ''; } } +function grade_format_gradevalue_real($value, $grade_item, $decimals, $localized) { + if ($grade_item->gradetype == GRADE_TYPE_SCALE) { + if (!$scale = $grade_item->load_scale()) { + return get_string('error'); + } + + $value = (int)bounded_number($grade_item->grademin, $value, $grade_item->grademax); + return format_string($scale->scale_items[$value-1]); + + } else { + return format_float($value, $decimals, $localized); + } +} + +function grade_format_gradevalue_percentage($value, $grade_item, $decimals, $localized) { + $min = $grade_item->grademin; + $max = $grade_item->grademax; + if ($min == $max) { + return ''; + } + $value = bounded_number($min, $value, $max); + $percentage = (($value-$min)*100)/($max-$min); + return format_float($percentage, $decimals, $localized).' %'; +} + +function grade_format_gradevalue_letter($value, $grade_item) { + $context = get_context_instance(CONTEXT_COURSE, $grade_item->courseid); + if (!$letters = grade_get_letters($context)) { + return ''; // no letters?? + } + + $value = grade_grade::standardise_score($value, $grade_item->grademin, $grade_item->grademax, 0, 100); + $value = bounded_number(0, $value, 100); // just in case + foreach ($letters as $boundary => $letter) { + if ($value >= $boundary) { + return format_string($letter); + } + } + return '-'; // no match? maybe '' would be more correct +} + + /** * Returns grade options for gradebook category menu * @param int $courseid