From 173a9d21ea372f33ecbe6333835d802e7c0afb98 Mon Sep 17 00:00:00 2001 From: skodak Date: Mon, 30 Jul 2007 22:56:45 +0000 Subject: [PATCH] various grade outcomes and scales improvements, fixes, changes and refactoring added new favoutcomes plugin settings page - to be used later, this replaces the grade_outcomes_grades table admin settings - outcomes and scales both have settings page now --- admin/settings/grades.php | 19 +- .../favoutcomes/form.html} | 23 +-- grade/edit/favoutcomes/index.php | 83 ++++++++ grade/edit/outcome/edit.php | 123 ++++++++++++ grade/edit/outcome/edit_form.php | 132 +++++++++++++ grade/edit/outcome/index.php | 164 +++++++++++++++- grade/edit/scale/edit.php | 112 +++++++---- grade/edit/scale/edit_form.php | 26 ++- grade/edit/scale/index.php | 75 +++++--- grade/lib.php | 10 +- grade/report/grader/lib.php | 4 +- grade/report/outcomes/course.php | 178 ------------------ grade/report/outcomes/db/access.php | 10 - grade/report/outcomes/index.php | 49 ++--- grade/report/outcomes/version.php | 2 +- lang/en_utf8/grades.php | 5 + lang/en_utf8/moodle.php | 1 + lib/db/install.xml | 19 +- lib/db/upgrade.php | 31 +-- lib/grade/grade_outcome.php | 98 ++++++---- lib/grade/grade_scale.php | 27 ++- theme/standard/styles_layout.css | 12 ++ version.php | 2 +- 23 files changed, 806 insertions(+), 399 deletions(-) rename grade/{report/outcomes/course.html => edit/favoutcomes/form.html} (58%) create mode 100644 grade/edit/favoutcomes/index.php create mode 100644 grade/edit/outcome/edit.php create mode 100644 grade/edit/outcome/edit_form.php delete mode 100755 grade/report/outcomes/course.php diff --git a/admin/settings/grades.php b/admin/settings/grades.php index 40bed111ef..f7595a52b1 100644 --- a/admin/settings/grades.php +++ b/admin/settings/grades.php @@ -10,6 +10,14 @@ $temp->add(new admin_setting_special_gradeexport()); $temp->add(new admin_setting_configcheckbox('enableoutcomes', get_string('enableoutcomes', 'grades'), get_string('configenableoutcomes', 'grades'), 0, PARAM_INT)); $ADMIN->add('grades', $temp); +/// Scales and outcomes + +$scales = new admin_externalpage('scales', get_string('scales'), $CFG->wwwroot.'/grade/edit/scale/index.php', 'moodle/grade:manage'); +$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); + + // The plugins must implement a settings.php file that adds their admin settings to the $settings object // Reports @@ -18,14 +26,11 @@ $first = true; foreach (get_list_of_plugins('grade/report') as $plugin) { // Include all the settings commands for this plugin if there are any if ($first) { - $ADMIN->add('grades', new admin_category('gradereports', get_string('reports'))); + $ADMIN->add('grades', new admin_category('gradereports', get_string('reportsettings', 'grades'))); $first = false; } - if ($plugin == 'outcomes') { - $settings = new admin_externalpage('gradereport'.$plugin, get_string('modulename', 'gradereport_'.$plugin), $CFG->wwwroot.'/grade/report/outcomes/site.php'); - $ADMIN->add('gradereports', $settings); - } else if (file_exists($CFG->dirroot.'/grade/report/'.$plugin.'/settings.php')) { + if (file_exists($CFG->dirroot.'/grade/report/'.$plugin.'/settings.php')) { $settings = new admin_settingpage('gradereport'.$plugin, get_string('modulename', 'gradereport_'.$plugin)); include_once($CFG->dirroot.'/grade/report/'.$plugin.'/settings.php'); @@ -46,9 +51,7 @@ foreach (get_list_of_plugins('grade/import') as $plugin) { } $settings = new admin_settingpage('gradeimport'.$plugin, get_string('modulename', 'gradeimport_'.$plugin)); - include_once($CFG->dirroot.'/grade/import/'.$plugin.'/settings.php'); - $ADMIN->add('gradeimports', $settings); } } @@ -66,9 +69,7 @@ foreach (get_list_of_plugins('grade/export') as $plugin) { } $settings = new admin_settingpage('gradeexport'.$plugin, get_string('modulename', 'gradeexport_'.$plugin)); - include_once($CFG->dirroot.'/grade/export/'.$plugin.'/settings.php'); - $ADMIN->add('gradeexports', $settings); } } diff --git a/grade/report/outcomes/course.html b/grade/edit/favoutcomes/form.html similarity index 58% rename from grade/report/outcomes/course.html rename to grade/edit/favoutcomes/form.html index 4015536804..e95ea0adb3 100755 --- a/grade/report/outcomes/course.html +++ b/grade/edit/favoutcomes/form.html @@ -1,40 +1,33 @@ -
+
\n"; } - $cm = get_coursemodule_from_instance($item->itemmodule, $item->iteminstance, $item->courseid); - $itemname = ''.$item->itemname.''; + $grade_item = new grade_item($item, false); + + if ($item->itemtype == 'mod') { + $cm = get_coursemodule_from_instance($item->itemmodule, $item->iteminstance, $item->courseid); + $itemname = ''.$item->itemname.''; + } else { + $itemname = $grade_item->get_name(); + } $outcomedata['outcome']->sum += $item->avg; $gradehtml = $scale->get_nearest_item($item->avg); diff --git a/grade/report/outcomes/version.php b/grade/report/outcomes/version.php index cf6e2aa0cb..83613c9663 100644 --- a/grade/report/outcomes/version.php +++ b/grade/report/outcomes/version.php @@ -1,6 +1,6 @@ version = 2007072501; +$plugin->version = 2007073000; $plugin->requires = 2007072402; ?> diff --git a/lang/en_utf8/grades.php b/lang/en_utf8/grades.php index 238c0aad8e..dca315f6e9 100644 --- a/lang/en_utf8/grades.php +++ b/lang/en_utf8/grades.php @@ -221,9 +221,13 @@ $string['numberofgrades'] = 'Number of grades'; $string['onascaleof'] = ' on a scale of $a->grademin to $a->grademax'; $string['operations'] = 'Operations'; $string['outcome'] = 'Outcome'; +$string['outcomecreate'] = 'Add a new outcome'; $string['outcomes'] = 'Outcomes'; +$string['outcomescustom'] = 'Custom outcomes'; $string['outcomename'] = 'Outcome name'; $string['outcomereport'] = 'Outcome report'; +$string['outcomesstandard'] = 'Standard outcomes'; +$string['outcomestandard'] = 'Standard outcome'; $string['outcomes'] = 'Outcomes'; $string['overridden'] = 'Overridden'; $string['overallavg'] = 'Overall average'; @@ -251,6 +255,7 @@ $string['rank'] = 'Rank'; $string['real'] = 'Real'; $string['rawpct'] = 'Raw %%'; $string['reportplugins'] = 'Report plugins'; +$string['reportsettings'] = 'Report settings'; $string['reprintheaders'] = 'Reprint Headers'; $string['right'] = 'Right'; $string['savechanges'] = 'Save Changes'; diff --git a/lang/en_utf8/moodle.php b/lang/en_utf8/moodle.php index f7eec57558..a78798a35c 100644 --- a/lang/en_utf8/moodle.php +++ b/lang/en_utf8/moodle.php @@ -1222,6 +1222,7 @@ $string['scalescustom'] = 'Custom scales'; $string['scalescustomcreate'] = 'Add a new scale'; $string['scalescustomno'] = 'No custom scales have been created yet'; $string['scalesstandard'] = 'Standard scales'; +$string['scalestandard'] = 'Standard scale'; $string['scalestip'] = 'To create custom scales, use the \'Scales...\' link in your course administration menu.'; $string['schedule'] = 'Schedule'; $string['scheduledbackupstatus'] = 'Scheduled backup status'; diff --git a/lib/db/install.xml b/lib/db/install.xml index 666996414c..2ccd10d369 100644 --- a/lib/db/install.xml +++ b/lib/db/install.xml @@ -1,5 +1,5 @@ - @@ -1274,7 +1274,7 @@
+ +
-


