MDL-11495 grade letter setting improvements:
authorskodak <skodak>
Fri, 28 Sep 2007 20:12:43 +0000 (20:12 +0000)
committerskodak <skodak>
Fri, 28 Sep 2007 20:12:43 +0000 (20:12 +0000)
* in_null for decimals defaults checks
* store letter settings only in database - no cfg settings
* separate configuration page for letters only - pluginselector+admin tree
* new capability to manage grade letters - similar to scales and outcomes
* added grade_letters db index
* grade letters related minor bugfixing

15 files changed:
admin/settings/grades.php
grade/edit/gradedisplay/gradedisplay_form.php [deleted file]
grade/edit/gradedisplay/index.php [deleted file]
grade/edit/letter/edit.php [new file with mode: 0644]
grade/edit/letter/edit_form.php [new file with mode: 0644]
grade/edit/letter/index.php [new file with mode: 0644]
grade/edit/letter/tabs.php [new file with mode: 0644]
grade/lib.php
grade/report/grader/settings.php
grade/report/lib.php
lib/db/access.php
lib/db/install.xml
lib/db/upgrade.php
lib/gradelib.php
version.php

index 689528c..0859c75 100644 (file)
@@ -18,6 +18,8 @@ $scales = new admin_externalpage('scales', get_string('scales'), $CFG->wwwroot.'
 $ADMIN->add('grades', $scales);
 $outcomes = new admin_externalpage('outcomes', get_string('outcomes', 'grades'), $CFG->wwwroot.'/grade/edit/outcome/index.php', 'moodle/grade:manage');
 $ADMIN->add('grades', $outcomes);
+$letters = new admin_externalpage('letters', get_string('letters', 'grades'), $CFG->wwwroot.'/grade/edit/letter/edit.php', 'moodle/grade:manageletters');
+$ADMIN->add('grades', $letters);
 
 /// Grade category settings
 require_once $CFG->libdir . '/grade/constants.php';
diff --git a/grade/edit/gradedisplay/gradedisplay_form.php b/grade/edit/gradedisplay/gradedisplay_form.php
deleted file mode 100644 (file)
index ab33261..0000000
+++ /dev/null
@@ -1,129 +0,0 @@
-<?php  //$Id$
-
-require_once $CFG->libdir.'/formslib.php';
-
-class edit_grade_display_form extends moodleform {
-
-    function definition() {
-        global $CFG, $COURSE;
-
-        $mform =& $this->_form;
-        $context = get_context_instance(CONTEXT_COURSE, $COURSE->id);
-        $course_has_letters = $this->_customdata['course_has_letters'];
-        $coursegradedisplaytype = get_field('grade_items', 'display', 'courseid', $COURSE->id, 'itemtype', 'course');
-        $coursegradedecimals    = get_field('grade_items', 'decimals', 'courseid', $COURSE->id, 'itemtype', 'course');
-
-        $mform->addElement('header', 'coursesettings', get_string('coursesettings', 'grades'));
-
-        $gradedisplaytypes = array(GRADE_DISPLAY_TYPE_DEFAULT => get_string('default'),
-                                   GRADE_DISPLAY_TYPE_REAL => get_string('real', 'grades'),
-                                   GRADE_DISPLAY_TYPE_PERCENTAGE => get_string('percentage', 'grades'),
-                                   GRADE_DISPLAY_TYPE_LETTER => get_string('letter', 'grades'));
-        $label = get_string('coursegradedisplaytype', 'grades') . ' (' . get_string('default', 'grades') . ': '
-                . $gradedisplaytypes[$CFG->grade_report_gradedisplaytype] . ')';
-        $mform->addElement('select', 'display', $label, $gradedisplaytypes);
-        $mform->setHelpButton('display', array(false, get_string('coursegradedisplaytype', 'grades'),
-                false, true, false, get_string('configcoursegradedisplaytype', 'grades')));
-        $mform->setDefault('display', $coursegradedisplaytype);
-        $mform->setType($coursegradedisplaytype, PARAM_INT);
-
-        $options = array(-1=>get_string('default', 'grades'), 0, 1, 2, 3, 4, 5);
-        $label = get_string('decimalpoints', 'grades') . ' (' . get_string('default', 'grades') . ': ' . $options[$CFG->grade_report_decimalpoints] . ')';
-        $mform->addElement('select', 'decimals', $label, $options);
-        $mform->setHelpButton('decimals', array(false, get_string('decimalpoints', 'grades'), false, true, false, get_string("configdecimalpoints", 'grades')));
-        $mform->setDefault('decimals', $coursegradedecimals);
-
-        // Disable decimals if displaytype is not REAL or PERCENTAGE
-        $mform->disabledIf('decimals', 'display', "eq", GRADE_DISPLAY_TYPE_LETTER);
-
-        $course_set_to_letters  = $coursegradedisplaytype == GRADE_DISPLAY_TYPE_LETTER;
-        $course_set_to_default  = $coursegradedisplaytype == GRADE_DISPLAY_TYPE_DEFAULT;
-        $site_set_to_letters = $CFG->grade_report_gradedisplaytype == GRADE_DISPLAY_TYPE_LETTER;
-
-        // Disable decimals if course displaytype is DEFAULT and site displaytype is LETTER
-        if ($site_set_to_letters) {
-            $mform->disabledIf('decimals', 'display', "eq", GRADE_DISPLAY_TYPE_DEFAULT);
-        }
-
-        if ($course_set_to_letters || ($course_set_to_default && $site_set_to_letters)) {
-
-            $mform->addElement('header', 'gradeletters', get_string('gradeletters', 'grades'));
-            $percentages = array(null => get_string('unused', 'grades'));
-
-            $mform->addElement('checkbox', 'override', get_string('overridesitedefaultgradedisplaytype', 'grades'));
-            $mform->setHelpButton('override', array(false, get_string('overridesitedefaultgradedisplaytype', 'grades'),
-                    false, true, false, get_string('overridesitedefaultgradedisplaytypehelp', 'grades')));
-            $mform->setDefault('override', $course_has_letters);
-
-            for ($i=100; $i > -1; $i--) {
-                $percentages[$i] = "$i%";
-            }
-
-            $elementsarray = array();
-
-            // Get course letters if they exist
-            if ($letters = get_records('grade_letters', 'contextid', $context->id, 'lowerboundary DESC')) {
-                $i = 1;
-                foreach ($letters as $letter) {
-                    $elementsarray[$i]['letter'] = $letter->letter;
-                    $elementsarray[$i]['boundary'] = $letter->lowerboundary;
-                    $i++;
-                }
-            } else { // Get site default for each letter
-                for ($i = 1; $i <= 10; $i++) {
-                    $elementsarray[$i]['letter'] = $CFG->{'grade_report_gradeletter'.$i};
-                    $elementsarray[$i]['boundary'] = $CFG->{'grade_report_gradeboundary'.$i};
-                }
-            }
-
-            foreach ($elementsarray as $i => $element) {
-                $letter = $element['letter'];
-                $boundary = $element['boundary'];
-
-                $gradelettername = 'gradeletter' . $i;
-                $gradeletterstring = get_string('gradeletter', 'grades') . " $i";
-                $gradeletterhelp = get_string('configgradeletter', 'grades');
-
-                $gradeboundaryname = 'gradeboundary' . $i;
-                $gradeboundarystring = get_string('gradeboundary', 'grades') . " $i";
-                $gradeboundaryhelp = get_string('configgradeboundary', 'grades');
-
-                $mform->addElement('text', $gradelettername, $gradeletterstring);
-                $mform->setHelpButton($gradelettername, array(false, $gradeletterstring, false, true, false, $gradeletterhelp));
-                $mform->setDefault($gradelettername, $letter);
-                $mform->setType($gradelettername, PARAM_RAW);
-                $mform->disabledIf($gradelettername, 'override');
-
-                $mform->addElement('select', $gradeboundaryname, $gradeboundarystring, $percentages);
-                $mform->setHelpButton($gradeboundaryname, array(false, $gradeboundarystring, false, true, false, $gradeboundaryhelp));
-                $mform->setDefault($gradeboundaryname, $boundary);
-                $mform->setType($gradeboundaryname, PARAM_ALPHANUM);
-                $mform->disabledIf($gradeboundaryname, 'override');
-            }
-
-            $mform->addElement('submit', 'addgradeletter', get_string('addgradeletter', 'grades'));
-            $mform->disabledIf('addgradeletter', 'override');
-        }
-
-        // hidden params
-        $mform->addElement('hidden', 'id', $COURSE->id);
-        $mform->setType('id', PARAM_INT);
-
-/// add return tracking info
-        $gpr = $this->_customdata['gpr'];
-        $gpr->add_mform_elements($mform);
-
-//-------------------------------------------------------------------------------
-        // buttons
-        $this->add_action_buttons();
-    }
-
-    function definition_after_data() {
-        global $CFG, $COURSE;
-
-        $context = get_context_instance(CONTEXT_COURSE, $COURSE->id);
-
-    }
-}
-
-?>
diff --git a/grade/edit/gradedisplay/index.php b/grade/edit/gradedisplay/index.php
deleted file mode 100644 (file)
index a06cc8c..0000000
+++ /dev/null
@@ -1,141 +0,0 @@
-<?php // $Id$
-      // Allows a creator to edit custom scales, and also display help about scales
-
-require_once '../../../config.php';
-require_once $CFG->dirroot.'/grade/lib.php';
-require_once $CFG->libdir.'/gradelib.php';
-require_once $CFG->dirroot.'/grade/report/lib.php';
-require_once 'gradedisplay_form.php';
-
-$courseid   = optional_param('id', 0, PARAM_INT);
-$addgradeletter = optional_param('addgradeletter', null, PARAM_ALPHANUM);
-
-/// Make sure they can even access this course
-if ($courseid) {
-    if (!$course = get_record('course', 'id', $courseid)) {
-        print_error('nocourseid');
-    }
-    require_login($course);
-    $context = get_context_instance(CONTEXT_COURSE, $course->id);
-    require_capability('moodle/course:managescales', $context);
-} else {
-    require_once $CFG->libdir.'/adminlib.php';
-    admin_externalpage_setup('scales');
-}
-
-if (!empty($addgradeletter)) {
-    // Insert a record in the grade_letters table, with 0 as lower boundary and  ' - ' as letter
-    $record = new stdClass();
-    $record->contextid = $context->id;
-    $record->letter = 'A';
-    $record->lowerboundary = 0;
-    insert_record('grade_letters', $record);
-}
-
-$course_has_letters = get_field('grade_letters', 'contextid', 'contextid', $context->id);
-
-/// return tracking object
-$gpr = new grade_plugin_return(array('type'=>'edit', 'plugin'=>'gradedisplay', 'courseid'=>$courseid));
-$returnurl = $gpr->get_return_url($CFG->wwwroot.'/grade/edit/gradedisplay/index.php?id='.$course->id);
-
-$mform = new edit_grade_display_form(null, array('gpr'=>$gpr, 'course_has_letters' => $course_has_letters));
-
-if ($mform->is_cancelled()) {
-    redirect($returnurl);
-
-// form processing
-} else if ($data = $mform->get_data(false)) {
-    // Delete existing grade_letters for this contextid, whether we add, update or set the grade letters to defaults
-    if ($course_has_letters) {
-        delete_records('grade_letters', 'contextid', $context->id);
-    }
-
-    // Update course item's gradedisplay type
-    if (isset($data->display)) {
-        set_field('grade_items', 'display', $data->display, 'courseid', $courseid, 'itemtype', 'course');
-    }
-
-    // Update course item's decimals type
-    if (isset($data->decimals)) {
-        if ($data->decimals < 0) {
-            $data->decimals = null;
-        }
-        set_field('grade_items', 'decimals', $data->decimals, 'courseid', $courseid, 'itemtype', 'course');
-    }
-
-    // If override is present, add/update entries in grade_letters table
-    if (!empty($data->override)) {
-        $records = array();
-
-        // Loop through grade letters and boundaries
-        foreach ($data as $key => $variable) {
-            preg_match('/[gradeletter|gradeboundary]([0-9]{1,2})/', $key, $matches);
-            $index = null;
-            if (isset($matches[1])) {
-                $index = $matches[1];
-            }
-
-            if (strstr($key, 'gradeletter')) {
-                $records[$index] = new stdClass();
-                $records[$index]->letter = $variable;
-            } elseif (strstr($key, 'gradeboundary')) {
-                if (!empty($records[$index])) {
-                    $records[$index]->lowerboundary = $variable;
-                }
-            }
-        }
-
-        foreach ($records as $key => $record) {
-            // Do not insert if either value is empty or set to "unused"
-            $values_set = isset($record->letter) && isset($record->lowerboundary);
-
-            if ($values_set && strlen($record->letter) > 0 && strlen($record->lowerboundary) > 0) {
-                $record->contextid = $context->id;
-                if ($id = insert_record('grade_letters', $record)) {
-                    $record = new stdClass();
-                } else {
-                    debugging('Error inserting grade_letters record!');
-                    die();
-                }
-            }
-        }
-    }
-    if (!isset($data->addgradeletter)) {
-        redirect($returnurl, get_string('coursegradedisplayupdated', 'grades'));
-    }
-}
-
-$strgrades = get_string('grades');
-$pagename = get_string('gradedisplay', 'grades');
-
-$navigation = grade_build_nav(__FILE__, $pagename, array('courseid' => $courseid));
-
-$strname           = get_string('name');
-$strdelete         = get_string('delete');
-$stredit           = get_string('edit');
-$strused           = get_string('used');
-$stredit           = get_string('edit');
-
-if ($courseid) {
-    /// Print header
-    print_header_simple($strgrades.': '.$pagename, ': '.$strgrades, $navigation, '', '', true, '', navmenu($course));
-    /// Print the plugin selector at the top
-    print_grade_plugin_selector($courseid, 'edit', 'scale');
-
-} else {
-    admin_externalpage_print_header();
-}
-
-print_simple_box_start("center");
-$mform->display();
-print_simple_box_end();
-
-if ($courseid) {
-    print_footer($course);
-} else {
-    admin_externalpage_print_footer();
-}
-
-
-?>
-
diff --git a/grade/edit/letter/edit.php b/grade/edit/letter/edit.php
new file mode 100644 (file)
index 0000000..2e8a6dc
--- /dev/null
@@ -0,0 +1,125 @@
+<?php // $Id$
+
+require '../../../config.php';
+require_once $CFG->libdir.'/gradelib.php';
+require_once $CFG->dirroot.'/grade/lib.php';
+require_once 'edit_form.php';
+
+
+$contextid = optional_param('id', SYSCONTEXTID, PARAM_INT);
+
+if (!$context = get_context_instance_by_id($contextid)) {
+    error('Incorrect context id');
+}
+
+if ($context->contextlevel == CONTEXT_SYSTEM or $context->contextlevel == CONTEXT_COURSECAT) {
+    require_once $CFG->libdir.'/adminlib.php';
+    require_login();
+    admin_externalpage_setup('letters');
+    $admin = true;
+    $returnurl = "$CFG->wwwroot/$CFG->admin";
+
+
+} else if ($context->contextlevel == CONTEXT_COURSE) {
+    require_login($context->instanceid);
+    $admin = false;
+    $returnurl = $CFG->wwwroot.'/grade/edit/letter/index.php?id='.$context->instanceid;
+
+} else {
+    error('Incorrect context level');
+}
+
+require_capability('moodle/grade:manageletters', $context);
+
+$strgrades = get_string('grades');
+$pagename  = get_string('letters', 'grades');
+
+$letters = grade_get_letters($context);
+$num = count($letters) + 3;
+
+$data = new object();
+$data->id = $context->id;
+
+$i = 1;
+foreach ($letters as $boundary=>$letter) {
+    $gradelettername = 'gradeletter'.$i;
+    $gradeboundaryname = 'gradeboundary'.$i;
+
+    $data->$gradelettername   = $letter;
+    $data->$gradeboundaryname = $boundary;
+    $i++;
+}
+$data->override = record_exists('grade_letters', 'contextid', $contextid);
+
+$mform = new edit_letter_form(null, array('num'=>$num, 'admin'=>$admin));
+$mform->set_data($data);
+
+if ($mform->is_cancelled()) {
+    redirect($returnurl);
+
+} else if ($data = $mform->get_data()) {
+    if (empty($data->override)) {
+        delete_records('grade_letters', 'contextid', $context->id);
+        redirect($returnurl);
+    }
+
+    $letters = array();
+    for($i=1; $i<$num+1; $i++) {
+        $gradelettername = 'gradeletter'.$i;
+        $gradeboundaryname = 'gradeboundary'.$i;
+
+        if (array_key_exists($gradeboundaryname, $data) and $data->$gradeboundaryname != -1) {
+            $letter = trim($data->$gradelettername);
+            if ($letter == '') {
+                continue;
+            }
+            $letters[$data->$gradeboundaryname] = $letter;
+        }
+    }
+    krsort($letters, SORT_NUMERIC);
+
+    $old_ids = array();
+    if ($records = get_records('grade_letters', 'contextid', $context->id, 'lowerboundary ASC', 'id')) {
+        $old_ids = array_keys($records);
+    }
+
+    foreach($letters as $boundary=>$letter) {
+        $record = new object();
+        $record->letter        = $letter;
+        $record->lowerboundary = $boundary;
+        $record->contextid     = $context->id;
+
+        if ($old_id = array_pop($old_ids)) {
+            $record->id = $old_id;
+            update_record('grade_letters', $record);
+        } else {
+            insert_record('grade_letters', $record);
+        }
+    }
+
+    foreach($old_ids as $old_id) {
+        delete_records('grade_letters', 'id', $old_id);
+    }
+
+    redirect($returnurl);
+}
+
+
+//page header
+if ($admin) {
+    admin_externalpage_print_header();
+
+} else {
+    $navigation = grade_build_nav(__FILE__, $pagename, $COURSE->id);
+    /// Print header
+    print_header_simple($strgrades.': '.$pagename, ': '.$strgrades, $navigation, '', '', true, '', navmenu($COURSE));
+
+    $currenttab = 'lettersedit';
+    require('tabs.php');
+}
+
+$mform->display();
+
+print_footer($COURSE);
+?>
+
diff --git a/grade/edit/letter/edit_form.php b/grade/edit/letter/edit_form.php
new file mode 100644 (file)
index 0000000..fdfeac9
--- /dev/null
@@ -0,0 +1,56 @@
+<?php  //$Id$
+
+require_once $CFG->libdir.'/formslib.php';
+
+class edit_letter_form extends moodleform {
+
+    function definition() {
+        $mform =& $this->_form;
+        $num   = $this->_customdata['num'];
+        $admin = $this->_customdata['admin'];
+
+        $mform->addElement('header', 'gradeletters', get_string('gradeletters', 'grades'));
+
+        $mform->addElement('checkbox', 'override', get_string('overridesitedefaultgradedisplaytype', 'grades'));
+        $mform->setHelpButton('override', array(false, get_string('overridesitedefaultgradedisplaytype', 'grades'),
+                false, true, false, get_string('overridesitedefaultgradedisplaytypehelp', 'grades')));
+
+        $gradeletterhelp   = get_string('configgradeletter', 'grades');
+        $gradeboundaryhelp = get_string('configgradeboundary', 'grades');
+        $gradeletter       = get_string('gradeletter', 'grades');
+        $gradeboundary     = get_string('gradeboundary', 'grades');
+
+        $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");
+            $mform->setHelpButton($gradelettername, array(false, $gradeletter." $i", false, true, false, $gradeletterhelp));
+            $mform->setType($gradelettername, PARAM_TEXT);
+            $mform->disabledIf($gradelettername, 'override', 'notchecked');
+            $mform->disabledIf($gradelettername, $gradeboundaryname, 'eq', -1);
+
+            $mform->addElement('select', $gradeboundaryname, $gradeboundary." $i", $percentages);
+            $mform->setHelpButton($gradeboundaryname, array(false, $gradeboundary." $i", false, true, false, $gradeboundaryhelp));
+            $mform->setDefault($gradeboundaryname, -1);
+            $mform->setType($gradeboundaryname, PARAM_INT);
+            $mform->disabledIf($gradeboundaryname, 'override', 'notchecked');
+        }
+
+        // hidden params
+        $mform->addElement('hidden', 'id');
+        $mform->setType('id', PARAM_INT);
+
+//-------------------------------------------------------------------------------
+        // buttons
+        $this->add_action_buttons(!$admin);
+    }
+
+}
+
+?>
diff --git a/grade/edit/letter/index.php b/grade/edit/letter/index.php
new file mode 100644 (file)
index 0000000..f5de74e
--- /dev/null
@@ -0,0 +1,57 @@
+<?php // $Id$
+
+require_once '../../../config.php';
+require_once $CFG->dirroot.'/grade/lib.php';
+require_once $CFG->libdir.'/gradelib.php';
+
+$courseid  = optional_param('id', SITEID, PARAM_INT);
+$action   = optional_param('action', '', PARAM_ALPHA);
+
+if (!$course = get_record('course', 'id', $courseid)) {
+    print_error('nocourseid');
+}
+require_login($course);
+$context = get_context_instance(CONTEXT_COURSE, $course->id);
+require_capability('moodle/grade:manage', $context);
+
+$gpr = new grade_plugin_return(array('type'=>'edit', 'plugin'=>'letter', 'courseid'=>$courseid));
+
+$strgrades = get_string('grades');
+$pagename  = get_string('letters', 'grades');
+
+$navigation = grade_build_nav(__FILE__, $pagename, $courseid);
+
+/// Print header
+print_header_simple($strgrades.': '.$pagename, ': '.$strgrades, $navigation, '', '', true, '', navmenu($course));
+/// Print the plugin selector at the top
+print_grade_plugin_selector($courseid, 'edit', 'letter');
+
+$currenttab = 'lettersview';
+require('tabs.php');
+
+$letters = grade_get_letters($context);
+
+$data = array();
+
+$max = 100;
+foreach($letters as $boundary=>$letter) {
+    $line = array();
+    $line[] = format_float($max,2).' %';
+    $line[] = format_float($boundary,2).' %';
+    $line[] = format_string($letter);
+    $data[] = $line;
+    $max = $boundary - 0.01;
+}
+
+$table = new object();
+$table->head  = array(get_string('max', 'grades'), get_string('min', 'grades'), get_string('letter', 'grades'));
+$table->size  = array('30%', '30%', '40%');
+$table->align = array('left', 'left', 'left');
+$table->width = '30%';
+$table->data  = $data;
+print_table($table);
+
+print_footer($course);
+
+?>
+
diff --git a/grade/edit/letter/tabs.php b/grade/edit/letter/tabs.php
new file mode 100644 (file)
index 0000000..0057c4a
--- /dev/null
@@ -0,0 +1,20 @@
+<?php  // $Id$
+    $row = $tabs = array();
+
+    $row[] = new tabobject('lettersview',
+                           $CFG->wwwroot.'/grade/edit/letter/index.php?id='.$COURSE->id,
+                           get_string('letters', 'grades'));
+
+    if (has_capability('moodle/grade:manageletters', $context)) {
+        $row[] = new tabobject('lettersedit',
+                               $CFG->wwwroot.'/grade/edit/letter/edit.php?id='.$context->id,
+                               get_string('edit'));
+    }
+
+    $tabs[] = $row;
+
+    echo '<div class="letterdisplay">';
+    print_tabs($tabs, $currenttab);
+    echo '</div>';
+
+?>
index c1da8f9..786d138 100644 (file)
@@ -296,14 +296,6 @@ function print_grade_plugin_selector($courseid, $active_type, $active_plugin, $r
             $menu[$url] = get_string('edittree', 'grades');
         }
 
