|
Moodle
2.2.1
http://www.collinsharper.com
|
00001 <?php 00002 00003 // This file is part of Moodle - http://moodle.org/ 00004 // 00005 // Moodle is free software: you can redistribute it and/or modify 00006 // it under the terms of the GNU General Public License as published by 00007 // the Free Software Foundation, either version 3 of the License, or 00008 // (at your option) any later version. 00009 // 00010 // Moodle is distributed in the hope that it will be useful, 00011 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00012 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00013 // GNU General Public License for more details. 00014 // 00015 // You should have received a copy of the GNU General Public License 00016 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 00017 00018 require_once '../../../config.php'; 00019 require_once $CFG->dirroot.'/grade/lib.php'; 00020 require_once $CFG->dirroot.'/grade/report/lib.php'; 00021 require_once 'grade_form.php'; 00022 00023 $courseid = required_param('courseid', PARAM_INT); 00024 $id = optional_param('id', 0, PARAM_INT); 00025 $itemid = optional_param('itemid', 0, PARAM_INT); 00026 $userid = optional_param('userid', 0, PARAM_INT); 00027 00028 $url = new moodle_url('/grade/edit/tree/grade.php', array('courseid'=>$courseid)); 00029 if ($id !== 0) { 00030 $url->param('id', $id); 00031 } 00032 if ($itemid !== 0) { 00033 $url->param('itemid', $itemid); 00034 } 00035 if ($userid !== 0) { 00036 $url->param('userid', $userid); 00037 } 00038 $PAGE->set_url($url); 00039 00040 if (!$course = $DB->get_record('course', array('id' => $courseid))) { 00041 print_error('nocourseid'); 00042 } 00043 00044 $PAGE->set_pagelayout('incourse'); 00045 require_login($course); 00046 $context = get_context_instance(CONTEXT_COURSE, $course->id); 00047 if (!has_capability('moodle/grade:manage', $context)) { 00048 require_capability('moodle/grade:edit', $context); 00049 } 00050 00051 // default return url 00052 $gpr = new grade_plugin_return(); 00053 $returnurl = $gpr->get_return_url($CFG->wwwroot.'/grade/report.php?id='.$course->id); 00054 00055 // security checks! 00056 if (!empty($id)) { 00057 if (!$grade = $DB->get_record('grade_grades', array('id' => $id))) { 00058 print_error('invalidgroupid'); 00059 } 00060 00061 if (!empty($itemid) and $itemid != $grade->itemid) { 00062 print_error('invaliditemid'); 00063 } 00064 $itemid = $grade->itemid; 00065 00066 if (!empty($userid) and $userid != $grade->userid) { 00067 print_error('invaliduser'); 00068 } 00069 $userid = $grade->userid; 00070 00071 unset($grade); 00072 00073 } else if (empty($userid) or empty($itemid)) { 00074 print_error('missinguseranditemid'); 00075 } 00076 00077 if (!$grade_item = grade_item::fetch(array('id'=>$itemid, 'courseid'=>$courseid))) { 00078 print_error('cannotfindgradeitem'); 00079 } 00080 00081 // now verify grading user has access to all groups or is member of the same group when separate groups used in course 00082 if (groups_get_course_groupmode($COURSE) == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) { 00083 if ($groups = groups_get_all_groups($COURSE->id, $userid)) { 00084 $ok = false; 00085 foreach ($groups as $group) { 00086 if (groups_is_member($group->id, $USER->id)) { 00087 $ok = true; 00088 } 00089 } 00090 if (!$ok) { 00091 print_error('cannotgradeuser'); 00092 } 00093 } else { 00094 print_error('cannotgradeuser'); 00095 } 00096 } 00097 00098 $mform = new edit_grade_form(null, array('grade_item'=>$grade_item, 'gpr'=>$gpr)); 00099 00100 if ($grade = $DB->get_record('grade_grades', array('itemid' => $grade_item->id, 'userid' => $userid))) { 00101 00102 // always clean existing feedback - grading should not have XSS risk 00103 if (can_use_html_editor()) { 00104 if (empty($grade->feedback)) { 00105 $grade->feedback = ''; 00106 } else { 00107 $options = new stdClass(); 00108 $options->smiley = false; 00109 $options->filter = false; 00110 $options->noclean = false; 00111 $options->para = false; 00112 $grade->feedback = format_text($grade->feedback, $grade->feedbackformat, $options); 00113 } 00114 $grade->feedbackformat = FORMAT_HTML; 00115 } else { 00116 $grade->feedback = clean_text($grade->feedback, $grade->feedbackformat); 00117 } 00118 00119 $grade->locked = $grade->locked > 0 ? 1:0; 00120 $grade->overridden = $grade->overridden > 0 ? 1:0; 00121 $grade->excluded = $grade->excluded > 0 ? 1:0; 00122 00123 if ($grade->hidden > 1) { 00124 $grade->hiddenuntil = $grade->hidden; 00125 $grade->hidden = 1; 00126 } else { 00127 $grade->hiddenuntil = 0; 00128 } 00129 00130 if ($grade_item->is_hidden()) { 00131 $grade->hidden = 1; 00132 } 00133 00134 if ($grade_item->is_locked()) { 00135 $grade->locked = 1; 00136 } 00137 00138 // normalize the final grade value 00139 if ($grade_item->gradetype == GRADE_TYPE_SCALE) { 00140 if (empty($grade->finalgrade)) { 00141 $grade->finalgrade = -1; 00142 } else { 00143 $grade->finalgrade = (int)$grade->finalgrade; 00144 } 00145 } else if ($grade_item->gradetype == GRADE_TYPE_VALUE) { 00146 $grade->finalgrade = format_float($grade->finalgrade, $grade_item->get_decimals()); 00147 } 00148 00149 $grade->oldgrade = $grade->finalgrade; 00150 $grade->oldfeedback = $grade->feedback; 00151 00152 $grade->feedback = array('text'=>$grade->feedback, 'format'=>$grade->feedbackformat); 00153 00154 $mform->set_data($grade); 00155 } else { 00156 $grade->feedback = array('text'=>'', 'format'=>FORMAT_HTML); 00157 $mform->set_data(array('itemid'=>$itemid, 'userid'=>$userid, 'locked'=>$grade_item->locked, 'locktime'=>$grade_item->locktime)); 00158 } 00159 00160 if ($mform->is_cancelled()) { 00161 redirect($returnurl); 00162 00163 // form processing 00164 } else if ($data = $mform->get_data(false)) { 00165 00166 if (is_array($data->feedback)) { 00167 $data->feedbackformat = $data->feedback['format']; 00168 $data->feedback = $data->feedback['text']; 00169 } 00170 00171 $old_grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true); //might not exist yet 00172 00173 // fix no grade for scales 00174 if (!isset($data->finalgrade) or $data->finalgrade == $data->oldgrade) { 00175 $data->finalgrade = $old_grade_grade->finalgrade; 00176 00177 } else if ($grade_item->gradetype == GRADE_TYPE_SCALE) { 00178 if ($data->finalgrade < 1) { 00179 $data->finalgrade = NULL; 00180 } 00181 00182 } else if ($grade_item->gradetype == GRADE_TYPE_VALUE) { 00183 $data->finalgrade = unformat_float($data->finalgrade); 00184 00185 } else { 00186 //this should not happen 00187 $data->finalgrade = $old_grade_grade->finalgrade; 00188 } 00189 00190 // the overriding of feedback is tricky - we have to care about external items only 00191 if (!property_exists($data, 'feedback') or $data->feedback == $data->oldfeedback) { 00192 $data->feedback = $old_grade_grade->feedback; 00193 $data->feedbackformat = $old_grade_grade->feedbackformat; 00194 } 00195 // update final grade or feedback 00196 $grade_item->update_final_grade($data->userid, $data->finalgrade, 'editgrade', $data->feedback, $data->feedbackformat); 00197 00198 $grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true); 00199 $grade_grade->grade_item =& $grade_item; // no db fetching 00200 00201 if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:edit', $context)) { 00202 if (!grade_floats_different($data->finalgrade, $old_grade_grade->finalgrade) 00203 and $data->feedback === $old_grade_grade->feedback) { 00204 // change overridden flag only if grade or feedback not changed 00205 if (!isset($data->overridden)) { 00206 $data->overridden = 0; // checkbox 00207 } 00208 $grade_grade->set_overridden($data->overridden); 00209 } 00210 } 00211 00212 if (has_capability('moodle/grade:manage', $context) or has_capability('moodle/grade:hide', $context)) { 00213 $hidden = empty($data->hidden) ? 0: $data->hidden; 00214 $hiddenuntil = empty($data->hiddenuntil) ? 0: $data->hiddenuntil; 00215 00216 if ($grade_item->is_hidden()) { 00217 if ($old_grade_grade->hidden == 1 and $hiddenuntil == 0) { 00218 //nothing to do - grade was originally hidden, we want to keep it that way 00219 } else { 00220 $grade_grade->set_hidden($hiddenuntil); 00221 } 00222 } else { 00223 if ($hiddenuntil) { 00224 $grade_grade->set_hidden($hiddenuntil); 00225 } else { 00226 $grade_grade->set_hidden($hidden); // checkbox data might be undefined 00227 } 00228 } 00229 } 00230 00231 if (isset($data->locked) and !$grade_item->is_locked()) { 00232 if (($old_grade_grade->locked or $old_grade_grade->locktime) 00233 and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:unlock', $context))) { 00234 //ignore data 00235 00236 } else if ((!$old_grade_grade->locked and !$old_grade_grade->locktime) 00237 and (!has_capability('moodle/grade:manage', $context) and !has_capability('moodle/grade:lock', $context))) { 00238 //ignore data 00239 00240 } else { 00241 $grade_grade->set_locktime($data->locktime); //set_lock may reset locktime 00242 $grade_grade->set_locked($data->locked, false, true); 00243 // reload grade in case it was regraded from activity 00244 $grade_grade = new grade_grade(array('userid'=>$data->userid, 'itemid'=>$grade_item->id), true); 00245 $grade_grade->grade_item =& $grade_item; // no db fetching 00246 } 00247 } 00248 00249 if (isset($data->excluded) and has_capability('moodle/grade:manage', $context)) { 00250 $grade_grade->set_excluded($data->excluded); 00251 } 00252 00253 // detect cases when we need to do full regrading 00254 if ($old_grade_grade->excluded != $grade_grade->excluded) { 00255 $parent = $grade_item->get_parent_category(); 00256 $parent->force_regrading(); 00257 00258 } else if ($old_grade_grade->overridden != $grade_grade->overridden and empty($grade_grade->overridden)) { // only when unoverridding 00259 $grade_item->force_regrading(); 00260 00261 } else if ($old_grade_grade->locktime != $grade_grade->locktime) { 00262 $grade_item->force_regrading(); 00263 } 00264 00265 redirect($returnurl); 00266 } 00267 00268 $strgrades = get_string('grades'); 00269 $strgraderreport = get_string('graderreport', 'grades'); 00270 $strgradeedit = get_string('editgrade', 'grades'); 00271 $struser = get_string('user'); 00272 00273 grade_build_nav(__FILE__, $strgradeedit, array('courseid' => $courseid)); 00274 00275 /*********** BEGIN OUTPUT *************/ 00276 $PAGE->set_title($strgrades . ': ' . $strgraderreport . ': ' . $strgradeedit); 00277 $PAGE->set_heading($course->fullname); 00278 00279 echo $OUTPUT->header(); 00280 echo $OUTPUT->heading($strgradeedit); 00281 00282 echo $OUTPUT->box_start(); 00283 00284 // Form if in edit or add modes 00285 $mform->display(); 00286 00287 echo $OUTPUT->box_end(); 00288 00289 echo $OUTPUT->footer(); 00290 die;