-
+ +
diff --git a/grade/edit/favoutcomes/index.php b/grade/edit/favoutcomes/index.php new file mode 100644 index 0000000000..c367900829 --- /dev/null +++ b/grade/edit/favoutcomes/index.php @@ -0,0 +1,83 @@ +dirroot.'/grade/lib.php'; +require_once $CFG->libdir.'/gradelib.php'; + +$courseid = required_param('id', PARAM_INT); + +/// Make sure they can even access this course +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:update', $context); + +/// return tracking object +$gpr = new grade_plugin_return(array('type'=>'edit', 'plugin'=>'favoutcomes', 'courseid'=>$courseid)); + +$strgrades = get_string('grades'); +$pagename = get_string('favoutcomes', 'grades'); + +$navlinks = array(array('name'=>$strgrades, 'link'=>$CFG->wwwroot.'/grade/index.php?id='.$courseid, 'type'=>'misc'), + array('name'=>$pagename, 'link'=>'', 'type'=>'misc')); +$navigation = build_navigation($navlinks); + +if ($fav_outcomes_ids = get_user_preferences('grade_favourite_outcomes', null)) { + $fav_outcomes_ids = unserialize($fav_outcomes_ids); +} else { + $fav_outcomes_ids = array(); +} + +$outcomes = grade_outcome::fetch_all_global(); +$favoutcomes = array(); +foreach($outcomes as $outcome) { + if (in_array($outcome->id, $fav_outcomes_ids)) { + unset($outcomes[$outcome->id]); + $favoutcomes[$outcome->id] = $outcome; + } +} + +// store user preferences +if ($data = data_submitted()) { + if (!empty($data->add) && !empty($data->addoutcomes)) { + /// add all selected to favourite list + foreach ($data->addoutcomes as $add) { + if (isset($outcomes[$add])) { + $outcome = $outcomes[$add]; + unset($outcomes[$outcome->id]); + $favoutcomes[$outcome->id] = $outcome; + } + } + } else if (!empty($data->remove) && !empty($data->removeoutcomes)) { + /// remove all selected from favourites + foreach ($data->removeoutcomes as $remove) { + if (isset($favoutcomes[$remove])) { + $outcome = $favoutcomes[$remove]; + unset($favoutcomes[$outcome->id]); + $outcomes[$outcome->id] = $outcome; + } + } + } + + $pref = array_keys($favoutcomes); + $pref = serialize($pref); + set_user_preference('grade_favourite_outcomes', $pref); +} + +/// 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', 'favoutcomes'); + + +check_theme_arrows(); +include_once('form.html'); + +print_footer($course); + + +?> diff --git a/grade/edit/outcome/edit.php b/grade/edit/outcome/edit.php new file mode 100644 index 0000000000..d24c513295 --- /dev/null +++ b/grade/edit/outcome/edit.php @@ -0,0 +1,123 @@ +dirroot.'/grade/lib.php'; +require_once $CFG->dirroot.'/grade/report/lib.php'; +require_once 'edit_form.php'; + +$courseid = optional_param('courseid', 0, PARAM_INT); +$id = optional_param('id', 0, PARAM_INT); + +$systemcontext = get_context_instance(CONTEXT_SYSTEM); + +// a bit complex access control :-O +if ($id) { + /// editing existing outcome + if (!$outcome_rec = get_record('grade_outcomes', 'id', $id)) { + error('Incorrect outcome id'); + } + if ($outcome_rec->courseid) { + $outcome_rec->standard = 0; + if (!$course = get_record('course', 'id', $outcome_rec->courseid)) { + error('Incorrect course id'); + } + require_login($course); + $context = get_context_instance(CONTEXT_COURSE, $course->id); + require_capability('moodle/grade:manage', $context); + $courseid = $course->id; + } else { + if ($courseid) { + if (!$course = get_record('course', 'id', $courseid)) { + error('Incorrect course id'); + } + } + $outcome_rec->standard = 1; + $outcome_rec->courseid = $courseid; + require_login(); + require_capability('moodle/grade:manage', $systemcontext); + } + +} else if ($courseid){ + /// adding new outcome from course + if (!$course = get_record('course', 'id', $courseid)) { + print_error('nocourseid'); + } + $outcome_rec = new object(); + $outcome_rec->standard = 0; + $outcome_rec->courseid = $courseid; + require_login($course); + $context = get_context_instance(CONTEXT_COURSE, $course->id); + require_capability('moodle/grade:manage', $context); + +} else { + /// adding new outcome from admin section + $outcome_rec = new object(); + $outcome_rec->standard = 1; + $outcome_rec->courseid = 0; + require_login(); + require_capability('moodle/grade:manage', $systemcontext); +} + +// default return url +$gpr = new grade_plugin_return(); +$returnurl = $gpr->get_return_url('index.php?id='.$courseid); + +$mform = new edit_outcome_form(null, array('gpr'=>$gpr)); + +$mform->set_data($outcome_rec); + +if ($mform->is_cancelled()) { + redirect($returnurl); + +} else if ($data = $mform->get_data(false)) { + $outcome = new grade_outcome(array('id'=>$id)); + $data->usermodified = $USER->id; + grade_outcome::set_properties($outcome, $data); + + if (empty($outcome->id)) { + if (!has_capability('moodle/grade:manage', $systemcontext)) { + $data->standard = 0; + } + $outcome->courseid = !empty($data->standard) ? null : $courseid; + if (empty($outcome->courseid)) { + $outcome->courseid = null; + } + $outcome->insert(); + + } else { + if (isset($data->standard)) { + $outcome->courseid = !empty($data->standard) ? null : $courseid; + } else { + unset($outcome->couseid); // keep previous + } + $outcome->update(); + } + + redirect($returnurl, 'temp debug delay', 3); +} + +$strgrades = get_string('grades'); +$strgraderreport = get_string('graderreport', 'grades'); +$stroutcomeedit = get_string('outcome', 'grades'); + +if ($courseid) { + $nav = array(array('name'=>$strgrades,'link'=>$CFG->wwwroot.'/grade/index.php?id='.$courseid, 'type'=>'misc'), + array('name'=>$stroutcomeedit, 'link'=>'', 'type'=>'misc')); + $navigation = build_navigation($nav); + print_header_simple($strgrades.': '.$strgraderreport, ': '.$stroutcomeedit, $navigation, '', '', true, '', navmenu($course)); + +} else { + require_once $CFG->libdir.'/adminlib.php'; + admin_externalpage_setup('outcomes'); + admin_externalpage_print_header(); +} + +$mform->display(); + +if ($courseid) { + print_footer($course); +} else { + admin_externalpage_print_footer(); +} + +?> diff --git a/grade/edit/outcome/edit_form.php b/grade/edit/outcome/edit_form.php new file mode 100644 index 0000000000..cd08325661 --- /dev/null +++ b/grade/edit/outcome/edit_form.php @@ -0,0 +1,132 @@ +libdir.'/formslib.php'; + +class edit_outcome_form extends moodleform { + function definition() { + global $CFG, $COURSE; + $mform =& $this->_form; + + // visible elements + $mform->addElement('header', 'general', get_string('outcomes', 'grades')); + + $mform->addElement('text', 'fullname', get_string('fullname')); + $mform->addRule('fullname', get_string('required'), 'required'); + $mform->setType('fullname', PARAM_TEXT); + + $mform->addElement('text', 'shortname', get_string('shortname')); + $mform->addRule('shortname', get_string('required'), 'required'); + $mform->setType('shortname', PARAM_NOTAGS); + + $mform->addElement('advcheckbox', 'standard', get_string('outcomestandard', 'grades')); + + $options = array(); + + $mform->addElement('select', 'scaleid', get_string('scale'), $options); + $mform->addRule('scaleid', get_string('required'), 'required'); + + + // hidden params + $mform->addElement('hidden', 'id', 0); + $mform->setType('id', PARAM_INT); + + $mform->addElement('hidden', 'courseid', 0); + $mform->setType('courseid', PARAM_INT); + +/// add return tracking info + $gpr = $this->_customdata['gpr']; + $gpr->add_mform_elements($mform); + +//------------------------------------------------------------------------------- + // buttons + $this->add_action_buttons(); + } + + +/// tweak the form - depending on existing data + function definition_after_data() { + global $CFG; + + $mform =& $this->_form; + + // first load proper scales + if ($courseid = $mform->getElementValue('courseid')) { + $options = array(); + if ($scales = grade_scale::fetch_all_local($courseid)) { + $options[-1] = '--'.get_string('scalescustom'); + foreach($scales as $scale) { + $options[$scale->id] = $scale->get_name(); + } + } + if ($scales = grade_scale::fetch_all_global()) { + $options[-2] = '--'.get_string('scalesstandard'); + foreach($scales as $scale) { + $options[$scale->id] = $scale->get_name(); + } + } + $scale_el =& $mform->getElement('scaleid'); + $scale_el->load($options); + + } else { + $options = array(); + if ($scales = grade_scale::fetch_all_global()) { + foreach($scales as $scale) { + $options[$scale->id] = $scale->get_name(); + } + } + $scale_el =& $mform->getElement('scaleid'); + $scale_el->load($options); + } + + if ($id = $mform->getElementValue('id')) { + $outcome = grade_outcome::fetch(array('id'=>$id)); + $count = $outcome->get_uses_count(); + + if ($count) { + $mform->hardFreeze('scaleid'); + } + + if (empty($courseid)) { + $mform->hardFreeze('standard'); + + } else if (empty($outcome->courseid) and !has_capability('moodle/grade:manage', get_context_instance(CONTEXT_SYSTEM))) { + $mform->hardFreeze('standard'); + + } else if ($count and !empty($outcome->courseid)) { + $mform->hardFreeze('standard'); + } + + + } else { + if (empty($courseid) or !has_capability('moodle/grade:manage', get_context_instance(CONTEXT_SYSTEM))) { + $mform->hardFreeze('standard'); + } + } + } + +/// perform extra validation before submission + function validation($data){ + $errors = array(); + + if ($data['scaleid'] < 1) { + $errors['scaleid'] = get_string('required'); + } + + if (!empty($data['standard']) and $scale = grade_scale::fetch(array('id'=>$data['scaleid']))) { + if (!empty($scale->courseid)) { + //TODO: localize + $errors['scaleid'] = 'Can not use custom scale in global outcome!'; + } + } + + if (0 == count($errors)){ + return true; + } else { + return $errors; + } + } + + +} + +?> diff --git a/grade/edit/outcome/index.php b/grade/edit/outcome/index.php index 30404ce4c5..526781ea3a 100644 --- a/grade/edit/outcome/index.php +++ b/grade/edit/outcome/index.php @@ -1 +1,163 @@ -TODO \ No newline at end of file +dirroot.'/grade/lib.php'; +require_once $CFG->libdir.'/gradelib.php'; + +$courseid = optional_param('id', 0, PARAM_INT); +$action = optional_param('action', '', PARAM_ALPHA); + +/// 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/grade:manage', $context); + +} else { + require_once $CFG->libdir.'/adminlib.php'; + admin_externalpage_setup('outcomes'); +} + +/// return tracking object +$gpr = new grade_plugin_return(array('type'=>'edit', 'plugin'=>'outcome', 'courseid'=>$courseid)); + + +$strgrades = get_string('grades'); +$pagename = get_string('outcomes', 'grades'); + +$navlinks = array(array('name'=>$strgrades, 'link'=>$CFG->wwwroot.'/grade/index.php?id='.$courseid, 'type'=>'misc'), + array('name'=>$pagename, 'link'=>'', 'type'=>'misc')); +$navigation = build_navigation($navlinks); + +$strshortname = get_string('shortname'); +$strfullname = get_string('fullname'); +$strscale = get_string('scale'); +$strstandardoutcome = get_string('outcomesstandard', 'grades'); +$strcustomoutcomes = get_string('outcomescustom', 'grades'); +$strdelete = get_string('delete'); +$stredit = get_string('edit'); +$srtcreatenewoutcome = get_string('outcomecreate', 'grades'); +$stractivities = get_string('activities'); +$stredit = get_string('edit'); + +switch ($action) { + case 'delete': + if (!confirm_sesskey()) { + break; + } + $outcomeid = required_param('outcomeid', PARAM_INT); + if (!$outcome = grade_outcome::fetch(array('id'=>$outcomeid))) { + break; + } + + if (empty($outcome->courseid)) { + require_capability('moodle/grade:manage', get_context_instance(CONTEXT_SYSTEM)); + } else if ($outcome->courseid != $courseid) { + error('Incorrect courseid!'); + } + + if (!$outcome->can_delete()) { + break; + } + + //TODO: add confirmation + $outcome->delete(); + break; +} + +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', 'outcome'); + +} else { + admin_externalpage_print_header(); +} + + +if ($courseid and $outcomes = grade_outcome::fetch_all_local($courseid)) { + print_heading($strcustomoutcomes); + $data = array(); + foreach($outcomes as $outcome) { + $line = array(); + $line[] = $outcome->get_name(); + $line[] = $outcome->get_shortname(); + + $scale = $outcome->load_scale(); + $line[] = $scale->get_name(); + + $outcomes_uses = $outcome->get_uses_count(); + $line[] = $outcomes_uses; + + $buttons = ""; + $buttons .= "id\">pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"$stredit\" /> "; + if (empty($outcomes_uses)) { + $buttons .= "id&action=delete&sesskey=$USER->sesskey\">pixpath/t/delete.gif\" class=\"iconsmall\" alt=\"$strdelete\" /> "; + } + $line[] = $buttons; + $data[] = $line; + } + $table = new object(); + $table->head = array($strfullname, $strshortname, $strscale, $stractivities, $stredit); + $table->size = array('30%', '20%', '20%', '20%', '10%'); + $table->align = array('left', 'left', 'left', 'center', 'center'); + $table->width = '90%'; + $table->data = $data; + print_table($table); +} + +if ($outcomes = grade_outcome::fetch_all_global()) { + print_heading($strstandardoutcome); + $data = array(); + foreach($outcomes as $outcome) { + $line = array(); + $line[] = $outcome->get_name(); + $line[] = $outcome->get_shortname(); + + $scale = $outcome->load_scale(); + $line[] = $scale->get_name(); + + $outcomes_uses = $outcome->get_uses_count(); + $line[] = $outcomes_uses; + + $buttons = ""; + if (has_capability('moodle/grade:manage', get_context_instance(CONTEXT_SYSTEM))) { + $buttons .= "id\">pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"$stredit\" /> "; + } + if (empty($outcomes_uses) and has_capability('moodle/grade:manage', get_context_instance(CONTEXT_SYSTEM))) { + $buttons .= "id&action=delete&sesskey=$USER->sesskey\">pixpath/t/delete.gif\" class=\"iconsmall\" alt=\"$strdelete\" /> "; + } + $line[] = $buttons; + $data[] = $line; + } + $table = new object(); + $table->head = array($strfullname, $strshortname, $strscale, $stractivities, $stredit); + $table->size = array('30%', '20%', '20%', '20%', '10%'); + $table->align = array('left', 'left', 'left', 'center', 'center'); + $table->width = '90%'; + $table->data = $data; + print_table($table); +} + + +echo '
'; +print_single_button('edit.php', array('courseid'=>$courseid), $srtcreatenewoutcome); +echo '
'; + +if ($courseid) { + print_footer($course); +} else { + admin_externalpage_print_footer(); +} + + +?> diff --git a/grade/edit/scale/edit.php b/grade/edit/scale/edit.php index 38b08bcd9f..ba1d2d4d4d 100644 --- a/grade/edit/scale/edit.php +++ b/grade/edit/scale/edit.php @@ -5,40 +5,67 @@ require_once $CFG->dirroot.'/grade/lib.php'; require_once $CFG->dirroot.'/grade/report/lib.php'; require_once 'edit_form.php'; -$courseid = required_param('courseid', PARAM_INT); +$courseid = optional_param('courseid', 0, PARAM_INT); $id = optional_param('id', 0, PARAM_INT); -if (!$course = get_record('course', 'id', $courseid)) { - print_error('nocourseid'); -} - -require_login($course); -$context = get_context_instance(CONTEXT_COURSE, $course->id); $systemcontext = get_context_instance(CONTEXT_SYSTEM); -require_capability('moodle/course:managescales', $context); -// default return url -$gpr = new grade_plugin_return(); -$returnurl = $gpr->get_return_url('index.php?id='.$course->id); - -$mform = new edit_scale_form(null, array('gpr'=>$gpr)); -if ($scale = get_record('scale', 'id', $id)) { - $scale->custom = (int)(!empty($scale->courseid)); - if (!empty($scale->courseid)) { +// a bit complex access control :-O +if ($id) { + /// editing existing scale + if (!$scale_rec = get_record('scale', 'id', $id)) { + error('Incorrect scale id'); + } + if ($scale_rec->courseid) { + $scale_rec->standard = 0; + if (!$course = get_record('course', 'id', $scale_rec->courseid)) { + error('Incorrect course id'); + } + require_login($course); + $context = get_context_instance(CONTEXT_COURSE, $course->id); + require_capability('moodle/course:managescales', $context); + $courseid = $course->id; + } else { + if ($courseid) { + if (!$course = get_record('course', 'id', $courseid)) { + error('Incorrect course id'); + } + } + $scale_rec->standard = 1; + $scale_rec->courseid = $courseid; + require_login(); require_capability('moodle/course:managescales', $systemcontext); } - $scale->courseid = $courseid; - $options = new object(); - $options->smiley = false; - $options->filter = false; - $options->noclean = false; - $scale->description = format_text($scale->description, FORMAT_MOODLE, $options); - $mform->set_data($scale); + +} else if ($courseid){ + /// adding new scale from course + if (!$course = get_record('course', 'id', $courseid)) { + print_error('nocourseid'); + } + $scale_rec = new object(); + $scale_rec->standard = 0; + $scale_rec->courseid = $courseid; + require_login($course); + $context = get_context_instance(CONTEXT_COURSE, $course->id); + require_capability('moodle/course:managescales', $context); } else { - $mform->set_data(array('courseid'=>$courseid, 'custom'=>1)); + /// adding new scale from admin section + $scale_rec = new object(); + $scale_rec->standard = 1; + $scale_rec->courseid = 0; + require_login(); + require_capability('moodle/course:managescales', $systemcontext); } +// default return url +$gpr = new grade_plugin_return(); +$returnurl = $gpr->get_return_url('index.php?id='.$courseid); + +$mform = new edit_scale_form(null, array('gpr'=>$gpr)); + +$mform->set_data($scale_rec); + if ($mform->is_cancelled()) { redirect($returnurl); @@ -48,17 +75,17 @@ if ($mform->is_cancelled()) { grade_scale::set_properties($scale, $data); if (empty($scale->id)) { - $scale->courseid = $courseid; - if (empty($data->custom) and has_capability('moodle/course:managescales', $systemcontext)) { - $scale->courseid = 0; + if (!has_capability('moodle/grade:manage', $systemcontext)) { + $data->standard = 0; } + $scale->courseid = !empty($data->standard) ? 0 : $courseid; $scale->insert(); } else { - if (isset($data->custom)) { - $scale->courseid = $data->custom ? $courseid : 0; + if (isset($data->standard)) { + $scale->courseid = !empty($data->standard) ? 0 : $courseid; } else { - unset($scale->couseid); + unset($scale->couseid); // keep previous } $scale->update(); } @@ -70,15 +97,24 @@ $strgrades = get_string('grades'); $strgraderreport = get_string('graderreport', 'grades'); $strscaleedit = get_string('scale'); -$nav = array(array('name'=>$strgrades,'link'=>$CFG->wwwroot.'/grade/index.php?id='.$courseid, 'type'=>'misc'), - array('name'=>$strscaleedit, 'link'=>'', 'type'=>'misc')); - -$navigation = build_navigation($nav); +if ($courseid) { + $nav = array(array('name'=>$strgrades,'link'=>$CFG->wwwroot.'/grade/index.php?id='.$courseid, 'type'=>'misc'), + array('name'=>$strscaleedit, 'link'=>'', 'type'=>'misc')); + $navigation = build_navigation($nav); + print_header_simple($strgrades.': '.$strgraderreport, ': '.$strscaleedit, $navigation, '', '', true, '', navmenu($course)); - -print_header_simple($strgrades . ': ' . $strgraderreport, ': ' . $strscaleedit, $navigation, '', '', true, '', navmenu($course)); +} else { + require_once $CFG->libdir.'/adminlib.php'; + admin_externalpage_setup('outcomes'); + admin_externalpage_print_header(); +} $mform->display(); -print_footer($course); -die; +if ($courseid) { + print_footer($course); +} else { + admin_externalpage_print_footer(); +} + +?> diff --git a/grade/edit/scale/edit_form.php b/grade/edit/scale/edit_form.php index 93b78dc8da..20eed49bf2 100644 --- a/grade/edit/scale/edit_form.php +++ b/grade/edit/scale/edit_form.php @@ -14,7 +14,7 @@ class edit_scale_form extends moodleform { $mform->addRule('name', get_string('required'), 'required', null, 'client'); $mform->setType('name', PARAM_TEXT); - $mform->addElement('advcheckbox', 'custom', get_string('coursescale', 'grades')); + $mform->addElement('advcheckbox', 'standard', get_string('scalestandard')); $mform->addElement('static', 'activities', get_string('activities')); @@ -48,21 +48,33 @@ class edit_scale_form extends moodleform { $mform =& $this->_form; + $courseid = $mform->getElementValue('courseid'); + if ($id = $mform->getElementValue('id')) { $scale = grade_scale::fetch(array('id'=>$id)); - if ($count = $scale->get_uses_count()) { - if (empty($scale->courseid)) { - $mform->hardFreeze('custom'); - } + $count = $scale->get_uses_count(); + + if ($count) { $mform->hardFreeze('scale'); } + + if (empty($courseid)) { + $mform->hardFreeze('standard'); + + } else if (empty($scale->courseid) and !has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { + $mform->hardFreeze('standard'); + + } else if ($count and !empty($scale->courseid)) { + $mform->hardFreeze('standard'); + } + $activities_el =& $mform->getElement('activities'); $activities_el->setValue(get_string('usedinnplaces', '', $count)); } else { $mform->removeElement('activities'); - if (!has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { - $mform->hardFreeze('custom'); + if (empty($courseid) or !has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { + $mform->hardFreeze('standard'); } } } diff --git a/grade/edit/scale/index.php b/grade/edit/scale/index.php index bf2e4553a7..32d652cf11 100644 --- a/grade/edit/scale/index.php +++ b/grade/edit/scale/index.php @@ -5,16 +5,21 @@ require_once '../../../config.php'; require_once $CFG->dirroot.'/grade/lib.php'; require_once $CFG->libdir.'/gradelib.php'; -$courseid = required_param('id', PARAM_INT); +$courseid = optional_param('id', 0, PARAM_INT); $action = optional_param('action', '', PARAM_ALPHA); /// Make sure they can even access this course -if (!$course = get_record('course', 'id', $courseid)) { - print_error('nocourseid'); +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'); } -require_login($course); -$context = get_context_instance(CONTEXT_COURSE, $course->id); -require_capability('moodle/course:managescales', $context); /// return tracking object $gpr = new grade_plugin_return(array('type'=>'edit', 'plugin'=>'scale', 'courseid'=>$courseid)); @@ -29,13 +34,13 @@ $navigation = build_navigation($navlinks); $strscale = get_string('scale'); $strstandardscale = get_string('scalesstandard'); -$strcustomscales = get_string('coursescales', 'grades'); +$strcustomscales = get_string('scalescustom'); $strname = get_string('name'); $strdelete = get_string('delete'); $stredit = get_string('edit'); $srtcreatenewscale = get_string('scalescustomcreate'); $stractivities = get_string('activities'); -$stroptions = get_string('action'); +$stredit = get_string('edit'); switch ($action) { case 'delete': @@ -49,6 +54,8 @@ switch ($action) { if (empty($scale->courseid)) { require_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM)); + } else if ($scale->courseid != $courseid) { + error('Incorrect courseid!'); } if (!$scale->can_delete()) { @@ -60,16 +67,18 @@ switch ($action) { break; } -/// 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'); +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_heading($strstandardscale); -if ($scales = grade_scale::fetch_all(array('courseid'=>0))) { +if ($courseid and $scales = grade_scale::fetch_all_local($courseid)) { + print_heading($strcustomscales); $data = array(); foreach($scales as $scale) { $line = array(); @@ -79,18 +88,16 @@ if ($scales = grade_scale::fetch_all(array('courseid'=>0))) { $line[] = $scales_uses; $buttons = ""; - if (has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { - $buttons .= "id&id=$scale->id\">pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"$stredit\" /> "; - } - if (empty($scales_uses) and has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { - $buttons .= "id&scaleid=$scale->id&action=delete&sesskey=$USER->sesskey\">id\">pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"$stredit\" /> "; + if (empty($scales_uses)) { + $buttons .= "id&action=delete&sesskey=$USER->sesskey\">pixpath/t/delete.gif\" class=\"iconsmall\" alt=\"$strdelete\" /> "; } $line[] = $buttons; $data[] = $line; } - $table->head = array($strscale, $stractivities, $stroptions); + $table->head = array($strscale, $stractivities, $stredit); $table->size = array('70%', '20%', '10%'); $table->align = array('left', 'center', 'center'); $table->width = '90%'; @@ -98,8 +105,8 @@ if ($scales = grade_scale::fetch_all(array('courseid'=>0))) { print_table($table); } -print_heading($strcustomscales); -if ($scales = grade_scale::fetch_all(array('courseid'=>$courseid))) { +if ($scales = grade_scale::fetch_all_global()) { + print_heading($strstandardscale); $data = array(); foreach($scales as $scale) { $line = array(); @@ -109,16 +116,18 @@ if ($scales = grade_scale::fetch_all(array('courseid'=>$courseid))) { $line[] = $scales_uses; $buttons = ""; - $buttons .= "id&id=$scale->id\">pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"$stredit\" /> "; - if (empty($scales_uses)) { - $buttons .= "id&scaleid=$scale->id&action=delete&sesskey=$USER->sesskey\">id\">pixpath/t/edit.gif\" class=\"iconsmall\" alt=\"$stredit\" /> "; + } + if (empty($scales_uses) and has_capability('moodle/course:managescales', get_context_instance(CONTEXT_SYSTEM))) { + $buttons .= "id&action=delete&sesskey=$USER->sesskey\">pixpath/t/delete.gif\" class=\"iconsmall\" alt=\"$strdelete\" /> "; } $line[] = $buttons; $data[] = $line; } - $table->head = array($strscale, $stractivities, $stroptions); + $table->head = array($strscale, $stractivities, $stredit); $table->size = array('70%', '20%', '10%'); $table->align = array('left', 'center', 'center'); $table->width = '90%'; @@ -130,7 +139,11 @@ echo '
'; print_single_button('edit.php', array('courseid'=>$courseid), $srtcreatenewscale); echo '
'; -print_footer($course); +if ($courseid) { + print_footer($course); +} else { + admin_externalpage_print_footer(); +} ?> diff --git a/grade/lib.php b/grade/lib.php index 5ca2cfb583..b5da2e4129 100644 --- a/grade/lib.php +++ b/grade/lib.php @@ -113,13 +113,21 @@ function print_grade_plugin_selector($courseid, $active_type, $active_plugin, $r $menu[$url] = get_string('scales'); } - if (has_capability('moodle/grade:manage', $context)) { // TODO: add outcome cap + if (has_capability('moodle/grade:manage', $context)) { $url = 'edit/outcome/index.php?id='.$courseid; if ($active_type == 'edit' and $active_plugin == 'outcome' ) { $active = $url; } $menu[$url] = get_string('outcomes', 'grades'); } + + if (has_capability('course:update', $context)) { + $url = 'edit/favoutcomes/index.php?id='.$courseid; + if ($active_type == 'edit' and $active_plugin == 'favoutcomes' ) { + $active = $url; + } + $menu[$url] = get_string('favouriteoutcomes', 'grades'); + } } /// finally print/return the popup form diff --git a/grade/report/grader/lib.php b/grade/report/grader/lib.php index 8626d914c7..264ac4da5d 100644 --- a/grade/report/grader/lib.php +++ b/grade/report/grader/lib.php @@ -743,7 +743,7 @@ class grade_report_grader extends grade_report { $groupwheresql = null; } - if ($meanselection == GRADE_AGGREGATE_MEAN_GRADED) { + if ($meanselection == GRADE_AGGREGATE_MEAN_GRADED) { $totalcount = 0; } else { $totalcount = $this->get_numusers(); @@ -768,7 +768,7 @@ class grade_report_grader extends grade_report { $sum_array[$itemid] = $csum->sum; if ($totalcount) { $count_array[$itemid] = $totalcount; - } else { + } else { $count_array[$itemid] = $csum->count; } } diff --git a/grade/report/outcomes/course.php b/grade/report/outcomes/course.php deleted file mode 100755 index 4700096e06..0000000000 --- a/grade/report/outcomes/course.php +++ /dev/null @@ -1,178 +0,0 @@ -libdir.'/tablelib.php'); -require_once $CFG->dirroot.'/grade/lib.php'; - -$page = optional_param('page', 0, PARAM_INT); // current page -$search = optional_param('search', 0, PARAM_TEXT); -$deleteid = optional_param('deleteid', 0, PARAM_INT); // which outcome to delete -$confirm = optional_param('confirm', 0, PARAM_INT); -$perpage = 30; - -$courseid = required_param('id', PARAM_INT); // course id -if (!$course = get_record('course', 'id', $courseid)) { - print_error('nocourseid'); -} - -require_login($courseid); -require_capability('gradereport/outcomes:view', get_context_instance(CONTEXT_SYSTEM)); - - /// form processing - if ($deleteid && confirm_sesskey()) { - require_capability('gradereport/outcomes:manage', get_context_instance(CONTEXT_COURSE, $courseid)); - if ($confirm) { - // delete all outcomes used in courses - // delete all outcomes used in grade items - delete_records('grade_outcomes_courses', 'outcomeid', $deleteid); - delete_records('grade_outcomes', 'id', $deleteid); - } else { - // prints confirmation - $strgrades = get_string('grades'); - $stroutcomes = get_string('outcomes', 'grades'); - $navlinks = array(); - $navlinks[] = array('name' => $strgrades, 'link' => $CFG->wwwroot . '/grade/index.php?id='.$courseid, 'type' => 'misc'); - $navlinks[] = array('name' => $stroutcomes, 'link' => '', 'type' => 'misc'); - - $navigation = build_navigation($navlinks); - -/// Print header - print_header_simple($strgrades.':'.$stroutcomes, ':'.$strgrades, $navigation, '', '', true); - - $strdeleteoutcomecheck = get_string('deleteoutcomecheck', 'grades'); - notice_yesno($strdeleteoutcomecheck, - 'course.php?id='.$courseid.'&deleteid='.$deleteid.'&confirm=1&sesskey='.sesskey(), - 'course.php?id='.$courseid.'&'); - print_footer(); - exit; - } - } - - if ($data = data_submitted()) { - require_capability('gradereport/outcomes:manage', get_context_instance(CONTEXT_COURSE, $courseid)); - if (!empty($data->add) && !empty($data->addoutcomes)) { - /// add all selected to course list - foreach ($data->addoutcomes as $add) { - $goc -> courseid = $courseid; - $goc -> outcomeid = $add; - insert_record('grade_outcomes_courses', $goc); - } - } else if (!empty($data->remove) && !empty($data->removeoutcomes)) { - /// remove all selected from course outcomes list - foreach ($data->removeoutcomes as $remove) { - delete_records('grade_outcomes_courses', 'courseid', $courseid, 'outcomeid', $remove); - } - } - } - -// Build navigation -$strgrades = get_string('grades'); -$stroutcomes = get_string('outcomes', 'grades'); -$navlinks = array(); -$navlinks[] = array('name' => $strgrades, 'link' => $CFG->wwwroot . '/grade/index.php?id='.$courseid, 'type' => 'misc'); -$navlinks[] = array('name' => $stroutcomes, 'link' => '', 'type' => 'misc'); - -$navigation = build_navigation($navlinks); - -/// Print header -print_header_simple($strgrades.':'.$stroutcomes, ':'.$strgrades, $navigation, '', '', true); -print_grade_plugin_selector($courseid, 'report', 'outcomes'); - // Add tabs - $currenttab = 'courseoutcomes'; - include('tabs.php'); - - /// listing of all site outcomes + this course specific outcomes - $outcomes = get_records_sql('SELECT * FROM '.$CFG->prefix.'grade_outcomes - WHERE courseid IS NULL'); - - // outcomes used in this course - $courseoutcomes = get_records_sql('SELECT go.id, go.fullname - FROM '.$CFG->prefix.'grade_outcomes_courses goc, - '.$CFG->prefix.'grade_outcomes go - WHERE goc.courseid = '.$courseid.' - AND goc.outcomeid = go.id'); - - if (empty($courseoutcomes)) { - $courseoutcomes = get_records('grade_outcomes', 'courseid', $courseid); - } elseif ($mcourseoutcomes = get_records('grade_outcomes', 'courseid', $courseid)) { - $courseoutcomes += $mcourseoutcomes; - } - - check_theme_arrows(); - include_once('course.html'); - - /// interface to add/edit/delete course specific outcomes - echo '