-        if (has_capability('moodle/grade:manage', $context)) {
-            $url = 'edit/gradedisplay/index.php?id='.$courseid;
-            if ($active_type == 'edit' and $active_plugin == 'gradedisplay' ) {
-                $active = $url;
-            }
-            $menu[$url] = get_string('gradedisplay', 'grades');
-        }
-
         if (has_capability('moodle/course:managescales', $context)) {
             $url = 'edit/scale/index.php?id='.$courseid;
             if ($active_type == 'edit' and $active_plugin == 'scale' ) {
@@ -324,6 +316,15 @@ function print_grade_plugin_selector($courseid, $active_type, $active_plugin, $r
             }
             $menu[$url] = get_string('outcomes', 'grades');
         }
+
+        if (has_capability('moodle/course:manage', $context)) {
+            $url = 'edit/letter/index.php?id='.$courseid;
+            if ($active_type == 'edit' and $active_plugin == 'letter' ) {
+                $active = $url;
+            }
+            $menu[$url] = get_string('letters', 'grades');
+        }
+
     }
 
 /// finally print/return the popup form
index 6151fda..d0890a9 100644 (file)
@@ -1,9 +1,6 @@
 <?php // $Id$
-require_once($CFG->libdir.'/gradelib.php');
-$strgradeboundary       = get_string('gradeboundary', 'grades');
-$strconfiggradeboundary = get_string('configgradeboundary', 'grades');
-$strgradeletter         = get_string('gradeletter', 'grades');
-$strconfiggradeletter   = get_string('configgradeletter', 'grades');
+require_once($CFG->libdir.'/grade/constants.php');
+
 $strinherit             = get_string('inherit', 'grades');
 $strpercentage          = get_string('percentage', 'grades');
 $strreal                = get_string('real', 'grades');
