1 <?php 2 // This file is part of Moodle - http://moodle.org/ 3 // 4 // Moodle is free software: you can redistribute it and/or modify 5 // it under the terms of the GNU General Public License as published by 6 // the Free Software Foundation, either version 3 of the License, or 7 // (at your option) any later version. 8 // 9 // Moodle is distributed in the hope that it will be useful, 10 // but WITHOUT ANY WARRANTY; without even the implied warranty of 11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 // GNU General Public License for more details. 13 // 14 // You should have received a copy of the GNU General Public License 15 // along with Moodle. If not, see <http://www.gnu.org/licenses/>. 16 17 /** 18 * Functions used to retrieve grades objects 19 * 20 * @package core_grades 21 * @category grade 22 * @copyright 2008 Petr Skoda and Nicolas Connault 23 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later 24 */ 25 26 /** 27 * Returns the aggregated or calculated course grade(s) for a single course for one or more users 28 * 29 * @param int $courseid The ID of course 30 * @param int|array $userid_or_ids Optional ID of the graded user or array of user IDs; if userid not used, returns only information about grade_item 31 * @return stdClass Returns an object containing information about course grade item. scaleid, name, grade 32 * and locked status etc and user course grades: $item->grades[$userid] => $usercoursegrade 33 */ 34 function grade_get_course_grades($courseid, $userid_or_ids=null) { 35 36 $grade_item = grade_item::fetch_course_item($courseid); 37 38 if ($grade_item->needsupdate) { 39 grade_regrade_final_grades($courseid); 40 } 41 42 $item = new stdClass(); 43 $item->scaleid = $grade_item->scaleid; 44 $item->name = $grade_item->get_name(); 45 $item->grademin = $grade_item->grademin; 46 $item->grademax = $grade_item->grademax; 47 $item->gradepass = $grade_item->gradepass; 48 $item->locked = $grade_item->is_locked(); 49 $item->hidden = $grade_item->is_hidden(); 50 $item->grades = array(); 51 52 switch ($grade_item->gradetype) { 53 case GRADE_TYPE_NONE: 54 break; 55 56 case GRADE_TYPE_VALUE: 57 $item->scaleid = 0; 58 break; 59 60 case GRADE_TYPE_TEXT: 61 $item->scaleid = 0; 62 $item->grademin = 0; 63 $item->grademax = 0; 64 $item->gradepass = 0; 65 break; 66 } 67 68 if (empty($userid_or_ids)) { 69 $userids = array(); 70 71 } else if (is_array($userid_or_ids)) { 72 $userids = $userid_or_ids; 73 74 } else { 75 $userids = array($userid_or_ids); 76 } 77 78 if ($userids) { 79 $grade_grades = grade_grade::fetch_users_grades($grade_item, $userids, true); 80 foreach ($userids as $userid) { 81 $grade_grades[$userid]->grade_item =& $grade_item; 82 83 $grade = new stdClass(); 84 $grade->grade = $grade_grades[$userid]->finalgrade; 85 $grade->locked = $grade_grades[$userid]->is_locked(); 86 $grade->hidden = $grade_grades[$userid]->is_hidden(); 87 $grade->overridden = $grade_grades[$userid]->overridden; 88 $grade->feedback = $grade_grades[$userid]->feedback; 89 $grade->feedbackformat = $grade_grades[$userid]->feedbackformat; 90 $grade->usermodified = $grade_grades[$userid]->usermodified; 91 $grade->dategraded = $grade_grades[$userid]->get_dategraded(); 92 $grade->datesubmitted = $grade_grades[$userid]->get_datesubmitted(); 93 94 // create text representation of grade 95 if ($grade_item->needsupdate) { 96 $grade->grade = false; 97 $grade->str_grade = get_string('error'); 98 $grade->str_long_grade = $grade->str_grade; 99 100 } else if (is_null($grade->grade)) { 101 $grade->str_grade = '-'; 102 $grade->str_long_grade = $grade->str_grade; 103 104 } else { 105 $grade->str_grade = grade_format_gradevalue($grade->grade, $grade_item); 106 if ($grade_item->gradetype == GRADE_TYPE_SCALE or $grade_item->get_displaytype() != GRADE_DISPLAY_TYPE_REAL) { 107 $grade->str_long_grade = $grade->str_grade; 108 } else { 109 $a = new stdClass(); 110 $a->grade = $grade->str_grade; 111 $a->max = grade_format_gradevalue($grade_item->grademax, $grade_item); 112 $grade->str_long_grade = get_string('gradelong', 'grades', $a); 113 } 114 } 115 116 // create html representation of feedback 117 if (is_null($grade->feedback)) { 118 $grade->str_feedback = ''; 119 } else { 120 $grade->str_feedback = format_text($grade->feedback, $grade->feedbackformat); 121 } 122 123 $item->grades[$userid] = $grade; 124 } 125 } 126 127 return $item; 128 } 129 130 /** 131 * Returns the aggregated or calculated course grade for a single user for one or more courses 132 * 133 * @param int $userid The ID of the single user 134 * @param int|array $courseid_or_ids Optional ID of course or array of IDs, empty means all of the user's courses 135 * @return mixed grade info or grades array including item info, false if error 136 */ 137 function grade_get_course_grade($userid, $courseid_or_ids=null) { 138 139 if (!is_array($courseid_or_ids)) { 140 if (empty($courseid_or_ids)) { 141 if (!$courses = enrol_get_users_courses($userid)) { 142 return false; 143 } 144 $courseids = array_keys($courses); 145 return grade_get_course_grade($userid, $courseids); 146 } 147 if (!is_numeric($courseid_or_ids)) { 148 return false; 149 } 150 if (!$grades = grade_get_course_grade($userid, array($courseid_or_ids))) { 151 return false; 152 } else { 153 // only one grade - not array 154 $grade = reset($grades); 155 return $grade; 156 } 157 } 158 159 foreach ($courseid_or_ids as $courseid) { 160 $grade_item = grade_item::fetch_course_item($courseid); 161 $course_items[$grade_item->courseid] = $grade_item; 162 } 163 164 $grades = array(); 165 foreach ($course_items as $grade_item) { 166 if ($grade_item->needsupdate) { 167 grade_regrade_final_grades($courseid); 168 } 169 170 $item = new stdClass(); 171 $item->scaleid = $grade_item->scaleid; 172 $item->name = $grade_item->get_name(); 173 $item->grademin = $grade_item->grademin; 174 $item->grademax = $grade_item->grademax; 175 $item->gradepass = $grade_item->gradepass; 176 $item->locked = $grade_item->is_locked(); 177 $item->hidden = $grade_item->is_hidden(); 178 179 switch ($grade_item->gradetype) { 180 case GRADE_TYPE_NONE: 181 break; 182 183 case GRADE_TYPE_VALUE: 184 $item->scaleid = 0; 185 break; 186 187 case GRADE_TYPE_TEXT: 188 $item->scaleid = 0; 189 $item->grademin = 0; 190 $item->grademax = 0; 191 $item->gradepass = 0; 192 break; 193 } 194 $grade_grade = new grade_grade(array('userid'=>$userid, 'itemid'=>$grade_item->id)); 195 $grade_grade->grade_item =& $grade_item; 196 197 $grade = new stdClass(); 198 $grade->grade = $grade_grade->finalgrade; 199 $grade->locked = $grade_grade->is_locked(); 200 $grade->hidden = $grade_grade->is_hidden(); 201 $grade->overridden = $grade_grade->overridden; 202 $grade->feedback = $grade_grade->feedback; 203 $grade->feedbackformat = $grade_grade->feedbackformat; 204 $grade->usermodified = $grade_grade->usermodified; 205 $grade->dategraded = $grade_grade->get_dategraded(); 206 $grade->item = $item; 207 208 // create text representation of grade 209 if ($grade_item->needsupdate) { 210 $grade->grade = false; 211 $grade->str_grade = get_string('error'); 212 $grade->str_long_grade = $grade->str_grade; 213 214 } else if (is_null($grade->grade)) { 215 $grade->str_grade = '-'; 216 $grade->str_long_grade = $grade->str_grade; 217 218 } else { 219 $grade->str_grade = grade_format_gradevalue($grade->grade, $grade_item); 220 if ($grade_item->gradetype == GRADE_TYPE_SCALE or $grade_item->get_displaytype() != GRADE_DISPLAY_TYPE_REAL) { 221 $grade->str_long_grade = $grade->str_grade; 222 } else { 223 $a = new stdClass(); 224 $a->grade = $grade->str_grade; 225 $a->max = grade_format_gradevalue($grade_item->grademax, $grade_item); 226 $grade->str_long_grade = get_string('gradelong', 'grades', $a); 227 } 228 } 229 230 // create html representation of feedback 231 if (is_null($grade->feedback)) { 232 $grade->str_feedback = ''; 233 } else { 234 $grade->str_feedback = format_text($grade->feedback, $grade->feedbackformat); 235 } 236 237 $grades[$grade_item->courseid] = $grade; 238 } 239 240 return $grades; 241 } 242 243 /** 244 * Returns all grade items (including outcomes) or main item for a given activity identified by $cm object. 245 * 246 * @param cm_info $cm A course module object (preferably with modname property) 247 * @param bool $only_main_item Limit the search to the primary grade item for the activity, 'itemnumber'==0 248 * @return mixed An array of grade item instances, one grade item if $only_main_item == true, false if error or not found 249 */ 250 function grade_get_grade_items_for_activity($cm, $only_main_item=false) { 251 global $CFG, $DB; 252 253 if (!isset($cm->modname)) { 254 $params = array($cm->id); 255 $cm = $DB->get_record_sql("SELECT cm.*, md.name as modname 256 FROM {course_modules} cm, 257 {modules} md 258 WHERE cm.id = ? AND md.id = cm.module", $params); 259 } 260 261 262 if (empty($cm) or empty($cm->instance) or empty($cm->course)) { 263 debugging("Incorrect cm parameter in grade_get_grade_items_for_activity()!"); 264 return false; 265 } 266 267 if ($only_main_item) { 268 return grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$cm->modname, 'iteminstance'=>$cm->instance, 'courseid'=>$cm->course, 'itemnumber'=>0)); 269 } else { 270 return grade_item::fetch_all(array('itemtype'=>'mod', 'itemmodule'=>$cm->modname, 'iteminstance'=>$cm->instance, 'courseid'=>$cm->course)); 271 } 272 } 273 274 /** 275 * Returns whether or not a user received grades in main grade item for given activity 276 * 277 * @param cm_info $cm The activity context module 278 * @param int $userid The user ID 279 * @return bool True if graded, false if user not graded yet 280 */ 281 function grade_is_user_graded_in_activity($cm, $userid) { 282 283 $grade_items = grade_get_grade_items_for_activity($cm, true); 284 if (empty($grade_items)) { 285 return false; 286 } 287 288 $grade_item = reset($grade_items); 289 290 if ($grade_item->gradetype == GRADE_TYPE_NONE) { 291 return false; 292 } 293 294 if ($grade_item->needsupdate) { 295 // activity items should never fail to regrade 296 grade_regrade_final_grades($grade_item->courseid); 297 } 298 299 if (!$grade = $grade_item->get_final($userid)) { 300 return false; 301 } 302 303 if (is_null($grade->finalgrade)) { 304 return false; 305 } 306 307 return true; 308 } 309 310 /** 311 * Returns an array of activities (defined as $cm objects) which are gradeable from gradebook, outcomes are ignored. 312 * 313 * @param int $courseid If provided then restrict to one course. 314 * @param string $modulename If defined (could be 'forum', 'assignment' etc) then only that type are returned. 315 * @return array $cm objects 316 */ 317 function grade_get_gradable_activities($courseid, $modulename='') { 318 global $CFG, $DB; 319 320 if (empty($modulename)) { 321 if (!$modules = $DB->get_records('modules', array('visible' => '1'))) { 322 return false; 323 } 324 $result = array(); 325 foreach ($modules as $module) { 326 if ($cms = grade_get_gradable_activities($courseid, $module->name)) { 327 $result = $result + $cms; 328 } 329 } 330 if (empty($result)) { 331 return false; 332 } else { 333 return $result; 334 } 335 } 336 337 $params = array($courseid, $modulename, GRADE_TYPE_NONE, $modulename); 338 $sql = "SELECT cm.*, m.name, md.name as modname 339 FROM {grade_items} gi, {course_modules} cm, {modules} md, {{$modulename}} m 340 WHERE gi.courseid = ? AND 341 gi.itemtype = 'mod' AND 342 gi.itemmodule = ? AND 343 gi.itemnumber = 0 AND 344 gi.gradetype != ? AND 345 gi.iteminstance = cm.instance AND 346 cm.instance = m.id AND 347 md.name = ? AND 348 md.id = cm.module"; 349 350 return $DB->get_records_sql($sql, $params); 351 } 352
title
Description
Body
title
Description
Body
title
Description
Body
title
Body