'; - print_heading(get_string('coursespecoutcome', 'gradereport_outcomes')); // course sepcific outcomes - - $totalcount = count_records('grade_outcomes_courses', 'courseid', $courseid); - $baseurl = "course.php"; - print_paging_bar($totalcount, $page, $perpage, $baseurl); - - if ($outcomes = get_recordset('grade_outcomes', 'courseid', $courseid, '', '*', $page * $perpage, $perpage)) { - - $tablecolumns = array('outcome', 'scale', 'edit', 'usedgradeitems'); - $tableheaders = array(get_string('outcomes', 'grades'), - get_string('scale'), - '', - get_string('activities')); - - $table = new flexible_table('outcomes'); - $table->define_columns($tablecolumns); - $table->define_headers($tableheaders); - $table->define_baseurl($baseurl); - $table->set_attribute('cellspacing', '0'); - $table->set_attribute('id', 'user-grade'); - $table->set_attribute('class', 'boxaligncenter generaltable'); - - $table->setup(); - - while ($outcome = rs_fetch_next_record($outcomes)) { - $data = array(); - - // full name of the outcome - $data[] = $outcome->fullname; - - // full name of the scale used by this outcomes - $scale= get_record('scale', 'id', $outcome->scaleid); - $data[] = $scale->name; - - if (has_capability('gradereport/outcomes:manage', get_context_instance(CONTEXT_COURSE, $courseid))) { - // add operations - $data[] = 'Update - Delete'; // icons and links - } else { - $data[] = ''; - } - // num of gradeitems using this - $num = count_records('grade_items', 'outcomeid' ,$outcome->id); - $data[] = (int) $num; - - // num of courses using this outcome - $table->add_data($data); - } - - $table->print_html(); - } - if (has_capability('gradereport/outcomes:manage', get_context_instance(CONTEXT_COURSE, $courseid))) { - echo ''.get_string('addoutcome', 'gradereport_outcomes').''; - } - print_footer(); - -/** - * truncates a string to a length of num - * @param string string - * @param int num - * @return string - */ -function truncate($string, $num) { - if (strlen($string) > $num + 3) { - $text = substr($string, 0, $num); - $text = $text."..."; - } - return $string; -} -?> diff --git a/grade/report/outcomes/db/access.php b/grade/report/outcomes/db/access.php index 3ad46d7d48..2a6ac0d7e2 100644 --- a/grade/report/outcomes/db/access.php +++ b/grade/report/outcomes/db/access.php @@ -11,16 +11,6 @@ $gradereport_outcomes_capabilities = array( 'editingteacher' => CAP_ALLOW, 'admin' => CAP_ALLOW ) - ), - - 'gradereport/outcomes:manage' => array( - 'riskbitmask' => RISK_CONFIG, - 'captype' => 'write', - 'contextlevel' => CONTEXT_COURSE, - 'legacy' => array( - 'editingteacher' => CAP_ALLOW, - 'admin' => CAP_ALLOW - ) ) ); diff --git a/grade/report/outcomes/index.php b/grade/report/outcomes/index.php index 29e2041400..0eb325ea0a 100644 --- a/grade/report/outcomes/index.php +++ b/grade/report/outcomes/index.php @@ -4,16 +4,17 @@ include_once('../../../config.php'); require_once($CFG->libdir . '/gradelib.php'); require_once $CFG->dirroot.'/grade/lib.php'; -$courseid = required_param('id'); // course id +$courseid = required_param('id', PARAM_INT); // course id if (!$course = get_record('course', 'id', $courseid)) { print_error('nocourseid'); } require_login($course->id); - $context = get_context_instance(CONTEXT_COURSE, $course->id); +require_capability('gradereport/outcomes:view', $context); + // Build navigation $strgrades = get_string('grades'); $stroutcomes = get_string('outcomes', 'grades'); @@ -26,43 +27,27 @@ $navigation = build_navigation($navlinks); /// Print header print_header_simple($strgrades.':'.$stroutcomes, ':'.$strgrades, $navigation, '', '', true); print_grade_plugin_selector($courseid, 'report', 'outcomes'); -// Add tabs -$currenttab = 'outcomereport'; -include('tabs.php'); - -// Grab all outcomes, distinguishing between site-level and course-level outcomes -$sql = "SELECT mdl_grade_outcomes.id, - mdl_grade_outcomes_courses.courseid, - mdl_grade_outcomes.shortname, - mdl_grade_outcomes.scaleid - FROM mdl_grade_outcomes - LEFT JOIN mdl_grade_outcomes_courses - ON (mdl_grade_outcomes.id = mdl_grade_outcomes_courses.outcomeid AND mdl_grade_outcomes_courses.courseid = $courseid) - ORDER BY mdl_grade_outcomes_courses.courseid DESC"; + +//first make sure we have proper final grades +grade_regrade_final_grades($courseid); + +// Grab all outcomes used in course +$sql = "SELECT go.* FROM {$CFG->prefix}grade_outcomes go + WHERE go.id IN (SELECT gi.outcomeid FROM {$CFG->prefix}grade_items gi WHERE gi.courseid = $courseid)"; $report_info = array(); $outcomes = get_records_sql($sql); // Get grade_items that use each outcome foreach ($outcomes as $outcomeid => $outcome) { - $sql = "SELECT mdl_grade_items.id, - mdl_grade_items.itemname, - mdl_grade_items.itemmodule, - mdl_grade_items.iteminstance, - mdl_grade_items.itemtype, - mdl_grade_items.itemnumber, - mdl_grade_items.courseid, - mdl_grade_items.idnumber - FROM mdl_grade_items - WHERE mdl_grade_items.outcomeid = $outcomeid"; - $report_info[$outcomeid]['items'] = get_records_sql($sql); + $report_info[$outcomeid]['items'] = get_records_select('grade_items', "outcomeid = $outcomeid AND courseid = $courseid"); $report_info[$outcomeid]['outcome'] = $outcome; // Get average grades for each item if (is_array($report_info[$outcomeid]['items'])) { foreach ($report_info[$outcomeid]['items'] as $itemid => $item) { $sql = "SELECT id, AVG(finalgrade) AS `avg`, COUNT(finalgrade) AS `count` - FROM mdl_grade_grades + FROM {$CFG->prefix}grade_grades WHERE itemid = $itemid GROUP BY itemid"; $info = get_records_sql($sql); @@ -113,8 +98,14 @@ foreach ($report_info as $outcomeid => $outcomedata) { $items_html .= "