@@ -111,18 +108,5 @@ $settings->add(new admin_setting_configselect('grade_report_rangesdecimalpoints'
                                                  '4' => '4',
                                                  '5' => '5')));
 
-$percentages = array(GRADE_REPORT_PREFERENCE_UNUSED => get_string('unused', 'grades'));
-for ($i=100; $i > -1; $i--) {
-    $percentages[$i] = "$i%";
-}
-
-for ($i = 1; $i <= 10; $i++) {
-    $default = abs(($i-10)*10);
-    $settings->add(new admin_setting_configselect('grade_report_gradeboundary'.$i, $strgradeboundary . " $i",
-                                              $strconfiggradeboundary, $default, $percentages));
-
-    $settings->add(new admin_setting_configtext('grade_report_gradeletter'.$i, $strgradeletter . " $i",
-                                            $strconfiggradeletter, ''));
-}
 
 ?>
index 4185099..c82309b 100755 (executable)
@@ -113,9 +113,9 @@ class grade_report {
         global $CFG, $COURSE;
 
         if (!$CFG->gradebookroles) {
-            error ('no roles defined in admin->appearance->graderoles'); 
+            error ('no roles defined in admin->appearance->graderoles');
         }
-        
+
 
         $this->courseid  = $courseid;
         if ($this->courseid == $COURSE->id) {
@@ -255,25 +255,8 @@ class grade_report {
      */
     function get_grade_letters() {
         global $COURSE;
-        $letters = array();
         $context = get_context_instance(CONTEXT_COURSE, $COURSE->id);
-
-        if ($records = get_records('grade_letters', 'contextid', $context->id)) {
-            foreach ($records as $record) {
-                if (!is_null($record->lowerboundary) && !empty($record->letter)) {
-                    $letters[$record->lowerboundary] = $record->letter;
-                }
-            }
-        } else {
-            for ($i = 1; $i <= 10; $i++) {
-                $boundary = grade_report::get_pref('gradeboundary' . $i);
-                $letter = grade_report::get_pref('gradeletter' . $i);
-                if (!is_null($boundary) && $boundary != -1 && !empty($letter)) {
-                    $letters[$boundary] = $letter;
-                }
-            }
-        }
-        return $letters;
+        $letters = grade_get_letters($context);
     }
 
     /**
index 096ec93..77d13f7 100644 (file)
@@ -1043,7 +1043,16 @@ $moodle_capabilities = array(
     ),
 
     'moodle/grade:manageoutcomes' => array(
-        'riskbitmask' => RISK_PERSONAL,
+        'captype' => 'write',
+        'contextlevel' => CONTEXT_COURSE,
+        'legacy' => array(
+            'editingteacher' => CAP_ALLOW,
+            'admin' => CAP_ALLOW
+        ),
+        'clonepermissionsfrom' => 'moodle/course:managegrades'
+    ),
+
+    'moodle/grade:manageletters' => array(
         'captype' => 'write',
         'contextlevel' => CONTEXT_COURSE,
         'legacy' => array(
index 5f8fef8..222316e 100644 (file)
@@ -1,5 +1,5 @@
 <?xml version="1.0" encoding="UTF-8" ?>
-<XMLDB PATH="lib/db" VERSION="20070925" COMMENT="XMLDB file for core Moodle tables"
+<XMLDB PATH="lib/db" VERSION="20070928" COMMENT="XMLDB file for core Moodle tables"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:noNamespaceSchemaLocation="../../lib/xmldb/xmldb.xsd"
 >
       <KEYS>
         <KEY NAME="primary" TYPE="primary" FIELDS="id"/>
       </KEYS>
+      <INDEXES>
+        <INDEX NAME="contextid-lowerboundary" UNIQUE="false" FIELDS="contextid, lowerboundary" COMMENT="index used when fetching context letters"/>
+      </INDEXES>
     </TABLE>
   </TABLES>
   <STATEMENTS>
index c7331fd..6929e44 100644 (file)
@@ -2242,6 +2242,17 @@ function xmldb_main_upgrade($oldversion=0) {
         $result = $result && change_field_notnull($table, $field);
     }
 
+    if ($result && $oldversion < 2007092801) {
+
+    /// Define index contextidlowerboundary (not unique) to be added to grade_letters
+        $table = new XMLDBTable('grade_letters');
+        $index = new XMLDBIndex('contextid-lowerboundary');
+        $index->setAttributes(XMLDB_INDEX_NOTUNIQUE, array('contextid', 'lowerboundary'));
+
+    /// Launch add index contextidlowerboundary
+        $result = $result && add_index($table, $index);
+    }
+
 /*
     /// drop old gradebook tables
     if ($result && $oldversion < xxxxxxxx) {
index 055fb93..096ee4f 100644 (file)
@@ -504,21 +504,8 @@ function grade_format_gradevalue($value, &$grade_item, $localized=true, $display
  */
 function grade_get_letters($context=null) {
     if (empty($context)) {
-        // defaults
-        // TODO: maybe we should hardcode defaults here and remove them from admin tree
-        //       it seems a bit less than optional to use report preferences for this
-        //       when letters are used in other types of plugins too
-        global $CFG;
-        require_once($CFG->dirroot.'/grade/report/lib.php');
-
-        for ($i = 1; $i <= 10; $i++) {
-            $boundary = grade_report::get_pref('gradeboundary' . $i);
-            $letter = grade_report::get_pref('gradeletter' . $i);
-            if (!is_null($boundary) && $boundary != -1 && !empty($letter)) {
-                $letters[$boundary] = $letter;
-            }
-        }
-        return $letters;
+        //default grading letters
+        return array('93'=>'A', '90'=>'A-', '87'=>'B+', '83'=>'B', '80'=>'B-', '77'=>'C+', '73'=>'C', '70'=>'C-', '67'=>'D+', '60'=>'D', '0'=>'F');
     }
 
     static $cache = array();
@@ -537,11 +524,9 @@ function grade_get_letters($context=null) {
     array_unshift($contexts, $context->id);
 
     foreach ($contexts as $ctxid) {
-        if ($records = get_records('grade_letters', 'contextid', $ctxid, 'lowerboundary DESC')) { //TODO: add index?
+        if ($records = get_records('grade_letters', 'contextid', $ctxid, 'lowerboundary DESC')) {
             foreach ($records as $record) {
-                if (!is_null($record->lowerboundary) && !empty($record->letter)) {
-                    $letters[$record->lowerboundary] = $record->letter;
-                }
+                $letters[$record->lowerboundary] = $record->letter;
             }
         }
 
index d47bb34..f61ae24 100644 (file)
@@ -6,7 +6,7 @@
 // This is compared against the values stored in the database to determine
 // whether upgrades should be performed (see lib/db/*.php)
 
-    $version = 2007092501;  // YYYYMMDD = date
+    $version = 2007092801;  // YYYYMMDD = date
                             //       XY = increments within a single day
 
     $release = '1.9 Beta +';   // Human-friendly version name