- +
@@ -1292,20 +1292,7 @@
- - - - - - - - - - - - -
- +
diff --git a/lib/db/upgrade.php b/lib/db/upgrade.php index 3498ba3c3d..7e67ea5c68 100644 --- a/lib/db/upgrade.php +++ b/lib/db/upgrade.php @@ -1059,23 +1059,6 @@ function xmldb_main_upgrade($oldversion=0) { $result = $result && create_table($table); - /// Define table grade_outcomes_courses to be created - $table = new XMLDBTable('grade_outcomes_courses'); - - /// Adding fields to table grade_outcomes_courses - $table->addFieldInfo('id', XMLDB_TYPE_INTEGER, '10', null, XMLDB_NOTNULL, XMLDB_SEQUENCE, null, null, null); - $table->addFieldInfo('courseid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null); - $table->addFieldInfo('outcomeid', XMLDB_TYPE_INTEGER, '10', XMLDB_UNSIGNED, XMLDB_NOTNULL, null, null, null, null); - - /// Adding keys to table grade_outcomes_courses - $table->addKeyInfo('primary', XMLDB_KEY_PRIMARY, array('id')); - $table->addKeyInfo('courseid', XMLDB_KEY_FOREIGN, array('courseid'), 'course', array('id')); - $table->addKeyInfo('outcomeid', XMLDB_KEY_FOREIGN, array('outcomeid'), 'grade_outcomes', array('id')); - - /// Launch create table for grade_outcomes_courses - $result = $result && create_table($table); - - /// Define table grade_categories to be created $table = new XMLDBTable('grade_categories'); @@ -1451,16 +1434,14 @@ function xmldb_main_upgrade($oldversion=0) { $result = $result && change_field_default($table, $field); } - if ($result && $oldversion < 2007072500) { - - /// Define key courseid-outcomeid (unique) to be added to grade_outcomes_courses + if ($result && $oldversion < 2007073000) { + // not used anymore $table = new XMLDBTable('grade_outcomes_courses'); - $key = new XMLDBKey('courseid-outcomeid'); - $key->setAttributes(XMLDB_KEY_UNIQUE, array('courseid', 'outcomeid')); - - /// Launch add key courseid-outcomeid - $result = $result && add_key($table, $key); + if (table_exists($table)) { + drop_table($table); + } } + /* /// drop old gradebook tables if ($result && $oldversion < 2007072209) { diff --git a/lib/grade/grade_outcome.php b/lib/grade/grade_outcome.php index b18b24e996..e9480fac81 100644 --- a/lib/grade/grade_outcome.php +++ b/lib/grade/grade_outcome.php @@ -86,16 +86,7 @@ class grade_outcome extends grade_object { * @return object grade_outcome instance or false if none found. */ function fetch($params) { - if ($outcome = grade_object::fetch_helper('grade_outcomes', 'grade_outcome', $params)) { - if (!empty($outcome->scaleid)) { - $outcome->scale = new grade_scale(array('id'=>$outcome->scaleid)); - $outcome->scale->load_items(); - } - return $outcome; - - } else { - return false; - } + return grade_object::fetch_helper('grade_outcomes', 'grade_outcome', $params); } /** @@ -103,34 +94,38 @@ class grade_outcome extends grade_object { * @static * * @param array $params associative arrays varname=>value - * @param bool $fetch_sitewide_outcomes Whether or not to also fetch all sitewide outcomes (with no courseid) * @return array array of grade_outcome insatnces or false if none found. */ - function fetch_all($params, $fetch_sitewide_outcomes=false) { - global $CFG; + function fetch_all($params) { + return grade_object::fetch_all_helper('grade_outcomes', 'grade_outcome', $params); + } - if ($outcomes = grade_object::fetch_all_helper('grade_outcomes', 'grade_outcome', $params)) { - // Fetch sitewide outcomes if requested - if ($fetch_sitewide_outcomes) { - $sitewide_outcomes = array(); - $records = get_records_sql("SELECT * FROM {$CFG->prefix}grade_outcomes WHERE courseid IS NULL"); - foreach ($records as $outcomeid => $outcome) { - $sitewide_outcomes[$outcomeid] = new grade_outcome($outcome, false); - } - $outcomes = array_merge($sitewide_outcomes, $outcomes); - } + /** + * Instantiates a grade_scale object whose data is retrieved from the + * @return object grade_scale + */ + function load_scale() { + if (empty($this->scale->id) or $this->scale->id != $this->scaleid) { + $this->scale = grade_scale::fetch(array('id'=>$this->scaleid)); + $this->scale->load_items(); + } + return $this->scale; + } - foreach ($outcomes as $key=>$value) { - if (!empty($outcomes[$key]->scaleid)) { - $outcomes[$key]->scale = new grade_scale(array('id'=>$outcomes[$key]->scaleid)); - $outcomes[$key]->scale->load_items(); - } - } - return $outcomes; + /** + * Static function returning all global outcomes + * @return object + */ + function fetch_all_global() { + return grade_outcome::fetch_all(array('courseid'=>null)); + } - } else { - return false; - } + /** + * Static function returning all local course outcomes + * @return object + */ + function fetch_all_local($courseid) { + return grade_outcome::fetch_all(array('courseid'=>$courseid)); } /** @@ -139,7 +134,42 @@ class grade_outcome extends grade_object { * @return string name */ function get_name() { - return $this->shortname; + return format_string($this->fullname); + } + + /** + * Returns outcome short name. + * @return string name + */ + function get_shortname() { + return format_string($this->shortname); + } + + /** + * Checks if outcome can be deleted. + * @return boolean + */ + function can_delete() { + $count = $this->get_uses_count(); + return empty($count); + } + + /** + * Returns the number of places where outcome is used. + * @return int + */ + function get_uses_count() { + global $CFG; + + $count = 0; + + // count grade items + $sql = "SELECT COUNT(id) FROM {$CFG->prefix}grade_items WHERE outcomeid = {$this->id}"; + if ($scales_uses = count_records_sql($sql)) { + $count += $scales_uses; + } + + return $count; } /** diff --git a/lib/grade/grade_scale.php b/lib/grade/grade_scale.php index 3141fa5d59..bafec25615 100644 --- a/lib/grade/grade_scale.php +++ b/lib/grade/grade_scale.php @@ -96,6 +96,15 @@ class grade_scale extends grade_object { return grade_object::fetch_all_helper('scale', 'grade_scale', $params); } + /** + * Returns the most descriptive field for this object. This is a standard method used + * when we do not know the exact type of an object. + * @return string name + */ + function get_name() { + return format_string($this->name); + } + /** * Loads the scale's items into the $scale_items array. * There are three ways to achieve this: @@ -171,7 +180,23 @@ class grade_scale extends grade_object { } /** - * Determines if scale can be deleted. + * Static function returning all global scales + * @return object + */ + function fetch_all_global() { + return grade_scale::fetch_all(array('courseid'=>0)); + } + + /** + * Static function returning all local course scales + * @return object + */ + function fetch_all_local($courseid) { + return grade_scale::fetch_all(array('courseid'=>$courseid)); + } + + /** + * Checks if scale can be deleted. * @return boolean */ function can_delete() { diff --git a/theme/standard/styles_layout.css b/theme/standard/styles_layout.css index 76fd9baf30..a9f91c851d 100644 --- a/theme/standard/styles_layout.css +++ b/theme/standard/styles_layout.css @@ -2158,6 +2158,18 @@ body#doc-contents ul { padding: 5px; } +/* outcomes edit */ + +.grade-edit-outcome .buttons { + margin: 20px; + text-align:center; +} + +.grade-edit-outcome .buttons .singlebutton { + display: inline; + padding: 5px; +} + /* gradebook edit tree */ .grade-edit-tree .gradetreebox { diff --git a/version.php b/version.php index 9eeb55d033..424ebcb64b 100644 --- a/version.php +++ b/version.php @@ -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 = 2007072500; // YYYYMMDD = date + $version = 2007073000; // YYYYMMDD = date // XY = increments within a single day $release = '1.9 dev'; // Human-friendly version name -- 2.39.5