}
}
- // attemps to grab grades from third party/non-stard mods that still have xxx_grades() in lib.php
- // which was obsoleted in 1.9.
- mtrace("Grabbing grades from older modules if required...");
- include_once($CFG->dirroot.'/lib/gradelib.php');
- grade_grab_legacy_grades();
-
} // End of occasional clean-up tasks
$handlers = array (
-
-/*
- * Grades added by activities
- *
- * required parameters (object or array):
- * itemid - if from grade_items table, grade item must already exist
- * userid - each grade must be associated to existing user
- *
- * optional params:
- * gradevalue - raw grade value
- * feedback - graders feedback
- * feedbackformat - text format of the feedback
- */
- 'grade_updated' => array (
- 'handlerfile' => '/lib/gradelib.php',
- 'handlerfunction' => 'grade_handler',
- 'schedule' => 'instant'
- ),
-
/*
* Grades created/modified outside of activities (import, gradebook overrides, etc.)
*
* required parameters (object or array):
- * itemid - id from grade_items table, grade item must already exist
+ * idnumber - idnumber from grade_items table
* userid - each grade must be associated with existing user
*
* optional params:
* gradevalue - raw grade value
* feedback - graders feedback
* feedbackformat - text format of the feedback
- *
- * optional params (improves performance):
- * itemtype - mod, block
- * itemmodule - assignment, etc.
*/
- 'grade_updated_external' => array (
+ 'grade_update_request' => array (
'handlerfile' => '/lib/gradelib.php',
'handlerfunction' => 'grade_handler',
'schedule' => 'instant'
)
);
-
?>
<FIELD NAME="itemnumber" TYPE="int" LENGTH="10" NOTNULL="false" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="Can be used to distinguish multiple grades for an activity" PREVIOUS="iteminstance" NEXT="iteminfo"/>
<FIELD NAME="iteminfo" TYPE="text" LENGTH="medium" NOTNULL="true" SEQUENCE="false" ENUM="false" COMMENT="Info and notes about this item XXX" PREVIOUS="itemnumber" NEXT="idnumber"/>
<FIELD NAME="idnumber" TYPE="char" LENGTH="255" NOTNULL="false" SEQUENCE="false" ENUM="false" COMMENT="Arbitrary idnumber provided by the module responsible" PREVIOUS="iteminfo" NEXT="gradetype"/>
- <FIELD NAME="gradetype" TYPE="int" LENGTH="4" NOTNULL="true" UNSIGNED="false" DEFAULT="1" SEQUENCE="false" ENUM="false" COMMENT="0 = value, 1 = scale, 2 = text" PREVIOUS="idnumber" NEXT="grademax"/>
+ <FIELD NAME="gradetype" TYPE="int" LENGTH="4" NOTNULL="true" UNSIGNED="false" DEFAULT="1" SEQUENCE="false" ENUM="false" COMMENT="0 = none, 1 = value, 2 = scale, 3 = text" PREVIOUS="idnumber" NEXT="grademax"/>
<FIELD NAME="grademax" TYPE="number" LENGTH="10" NOTNULL="true" UNSIGNED="false" DEFAULT="100" SEQUENCE="false" ENUM="false" DECIMALS="5" COMMENT="What is the maximum allowable grade?" PREVIOUS="gradetype" NEXT="grademin"/>
<FIELD NAME="grademin" TYPE="number" LENGTH="10" NOTNULL="true" UNSIGNED="false" DEFAULT="0" SEQUENCE="false" ENUM="false" DECIMALS="5" COMMENT="What is the minimum allowable grade?" PREVIOUS="grademax" NEXT="scaleid"/>
<FIELD NAME="scaleid" TYPE="int" LENGTH="10" NOTNULL="false" UNSIGNED="true" SEQUENCE="false" ENUM="false" COMMENT="If this grade is based on a scale, which one is it?" PREVIOUS="grademin" NEXT="outcomeid"/>
events_queue_handler($handler, $event, $errormessage);
}
} else {
- debugging("No handler found for event: $eventname");
+ //debugging("No handler found for event: $eventname");
}
return $failedcount;
if (!empty($this->outcome->id)) {
$this->outcomeid = $this->outcome->id;
}
-
+
+ if (!isset($this->gradetype)) {
+ $this->gradetype = GRADE_TYPE_VALUE;
+ }
+
+ if (empty($this->scaleid) and !empty($this->scale->id)) {
+ $this->scaleid = $this->scale->id;
+ }
+
// Retrieve scale and infer grademax from it
- if (!empty($this->scaleid)) {
+ if ($this->gradetype == GRADE_TYPE_SCALE and !empty($this->scaleid)) {
$this->load_scale();
if (!method_exists($this->scale, 'load_items')) {
$this->scale->load_items();
$this->grademax = count ($this->scale->scale_items);
$this->grademin = 0;
- $this->gradetype = GRADE_TYPE_SCALE;
- }
-
- if (!empty($this->scale->id)) {
- $this->scaleid = $this->scale->id;
+ } else {
+ $this->scaleid = NULL;
+ unset($this->scale);
}
$qualifies = $this->qualifies_for_update();
function insert() {
global $CFG;
+ if (!isset($this->gradetype)) {
+ $this->gradetype = GRADE_TYPE_VALUE;
+ }
+
+ if (empty($this->scaleid) and !empty($this->scale->id)) {
+ $this->scaleid = $this->scale->id;
+ }
+
// Retrieve scale and infer grademax from it
- if (!empty($this->scaleid)) {
+ if ($this->gradetype == GRADE_TYPE_SCALE and !empty($this->scaleid)) {
$this->load_scale();
$this->scale->load_items();
$this->grademax = count ($this->scale->scale_items);
$this->grademin = 0;
- $this->gradetype = GRADE_TYPE_SCALE;
+ } else {
+ $this->scaleid = NULL;
+ unset($this->scale);
}
// If not set, infer courseid from referenced category
define('GRADE_AGGREGATE_MEDIAN', 1);
define('GRADE_AGGREGATE_SUM', 2);
define('GRADE_AGGREGATE_MODE', 3);
+
define('GRADE_CHILDTYPE_ITEM', 0);
define('GRADE_CHILDTYPE_CAT', 1);
+
define('GRADE_ITEM', 0); // Used to compare class names with CHILDTYPE values
define('GRADE_CATEGORY', 1); // Used to compare class names with CHILDTYPE values
+
define('GRADE_TYPE_NONE', 0);
define('GRADE_TYPE_VALUE', 1);
define('GRADE_TYPE_SCALE', 2);
define('GRADE_TYPE_TEXT', 3);
+define('GRADE_UPDATE_OK', 0);
+define('GRADE_UPDATE_FAILED', 1);
+define('GRADE_UPDATE_MULTIPLE', 2);
+define('GRADE_UPDATE_ITEM_DELETED', 3);
+define('GRADE_UPDATE_INVALID_GRADE', 4);
+define('GRADE_UPDATE_LOCKED', 5);
+
+
require_once($CFG->libdir . '/grade/grade_category.php');
require_once($CFG->libdir . '/grade/grade_item.php');
require_once($CFG->libdir . '/grade/grade_calculation.php');
require_once($CFG->libdir . '/grade/grade_grades_text.php');
require_once($CFG->libdir . '/grade/grade_tree.php');
+/***** PUBLIC GRADE API *****/
+
+function grade_update($courseid, $itemtype, $itemmodule, $iteminstance, $itemnumber, $grade=NULL, $itemdetails=NULL) {
+
+ // only following grade_item properties can be changed/used in this function
+ $allowed = array('itemname', 'idnumber', 'gradetype', 'grademax', 'grademin', 'scaleid', 'deleted');
+
+ if (is_null($courseid) or is_null($itemtype)) {
+ debugging('Missing courseid or itemtype');
+ return GRADE_UPDATE_FAILED;
+ }
+
+ $grade_item = new grade_item(compact('courseid', 'itemtype', 'itemmodule', 'iteminstance', 'itemnumber'), false);
+ if (!$grade_items = $grade_item->fetch_all_using_this()) {
+ // create a new one
+ $grade_item = false;
+
+ } else if (count($grade_items) == 1){
+ $grade_item = reset($grade_items);
+ unset($grade_items); //release memory
+
+ } else {
+
+ debugging('Found more than one grading item');
+ return GRADE_UPDATE_MULTIPLE;
+ }
+
+/// Create or update the grade_item if needed
+ if (!$grade_item) {
+ $params = compact('courseid', 'itemtype', 'itemmodule', 'iteminstance', 'itemnumber');
+ if ($itemdetails) {
+ $itemdetails = (array)$itemdetails;
+ foreach ($itemdetails as $k=>$v) {
+ if (!in_array($k, $allowed)) {
+ // ignore it
+ continue;
+ }
+ if ($k == 'gradetype' and $v == GRADE_TYPE_NONE) {
+ // no grade item needed!
+ return GRADE_UPDATE_OK;
+ }
+ $params[$k] = $v;
+ }
+ }
+ $itemid = grade_create_item($params);
+ $grade_item = grade_item::fetch('id', $itemid);
+
+ } else {
+ if ($grade_item->locked) {
+ debugging('Grading item is locked!');
+ return GRADE_UPDATE_LOCKED;
+ }
+
+ if ($itemdetails) {
+ $itemdetails = (array)$itemdetails;
+ $update = false;
+ foreach ($itemdetails as $k=>$v) {
+ if (!in_array($k, $allowed)) {
+ // ignore it
+ continue;
+ }
+ if ($grade_item->{$k} != $v) {
+ $grade_item->{$k} = $v;
+ $update = true;
+ }
+ }
+ if ($update) {
+ $grade_item->update();
+ }
+ }
+ }
+
+/// Some extra checks
+ // do we use grading?
+ if ($grade_item->gradetype == GRADE_TYPE_NONE) {
+ return GRADE_UPDATE_OK;
+ }
+
+ // no grade submitted
+ if (empty($grade)) {
+ return GRADE_UPDATE_OK;
+ }
+
+ // no grading in deleted items
+ if ($grade_item->deleted) {
+ debugging('Grade item was already deleted!');
+ return GRADE_UPDATE_ITEM_DELETED;
+ }
+
+/// Finally start processing of grades
+ if (is_object($grade)) {
+ $grades = array($grade);
+ } else {
+ if (array_key_exists('userid', $grade)) {
+ $grades = array($grade);
+ } else {
+ $grades = $grade;
+ }
+ }
+
+ unset($grade);
+
+ foreach ($grades as $grade) {
+ $grade = (array)$grade;
+ if (empty($grade['userid'])) {
+ debugging('Invalid grade submitted');
+ return GRADE_UPDATE_INVALID_GRADE;
+ }
+
+ // get the raw grade if it exist
+ $rawgrade = new grade_grades_raw(array('itemid'=>$grade_item->id, 'userid'=>$grade['userid']));
+ $rawgrade->grade_item = &$grade_item; // we already have it, so let's use it
+
+ // store these to keep track of original grade item settings
+ $rawgrade->grademax = $grade_item->grademax;
+ $rawgrade->grademin = $grade_item->grademin;
+ $rawgrade->scaleid = $grade_item->scaleid;
+
+ if (isset($grade['feedback'])) {
+ $rawgrade->feedback = $grade['feedback'];
+ if (isset($grade['feedbackformat'])) {
+ $rawgrade->feedbackformat = $grade['feedbackformat'];
+ } else {
+ $rawgrade->feedbackformat = FORMAT_PLAIN;
+ }
+ }
+
+ if (!isset($grade['gradevalue'])) {
+ $grade['gradevalue'] = null; // means no grade yet
+ }
+
+ if ($rawgrade->id) {
+ $rawgrade->update($grade['gradevalue'], 'event');
+ } else {
+ $rawgrade->gradevalue = $grade['gradevalue'];
+ $rawgrade->insert();
+ }
+
+ //trigger grade_updated event notification
+ $eventdata = new object();
+ $eventdata->itemid = $grade_item->id;
+ $eventdata->grade = $grade;
+ events_trigger('grade_updated', $eventdata);
+ }
+
+ return GRADE_UPDATE_OK;
+}
+
+/***** END OF PUBLIC API *****/
+
/**
-* Extracts from the gradebook all the grade items attached to the calling object.
-* For example, an assignment may want to retrieve all the grade_items for itself,
+* Extracts from the gradebook all the grade items attached to the calling object.
+* For example, an assignment may want to retrieve all the grade_items for itself,
* and get three outcome scales in return. This will affect the grading interface.
*
* Note: Each parameter refines the search. So if you only give the courseid,
* all the grade_items for this course will be returned. If you add the
* itemtype 'mod', all grade_items for this courseif AND for the 'mod'
* type will be returned, etc...
-*
+*
* @param int $courseid The id of the course to which the grade items belong
* @param string $itemtype 'mod', 'blocks', 'import', 'calculated' etc
* @param string $itemmodule 'forum, 'quiz', 'csv' etc
*/
function grade_create_item($params) {
$grade_item = new grade_item($params);
-
+
if (empty($grade_item->id)) {
return $grade_item->insert();
} else {
*/
function grade_create_category($courseid, $fullname, $items, $aggregation=GRADE_AGGREGATE_MEAN) {
$grade_category = new grade_category(compact('courseid', 'fullname', 'items', 'aggregation'));
-
+
if (empty($grade_category->id)) {
return $grade_category->insert();
} else {
* If it's locked to the current use then the module can print a nice message or prevent editing in the module.
* If no $userid is given, the method will always return the grade_item's locked state.
* If a $userid is given, the method will first check the grade_item's locked state (the column). If it is locked,
-* the method will return true no matter the locked state of the specific grade being checked. If unlocked, it will
+* the method will return true no matter the locked state of the specific grade being checked. If unlocked, it will
* return the locked state of the specific grade.
*
* @param string $itemtype 'mod', 'blocks', 'import', 'calculated' etc
function grade_is_locked($itemtype, $itemmodule, $iteminstance, $itemnumber=NULL, $userid=NULL) {
$grade_item = new grade_item(compact('itemtype', 'itemmodule', 'iteminstance', 'itemnumber'));
return $grade_item->is_locked($userid);
-}
+}
/**
* Updates all grade_grades_final for each grade_item matching the given attributes.
$grade_item->courseid = $courseid;
$grade_item->id = $gradeitemid;
$grade_items = $grade_item->fetch_all_using_this();
-
+
$count = 0;
foreach ($grade_items as $gi) {
* For backward compatibility with old third-party modules, this function is called
* via to admin/cron.php to search all mod/xxx/lib.php files for functions named xxx_grades(),
* if the current modules does not have grade events registered with the grade book.
- * Once the data is extracted, the events_trigger() function can be called to initiate
- * an event as usual and copy/ *upgrade the data in the gradebook tables.
+ * Once the data is extracted, the events_trigger() function can be called to initiate
+ * an event as usual and copy/ *upgrade the data in the gradebook tables.
*/
function grade_grab_legacy_grades() {
-
+
global $CFG, $db;
if (!$mods = get_list_of_plugins('mod') ) {
$grademax = $grades->maxgrade;
$scaleid = 0;
- if (!is_numeric($grademax)) {
+ if (!is_numeric($grademax)) {
// scale name is provided as a string, try to find it
if (!$scale = get_record('scale', 'name', $grademax)) {
debugging('Incorrect scale name! name:'.$grademax);
continue;
}
- foreach ($grades->grades as $userid=>$usergrade) {
+ foreach ($grades->grades as $userid=>$usergrade) {
// make the grade_added eventdata
$eventdata = new object();
$eventdata->itemid = $grade_item->id;
return $grade_item;
}
-
+
// create new one
$params = array('courseid' =>$modinstance->courseid,
'itemtype' =>'mod',
'idnumber' =>$modinstance->cmidnumber);
if ($scaleid) {
- $params['gradetype'] = GRADE_TYPE_SCALE;
+ $params['gradetype'] = GRADE_TYPE_SCALE;
$params['scaleid'] = $scaleid;
} else {
- $params['gradetype'] = GRADE_TYPE_VALUE;
+ $params['gradetype'] = GRADE_TYPE_VALUE;
$params['grademax'] = $grademax;
$params['grademin'] = 0;
}
'target_max' => $target_max,
'result' => $standardised_value));
}
- return $standardised_value;
+ return $standardised_value;
}
/**
- * Handles all grade_updated and grade_updated_external events,
+ * Handles some specific grade_update_request events,
* see lib/db/events.php for description of $eventdata format.
*
* @param object $eventdata contains all the data for the event
return true;
}
- // grade item must be specified or else it could be accidentally duplicated,
- if (empty($eventdata['itemid'])) {
- debugging('Missing grade item id in event!');
+ // grade item idnumber must be specified or else it could be accidentally duplicated,
+ if (empty($eventdata['idnumber'])) {
+ debugging('Missing grade item idnumber in event!');
return true;
}
// get the grade item from db
- if (!$gradeitem = grade_item::fetch('id', $eventdata['itemid'])) {
- debugging('Incorrect grade item id in event! id:'.$eventdata['itemid']);
+ $grade_item = new grade_item(array('idnumber'=>$eventdata['idnumber']), false);
+ if (!$grade_items = $grade_item->fetch_all_using_this()) {
+ // TODO: create a new one - tricky, watch out for duplicates !!
+ // use only special type 'import'(y) or 'manual'(?)
+ debugging('Can not create new grade items yet :-(');
return true;
- }
- // get the raw grade if it exist
- $rawgrade = new grade_grades_raw(array('itemid'=>$gradeitem->id, 'userid'=>$eventdata['userid']));
- $rawgrade->grade_item = &$gradeitem; // we already have it, so let's use it
+ } else if (count($grade_items) == 1) {
+ $grade_item = reset($grade_items);
+ unset($grade_items); //release memory
- // store these to keep track of original grade item settings
- $rawgrade->grademax = $gradeitem->grademax;
- $rawgrade->grademin = $gradeitem->grademin;
- $rawgrade->scaleid = $gradeitem->scaleid;
+ } else {
+ debugging('More than one grade item matched, grade update request failed');
+ return true;
+ }
- if (isset($eventdata['feedback'])) {
- $rawgrade->feedback = $eventdata['feedback'];
- if (isset($eventdata['feedbackformat'])) {
- $rawgrade->feedbackformat = $eventdata['feedbackformat'];
- } else {
- $rawgrade->feedbackformat = FORMAT_PLAIN;
- }
+ // !! TODO: whitelist only some types such as 'import'(?) 'manual'(?) and ignore the rest!!
+ if ($grade_item->itemtype == 'mnod') {
+ // modules must have own handlers for grade update requests
+ return true;
+ }
+ $grade = new object();
+ $grade->userid = $eventdata['userid'];
+ if (isset($eventdata['gradevalue'])) {
+ $grade->feedback = $eventdata['gradevalue'];
}
- if (!isset($eventdata['gradevalue'])) {
- $eventdata['gradevalue'] = null; // means no grade yet
+ if (isset($eventdata['feedback'])) {
+ $grade->feedback = $eventdata['feedback'];
}
- if ($rawgrade->id) {
- $rawgrade->update($eventdata['gradevalue'], 'event');
- } else {
- $rawgrade->gradevalue = $eventdata['gradevalue'];
- $rawgrade->insert();
+ if (isset($eventdata['feedbackformat'])) {
+ $grade->feedbackformat = $eventdata['feedbackformat'];
}
+ grade_update($grade_item->courseid, $grade_item->itemtype, $grade_item->itemmodule,
+ $grade_item->iteminstance, $grade_item->itemnumber, $grade, $eventdata);
+
// everything ok :-)
return true;
*/
'grade_updated_external' => array (
'handlerfile' => '/mod/assignment/lib.php',
- 'handlerfunction' => 'assignment_external_grade_handler',
+ 'handlerfunction' => 'assignment_grade_update_handler',
'schedule' => 'instant'
)
);
$result = true;
- if ($result && $oldversion < 2007052700) {
+ if ($result && $oldversion < 2007060600) {
require_once $CFG->dirroot.'/mod/assignment/lib.php';
// too much debug output
$db->debug = false;
}
$assignment = stripslashes_recursive($assignment);
- assignment_grade_item_create($assignment);
+ assignment_grade_item_update($assignment);
}
$result = false;
}
- // Get the cm id to properly clean up the grade_items for this assignment
- // bug 4976
- if (! $cm = get_record('modules', 'name', 'assignment')) {
- $result = false;
- } else {
- if (! delete_records('grade_item', 'modid', $cm->id, 'cminstance', $assignment->id)) {
- $result = false;
- }
- }
-
// delete file area with all attachments - ignore errors
require_once($CFG->libdir.'/filelib.php');
fulldelete($CFG->dataroot.'/'.$assignment->course.'/'.$CFG->moddata.'/assignment/'.$assignment->id);
* Update grade item for this submission.
*/
function update_grade($submission) {
- $grade_item = assignment_grade_item_get($this->assignment);
- assignment_update_grades($grade_item, $submission->userid);
+ assignment_update_grades($this->assignment, $submission->userid);
}
/**
* @param int $userid optional user id, 0 means all users
* @return array array of grades, false if none
*/
-function assignment_get_user_grades($assignmentid, $userid=0) {
+function assignment_get_user_grades($assignment, $userid=0) {
global $CFG;
$user = $userid ? "AND u.id = $userid" : "";
- $sql = "SELECT u.id, s.grade AS gradevalue, s.submissioncomment AS feedback, s.format AS feedbackformat
+ $sql = "SELECT u.id, u.id AS userid, s.grade AS gradevalue, s.submissioncomment AS feedback, s.format AS feedbackformat
FROM {$CFG->prefix}user u, {$CFG->prefix}assignment_submissions s
- WHERE u.id = s.userid AND s.assignment = $assignmentid
+ WHERE u.id = s.userid AND s.assignment = $assignment->id
$user";
return get_records_sql($sql);
/**
* Update grades by firing grade_updated event
*
- * @param object $grade_item null means all assignments
+ * @param object $assignment null means all assignments
* @param int $userid specific user only, 0 mean all
*/
-function assignment_update_grades($grade_item=null, $userid=0, $nullifnone=true) {
+function assignment_update_grades($assignment=null, $userid=0, $nullifnone=true) {
global $CFG;
+ if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+ require_once($CFG->libdir.'/gradelib.php');
+ }
- if ($grade_item != null) {
- if ($grades = assignment_get_user_grades($grade_item->iteminstance, $userid)) {
- foreach ($grades as $grade) {
- $eventdata = new object();
- $eventdata->itemid = $grade_item->id;
- $eventdata->userid = $grade->id;
- if ($grade->gradevalue < 0) {
- $eventdata->gradevalue = null;
- } else {
- $eventdata->gradevalue = $grade->gradevalue;
+ if ($assignment != null) {
+ if ($grades = assignment_get_user_grades($assignment, $userid)) {
+ foreach($grades as $k=>$v) {
+ if ($v->gradevalue == -1) {
+ $grades[$k]->gradevalue = null;
}
- $eventdata->feedback = $grade->feedback;
- $eventdata->feedbackformat = $grade->feedbackformat;
- events_trigger('grade_updated', $eventdata);
}
+ grade_update($assignment->courseid, 'mod', 'assignment', $assignment->id, 0, $grades);
}
} else {
if ($rs = get_recordset_sql($sql)) {
if ($rs->RecordCount() > 0) {
while ($assignment = rs_fetch_next_record($rs)) {
- $grade_item = assignment_grade_item_get($assignment);
- assignment_update_grades($grade_item);
+ assignment_grade_item_update($assignment);
+ if ($assignment->grade != 0) {
+ assignment_update_grades($assignment);
+ }
}
}
rs_close($rs);
}
/**
- * Return (create if needed) grade item for given assignment
- *
- * @param object $assignment object with optional cmidnumber
- * @return object grade_item
- */
-function assignment_grade_item_get($assignment) {
- if (!isset($assignment->courseid)) {
- $assignment->courseid = $assignment->course;
- }
-
- if ($items = grade_get_items($assignment->courseid, 'mod', 'assignment', $assignment->id)) {
- if (count($items) > 1) {
- debugging('Multiple grade items present!');
- }
- $grade_item = reset($items);
-
- } else {
- if (!isset($forum->cmidnumber)) {
- if (!$cm = get_coursemodule_from_instance('assignment', $assignment->id)) {
- error("Course Module ID was incorrect");
- }
- $assignment->cmidnumber = $cm->idnumber;
- }
- if (!$itemid = assignment_grade_item_create($assignment)) {
- error('Can not create grade item!');
- }
- $grade_item = grade_item::fetch('id', $itemid);
- }
-
- return $grade_item;
-}
-
-/**
- * Update grade item for given assignment
+ * Create grade item for given assignment
*
* @param object $assignment object with extra cmidnumber
- * @return object grade_item
+ * @return int 0 if ok, error code otherwise
*/
function assignment_grade_item_update($assignment) {
- $grade_item = assignment_grade_item_get($assignment);
-
- $grade_item->itemname = $assignment->name;
- $grade_item->idnumber = $assignment->cmidnumber;
-
- if ($assignment->grade > 0) {
- $grade_item->gradetype = GRADE_TYPE_VALUE;
- $grade_item->grademax = $assignment->grade;
- $grade_item->grademin = 0;
- $grade_item->scaleid = 0;
-
- } else if ($assignment->grade < 0) {
- $grade_item->gradetype = GRADE_TYPE_SCALE;
- $grade_item->scaleid = -$assignment->grade;
-
- } else {
- //how to indicate no grading?
- $grade_item->gradetype = GRADE_TYPE_TEXT;
- $grade_item->grademax = 0;
- $grade_item->grademin = 0;
- $grade_item->scaleid = 0;
+ global $CFG;
+ if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+ require_once($CFG->libdir.'/gradelib.php');
}
- $grade_item->update();
-}
-
-/**
- * Create grade item for given assignment
- *
- * @param object $assignment object with extra cmidnumber
- * @return object grade_item
- */
-function assignment_grade_item_create($assignment) {
if (!isset($assignment->courseid)) {
$assignment->courseid = $assignment->course;
}
- $params = array('courseid' =>$assignment->courseid,
- 'itemtype' =>'mod',
- 'itemmodule' =>'assignment',
- 'iteminstance'=>$assignment->id,
- 'itemname' =>$assignment->name,
- 'idnumber' =>$assignment->cmidnumber);
+ $params = array('itemname'=>$assignment->name, 'idnumber'=>$assignment->cmidnumber);
if ($assignment->grade > 0) {
$params['gradetype'] = GRADE_TYPE_VALUE;
$params['scaleid'] = -$assignment->grade;
} else {
- //how to indicate no grading?
- $params['gradetype'] = GRADE_TYPE_TEXT;
- $params['grademax'] = $assignment->grade;
- $params['grademax'] = 0;
- $params['grademin'] = 0;
+ $params['gradetype'] = GRADE_TYPE_NONE;
}
- $itemid = grade_create_item($params);
- return $itemid;
+ return grade_update($assignment->courseid, 'mod', 'assignment', $assignment->id, 0, NULL, $params);
}
/**
* Delete grade item for given assignment
*
* @param object $assignment object
- * @return object grade_item
+ * @return object assignment
*/
function assignment_grade_item_delete($assignment) {
+ global $CFG;
+ require_once($CFG->libdir.'/gradelib.php');
+
if (!isset($assignment->courseid)) {
$assignment->courseid = $assignment->course;
}
- if ($grade_items = grade_get_items($assignment->courseid, 'mod', 'assignment', $assignment->id)) {
- foreach($grade_items as $grade_item) {
- $grade_item->delete();
- }
- }
+ return grade_update($assignment->courseid, 'mod', 'assignment', $assignment->id, 0, NULL, array('deleted'=>1));
}
/**
*
* see eventdata description in lib/db/events.php
*/
-function assignment_external_grade_handler($eventdata) {
+function assignment_grade_update_handler($eventdata) {
global $CFG, $USER;
- $eventdata = (array)$eventdata;
-
- // each grade must belong to some user
- if (empty($eventdata['userid'])) {
- debugging('Missing user id in event data!');
- return true;
- }
-
- // grade item must be specified or else it could be accidentally duplicated,
- if (empty($eventdata['itemid'])) {
- debugging('Missing grade item id in event!');
- return true;
- }
-
- // shortcut - try first without fetching the grade_item
- if (!empty($eventdata['itemtype']) and !empty($eventdata['itemmodule'])) {
- if ($eventdata['itemtype'] != 'mod' or $eventdata['itemmodule'] != 'assignment') {
- // not our event
- return true;
- }
- }
-
- // get the grade item from db
- if (!$grade_item = grade_item::fetch('id', $eventdata['itemid'])) {
- debugging('Incorrect grade item id in event! id:'.$eventdata['itemid']);
- return true;
- }
-
- //verify it is our event
- if ($grade_item->itemtype != 'mod' or $grade_item->itemmodule != 'assignment') {
- // not our event
- return true;
- }
-
- if (!$assignment = get_record('assignment', 'id', $grade_item->iteminstance)) {
- return true;
- }
- if (! $course = get_record('course', 'id', $assignment->course)) {
- return true;
- }
- if (! $cm = get_coursemodule_from_instance('assignment', $assignment->id, $course->id)) {
- return true;
- }
-
- // Load up the required assignment class
- require_once($CFG->dirroot.'/mod/assignment/type/'.$assignment->assignmenttype.'/assignment.class.php');
- $assignmentclass = 'assignment_'.$assignment->assignmenttype;
- $assignmentinstance = new $assignmentclass($cm->id, $assignment, $cm, $course);
-
- $sub = $assignmentinstance->get_submission((int)$eventdata['userid'], true); // Get or make one
- $submission = new object();
- $submission->id = $sub->id;
- $submission->userid = $sub->userid;
-
- if (isset($eventdata['gradevalue'])) {
- $submission->grade = (int)$eventdata['gradevalue'];
- if ($sub->grade != $submission->grade) {
- $submission->mailed = 0; // Make sure mail goes out (again, even)
- }
- } else {
- $submission->grade = -1;
- }
-
- if (isset($eventdata['feedback'])) {
- $submission->submissioncomment = addslashes($eventdata['feedback']);
- if (isset($eventdata['feedbackformat'])) {
- $submission->format = (int)$eventdata['feedbackformat'];
- } else {
- $submission->format = FORMAT_PLAIN;
- }
- if ($sub->submissioncomment != $submission->submissioncomment) {
- $submission->mailed = 0; // Make sure mail goes out (again, even)
- }
- }
-
- $submission->teacher = $USER->id;
- $submission->timemarked = time();
-
- update_record('assignment_submissions', $submission);
-
- // TODO: add proper logging
- add_to_log($course->id, 'assignment', 'update grades',
- 'submissions.php?id='.$assignment->id.'&user='.$submission->userid, $submission->userid, $cm->id);
+ //TODO: ...
return true;
}
// This fragment is called by /admin/index.php
////////////////////////////////////////////////////////////////////////////////
-$module->version = 2007060300;
+$module->version = 2007060600;
$module->requires = 2007052800; // Requires this Moodle version
$module->cron = 60;
}
- if ($result && $oldversion < 2007060300) {
+ if ($result && $oldversion < 2007060600) {
require_once($CFG->dirroot.'/mod/data/lib.php');
// too much debug output
$db->debug = false;
}
$data = stripslashes_recursive($data);
- data_grade_item_create($data);
+ data_grade_item_update($data);
return $data->id;
}
}
}
-
/**
* Return grade for given user or all users.
*
* @param int $userid optional user id, 0 means all users
* @return array array of grades, false if none
*/
-function data_get_user_grades($dataid, $userid=0) {
+function data_get_user_grades($data, $userid=0) {
global $CFG;
$user = $userid ? "AND u.id = $userid" : "";
- $sql = "SELECT u.id, avg(drt.rating) AS gradevalue
+ $sql = "SELECT u.id, u.id AS userid, avg(drt.rating) AS gradevalue
FROM {$CFG->prefix}user u, {$CFG->prefix}data_records dr,
{$CFG->prefix}data_ratings drt
WHERE u.id = dr.userid AND dr.id = drt.recordid
- AND drt.userid != u.id AND dr.dataid = $dataid
+ AND drt.userid != u.id AND dr.dataid = $data->id
$user
GROUP BY u.id";
/**
* Update grades by firing grade_updated event
*
- * @param object $grade_item null means all databases
+ * @param object $data null means all databases
* @param int $userid specific user only, 0 mean all
*/
-function data_update_grades($grade_item=null, $userid=0, $nullifnone=true) {
+function data_update_grades($data=null, $userid=0, $nullifnone=true) {
global $CFG;
+ if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+ require_once($CFG->libdir.'/gradelib.php');
+ }
- if ($grade_item != null) {
- if ($grades = data_get_user_grades($grade_item->iteminstance, $userid)) {
- foreach ($grades as $grade) {
- $eventdata = new object();
- $eventdata->itemid = $grade_item->id;
- $eventdata->userid = $grade->id;
- $eventdata->gradevalue = $grade->gradevalue;
- events_trigger('grade_updated', $eventdata);
- }
+ if ($data != null) {
+ if ($grades = data_get_user_grades($data, $userid)) {
+ grade_update($data->course, 'mod', 'data', $data->id, 0, $grades);
} else if ($userid and $nullifnone) {
- $eventdata = new object();
- $eventdata->itemid = $grade_item->id;
- $eventdata->userid = $userid;
- $eventdata->gradevalue = NULL;
- events_trigger('grade_updated', $eventdata);
+ $grade = new object();
+ $grade->itemid = $data->id;
+ $grade->userid = $userid;
+ $grade->gradevalue = NULL;
+ grade_update($data->course, 'mod', 'data', $data->id, 0, $grade);
}
} else {
if ($rs = get_recordset_sql($sql)) {
if ($rs->RecordCount() > 0) {
while ($data = rs_fetch_next_record($rs)) {
- if (!$data->assessed) {
- continue; // no grading
+ data_grade_item_update($data);
+ if ($data->assessed) {
+ data_update_grades($data, 0, false);
}
- $grade_item = data_grade_item_get($data);
- data_update_grades($grade_item, 0, false);
}
}
rs_close($rs);
}
/**
- * Return (create if needed) grade item for given data
- *
- * @param object $data object with optional cmidnumber
- * @return object grade_item
- */
-function data_grade_item_get($data) {
- if ($items = grade_get_items($data->course, 'mod', 'data', $data->id)) {
- if (count($items) > 1) {
- debugging('Multiple grade items present!');
- }
- $grade_item = reset($items);
-
- } else {
- if (!isset($data->cmidnumber)) {
- if (!$cm = get_coursemodule_from_instance('data', $data->id)) {
- error("Course Module ID was incorrect");
- }
- $data->cmidnumber = $cm->idnumber;
- }
- if (!$itemid = data_grade_item_create($data)) {
- error('Can not create grade item!');
- }
- $grade_item = grade_item::fetch('id', $itemid);
- }
-
- return $grade_item;
-}
-
-/**
- * Update grade item for given data
+ * Update/create grade item for given data
*
* @param object $data object with extra cmidnumber
* @return object grade_item
*/
function data_grade_item_update($data) {
- $grade_item = data_grade_item_get($data);
-
- $grade_item->name = $data->name;
- $grade_item->idnumber = $data->cmidnumber;
-
- if (!$data->assessed or $data->scale == 0) {
- //how to indicate no grading?
- $grade_item->gradetype = GRADE_TYPE_TEXT;
-
- } else if ($data->scale > 0) {
- $grade_item->gradetype = GRADE_TYPE_VALUE;
- $grade_item->grademax = $data->scale;
- $grade_item->grademin = 0;
-
- } else if ($data->scale < 0) {
- $grade_item->gradetype = GRADE_TYPE_SCALE;
- $grade_item->scaleid = -$data->scale;
+ global $CFG;
+ if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+ require_once($CFG->libdir.'/gradelib.php');
}
- $grade_item->update();
-}
-
-/**
- * Create grade item for given data
- *
- * @param object $data object with extra cmidnumber
- * @return object grade_item
- */
-function data_grade_item_create($data) {
- $params = array('courseid' =>$data->course,
- 'itemtype' =>'mod',
- 'itemmodule' =>'data',
- 'iteminstance'=>$data->id,
- 'itemname' =>$data->name,
- 'idnumber' =>$data->cmidnumber);
+ $params = array('itemname' =>$data->name, 'idnumber' =>$data->cmidnumber);
if (!$data->assessed or $data->scale == 0) {
- //how to indicate no grading?
- $params['gradetype'] = GRADE_TYPE_TEXT;
+ $params['gradetype'] = GRADE_TYPE_NONE;
} else if ($data->scale > 0) {
$params['gradetype'] = GRADE_TYPE_VALUE;
$params['scaleid'] = -$data->scale;
}
- $itemid = grade_create_item($params);
- return $itemid;
+ return grade_update($data->course, 'mod', 'data', $data->id, 0, NULL, $params);
}
/**
* @return object grade_item
*/
function data_grade_item_delete($data) {
- if ($grade_items = grade_get_items($data->course, 'mod', 'data', $data->id)) {
- foreach($grade_items as $grade_item) {
- $grade_item->delete();
- }
- }
+ global $CFG;
+ require_once($CFG->libdir.'/gradelib.php');
+
+ return grade_update($data->course, 'mod', 'data', $data->id, 0, NULL, array('deleted'=>1));
}
/************************************************************************
error("Rating of items not allowed!");
}
- $grade_item = data_grade_item_get($data);
-
if (!$frmdata = data_submitted() or !confirm_sesskey()) {
error("This page was not accessed correctly");
}
if ($oldrating = get_record('data_ratings', 'userid', $USER->id, 'recordid', $record->id)) {
if ($rating == -999) {
delete_records('data_ratings', 'userid', $oldrating->userid, 'recordid', $oldrating->recordid);
- data_update_grades($grade_item, $record->userid);
+ data_update_grades($data, $record->userid);
} else if ($rating != $oldrating->rating) {
$oldrating->rating = $rating;
if (! update_record('data_ratings', $oldrating)) {
error("Could not update an old rating ($record->id = $rating)");
}
- data_update_grades($grade_item, $record->userid);
+ data_update_grades($data, $record->userid);
}
+
} else if ($rating) {
$newrating = new object();
$newrating->userid = $USER->id;
if (! insert_record('data_ratings', $newrating)) {
error("Could not insert a new rating ($record->id = $rating)");
}
- data_update_grades($grade_item, $record->userid);
+ data_update_grades($data, $record->userid);
}
}
// This fragment is called by /admin/index.php
////////////////////////////////////////////////////////////////////////////////
-$module->version = 2007060300;
+$module->version = 2007060600;
$module->requires = 2007060100; // Requires this Moodle version
$module->cron = 60;
/// $result = result of "/lib/ddllib.php" function calls
/// }
- if ($result && $oldversion < 2007060300) {
+ if ($result && $oldversion < 2007060600) {
require_once($CFG->dirroot.'/mod/forum/lib.php');
// too much debug output
$db->debug = false;
}
$forum = stripslashes_recursive($forum);
- forum_grade_item_create($forum);
+ forum_grade_item_update($forum);
return $forum->id;
}
* @param int $userid optional user id, 0 means all users
* @return array array of grades, false if none
*/
-function forum_get_user_grades($forumid, $userid=0) {
+function forum_get_user_grades($forum, $userid=0) {
global $CFG;
$user = $userid ? "AND u.id = $userid" : "";
- $sql = "SELECT u.id, avg(fr.rating) AS gradevalue
+ $sql = "SELECT u.id, u.id AS userid, avg(fr.rating) AS gradevalue
FROM {$CFG->prefix}user u, {$CFG->prefix}forum_posts fp,
{$CFG->prefix}forum_ratings fr, {$CFG->prefix}forum_discussions fd
WHERE u.id = fp.userid AND fp.discussion = fd.id AND fr.post = fp.id
- AND fr.userid != u.id AND fd.forum = $forumid
+ AND fr.userid != u.id AND fd.forum = $forum->id
$user
GROUP BY u.id";
/**
* Update grades by firing grade_updated event
*
- * @param object $grade_item null means all forums
+ * @param object $forum null means all forums
* @param int $userid specific user only, 0 mean all
*/
-function forum_update_grades($grade_item=null, $userid=0, $nullifnone=true) {
+function forum_update_grades($forum=null, $userid=0, $nullifnone=true) {
global $CFG;
- if ($grade_item != null) {
- if ($grades = forum_get_user_grades($grade_item->iteminstance, $userid)) {
- foreach ($grades as $grade) {
- $eventdata = new object();
- $eventdata->itemid = $grade_item->id;
- $eventdata->userid = $grade->id;
- $eventdata->gradevalue = $grade->gradevalue;
- events_trigger('grade_updated', $eventdata);
- }
+ if ($forum != null) {
+ if ($grades = forum_get_user_grades($forum, $userid)) {
+ grade_update($forum->course, 'mod', 'forum', $forum->id, 0, $grades);
} else if ($userid and $nullifnone) {
- $eventdata = new object();
- $eventdata->itemid = $grade_item->id;
- $eventdata->userid = $userid;
- $eventdata->gradevalue = NULL;
- events_trigger('grade_updated', $eventdata);
+ $grade = new object();
+ $grade->itemid = $forum->id;
+ $grade->userid = $userid;
+ $grade->gradevalue = NULL;
+ grade_update($data->course, 'mod', 'forum', $forum->id, 0, $grade);
}
} else {
if ($rs = get_recordset_sql($sql)) {
if ($rs->RecordCount() > 0) {
while ($forum = rs_fetch_next_record($rs)) {
- if (!$forum->assessed) {
- continue; // no grading
+ forum_grade_item_update($forum);
+ if ($forum->assessed) {
+ forum_update_grades($forum, 0, false);
}
- $grade_item = forum_grade_item_get($forum);
- forum_update_grades($grade_item, 0, false);
}
}
rs_close($rs);
}
/**
- * Return (create if needed) grade item for given forum
- *
- * @param object $forum object with optional cmidnumber
- * @return object grade_item
- */
-function forum_grade_item_get($forum) {
- if ($items = grade_get_items($forum->course, 'mod', 'forum', $forum->id)) {
- if (count($items) > 1) {
- debugging('Multiple grade items present!');
- }
- $grade_item = reset($items);
-
- } else {
- if (!isset($forum->cmidnumber)) {
- if (!$cm = get_coursemodule_from_instance('forum', $forum->id)) {
- error("Course Module ID was incorrect");
- }
- $forum->cmidnumber = $cm->idnumber;
- }
- if (!$itemid = forum_grade_item_create($forum)) {
- error('Can not create grade item!');
- }
- $grade_item = grade_item::fetch('id', $itemid);
- }
-
- return $grade_item;
-}
-
-/**
- * Update grade item for given forum
+ * Create/update grade item for given forum
*
* @param object $forum object with extra cmidnumber
- * @return object grade_item
+ * @return int 0 if ok
*/
function forum_grade_item_update($forum) {
- $grade_item = forum_grade_item_get($forum);
-
- $grade_item->name = $forum->name;
- $grade_item->idnumber = $forum->cmidnumber;
-
- if (!$forum->assessed or $forum->scale == 0) {
- //how to indicate no grading?
- $grade_item->gradetype = GRADE_TYPE_TEXT;
-
- } else if ($forum->scale > 0) {
- $grade_item->gradetype = GRADE_TYPE_VALUE;
- $grade_item->grademax = $forum->scale;
- $grade_item->grademin = 0;
-
- } else if ($forum->scale < 0) {
- $grade_item->gradetype = GRADE_TYPE_SCALE;
- $grade_item->scaleid = -$forum->scale;
+ global $CFG;
+ if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+ require_once($CFG->libdir.'/gradelib.php');
}
- $grade_item->update();
-}
-
-/**
- * Create grade item for given forum
- *
- * @param object $forum object with extra cmidnumber
- * @return object grade_item
- */
-function forum_grade_item_create($forum) {
- $params = array('courseid' =>$forum->course,
- 'itemtype' =>'mod',
- 'itemmodule' =>'forum',
- 'iteminstance'=>$forum->id,
- 'itemname' =>$forum->name,
- 'idnumber' =>$forum->cmidnumber);
+ $params = array('itemname'=>$forum->name, 'idnumber'=>$forum->cmidnumber);
if (!$forum->assessed or $forum->scale == 0) {
- //how to indicate no grading?
- $params['gradetype'] = GRADE_TYPE_TEXT;
+ $params['gradetype'] = GRADE_TYPE_NONE;
} else if ($forum->scale > 0) {
$params['gradetype'] = GRADE_TYPE_VALUE;
$params['scaleid'] = -$forum->scale;
}
- $itemid = grade_create_item($params);
- return $itemid;
+ return grade_update($forum->course, 'mod', 'forum', $forum->id, 0, NULL, $params);
}
/**
* @return object grade_item
*/
function forum_grade_item_delete($forum) {
- if ($grade_items = grade_get_items($forum->course, 'mod', 'forum', $forum->id)) {
- foreach($grade_items as $grade_item) {
- $grade_item->delete();
- }
- }
+ global $CFG;
+ require_once($CFG->libdir.'/gradelib.php');
+
+ return grade_update($forum->course, 'mod', 'forum', $forum->id, 0, NULL, array('deleted'=>1));
}
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
require_capability('mod/forum:rate', $context);
- $grade_item = forum_grade_item_get($forum);
-
if ($data = data_submitted()) {
$discussionid = false;
if ($rating == FORUM_UNSET_POST_RATING) {
delete_records('forum_ratings', 'post', $postid, 'userid', $USER->id);
- forum_update_grades($grade_item, $post->userid);
+ forum_update_grades($forum, $post->userid);
} else if ($oldrating = get_record('forum_ratings', 'userid', $USER->id, 'post', $post->id)) {
if ($rating != $oldrating->rating) {
if (! update_record('forum_ratings', $oldrating)) {
error("Could not update an old rating ($post->id = $rating)");
}
- forum_update_grades($grade_item, $post->userid);
+ forum_update_grades($forum, $post->userid);
}
} else {
if (! insert_record('forum_ratings', $newrating)) {
error("Could not insert a new rating ($postid = $rating)");
}
- forum_update_grades($grade_item, $post->userid);
+ forum_update_grades($forum, $post->userid);
}
}
// This fragment is called by /admin/index.php
////////////////////////////////////////////////////////////////////////////////
-$module->version = 2007060300;
+$module->version = 2007060600;
$module->requires = 2007060100; // Requires this Moodle version
$module->cron = 60;
$result = $result && drop_field($table, $field);
}
- if ($result && $oldversion < 2007060300) {
+ if ($result && $oldversion < 2007060600) {
require_once($CFG->dirroot.'/mod/glossary/lib.php');
// too much debug output
$db->debug = false;
if ($returnid = insert_record("glossary", $glossary)) {
$glossary->id = $returnid;
$glossary = stripslashes_recursive($glossary);
- glossary_grade_item_create($glossary);
+ glossary_grade_item_update($glossary);
}
return $returnid;
* @param int $userid optional user id, 0 means all users
* @return array array of grades, false if none
*/
-function glossary_get_user_grades($glossaryid, $userid=0) {
+function glossary_get_user_grades($glossary, $userid=0) {
global $CFG;
$user = $userid ? "AND u.id = $userid" : "";
- $sql = "SELECT u.id, avg(gr.rating) AS gradevalue
+ $sql = "SELECT u.id, u.id AS userid, avg(gr.rating) AS gradevalue
FROM {$CFG->prefix}user u, {$CFG->prefix}glossary_entries ge,
{$CFG->prefix}glossary_ratings gr
WHERE u.id = ge.userid AND ge.id = gr.entryid
- AND gr.userid != u.id AND ge.glossaryid = $glossaryid
+ AND gr.userid != u.id AND ge.glossaryid = $glossary->id
$user
GROUP BY u.id";
/**
* Update grades by firing grade_updated event
*
- * @param object $grade_item null means all glossaries
+ * @param object $glossary null means all glossaries
* @param int $userid specific user only, 0 mean all
*/
-function glossary_update_grades($grade_item=null, $userid=0, $nullifnone=true) {
+function glossary_update_grades($glossary=null, $userid=0, $nullifnone=true) {
global $CFG;
- if ($grade_item != null) {
- if ($grades = glossary_get_user_grades($grade_item->iteminstance, $userid)) {
- foreach ($grades as $grade) {
- $eventdata = new object();
- $eventdata->itemid = $grade_item->id;
- $eventdata->userid = $grade->id;
- $eventdata->gradevalue = $grade->gradevalue;
- events_trigger('grade_updated', $eventdata);
- }
+ if ($glossary != null) {
+ if ($grades = glossary_get_user_grades($glossary, $userid)) {
+ grade_update($glossary->course, 'mod', 'glossary', $glossary->id, 0, $grades);
} else if ($userid and $nullifnone) {
- $eventdata = new object();
- $eventdata->itemid = $grade_item->id;
- $eventdata->userid = $userid;
- $eventdata->gradevalue = NULL;
- events_trigger('grade_updated', $eventdata);
+ $grade = new object();
+ $grade->itemid = $glossary->id;
+ $grade->userid = $userid;
+ $grade->gradevalue = NULL;
+ grade_update($glossary->course, 'mod', 'glossary', $glossary->id, 0, $grade);
}
} else {
if ($rs = get_recordset_sql($sql)) {
if ($rs->RecordCount() > 0) {
while ($glossary = rs_fetch_next_record($rs)) {
- if (!$glossary->assessed) {
- continue; // no grading
+ glossary_grade_item_update($glossary);
+ if ($glossary->assessed) {
+ glossary_update_grades($glossary, 0, false);
}
- $grade_item = glossary_grade_item_get($glossary);
- glossary_update_grades($grade_item, 0, false);
}
}
rs_close($rs);
}
/**
- * Return (create if needed) grade item for given glossary
- *
- * @param object $glossary object with optional cmidnumber
- * @return object grade_item
- */
-function glossary_grade_item_get($glossary) {
- if ($items = grade_get_items($glossary->course, 'mod', 'glossary', $glossary->id)) {
- if (count($items) > 1) {
- debugging('Multiple grade items present!');
- }
- $grade_item = reset($items);
-
- } else {
- if (!isset($glossary->cmidnumber)) {
- if (!$cm = get_coursemodule_from_instance('glossary', $glossary->id)) {
- error("Course Module ID was incorrect");
- }
- $glossary->cmidnumber = $cm->idnumber;
- }
- if (!$itemid = glossary_grade_item_create($glossary)) {
- error('Can not create grade item!');
- }
- $grade_item = grade_item::fetch('id', $itemid);
- }
-
- return $grade_item;
-}
-
-/**
- * Update grade item for given glossary
+ * Create/update grade item for given glossary
*
* @param object $glossary object with extra cmidnumber
- * @return object grade_item
+ * @return int, 0 if ok, error code otherwise
*/
function glossary_grade_item_update($glossary) {
- $grade_item = glossary_grade_item_get($glossary);
-
- $grade_item->name = $glossary->name;
- $grade_item->idnumber = $glossary->cmidnumber;
-
- if (!$glossary->assessed or $glossary->scale == 0) {
- //how to indicate no grading?
- $grade_item->gradetype = GRADE_TYPE_TEXT;
-
- } else if ($glossary->scale > 0) {
- $grade_item->gradetype = GRADE_TYPE_VALUE;
- $grade_item->grademax = $glossary->scale;
- $grade_item->grademin = 0;
-
- } else if ($glossary->scale < 0) {
- $grade_item->gradetype = GRADE_TYPE_SCALE;
- $grade_item->scaleid = -$glossary->scale;
+ global $CFG;
+ if (!function_exists('grade_update')) { //workaround for buggy PHP versions
+ require_once($CFG->libdir.'/gradelib.php');
}
- $grade_item->update();
-}
-
-/**
- * Create grade item for given glossary
- *
- * @param object $glossary object with extra cmidnumber
- * @return object grade_item
- */
-function glossary_grade_item_create($glossary) {
- $params = array('courseid' =>$glossary->course,
- 'itemtype' =>'mod',
- 'itemmodule' =>'glossary',
- 'iteminstance'=>$glossary->id,
- 'itemname' =>$glossary->name,
- 'idnumber' =>$glossary->cmidnumber);
+ $params = array('itemname'=>$glossary->name, 'idnumber'=>$glossary->cmidnumber);
if (!$glossary->assessed or $glossary->scale == 0) {
- //how to indicate no grading?
- $params['gradetype'] = GRADE_TYPE_TEXT;
+ $params['gradetype'] = GRADE_TYPE_NONE;
} else if ($glossary->scale > 0) {
$params['gradetype'] = GRADE_TYPE_VALUE;
$params['scaleid'] = -$glossary->scale;
}
- $itemid = grade_create_item($params);
- return $itemid;
+ return grade_update($glossary->course, 'mod', 'glossary', $glossary->id, 0, NULL, $params);
}
/**
* Delete grade item for given glossary
*
* @param object $glossary object
- * @return object grade_item
*/
function glossary_grade_item_delete($glossary) {
- if ($grade_items = grade_get_items($glossary->course, 'mod', 'glossary', $glossary->id)) {
- foreach($grade_items as $grade_item) {
- $grade_item->delete();
- }
- }
+ global $CFG;
+ require_once($CFG->libdir.'/gradelib.php');
+
+ return grade_update($glossary->course, 'mod', 'glossary', $glossary->id, 0, NULL, array('deleted'=>1));
}
function glossary_get_participants($glossaryid) {
require_capability('mod/glossary:rate', $context);
}
- $grade_item = glossary_grade_item_get($glossary);
-
if (!empty($_SERVER['HTTP_REFERER'])) {
$returnurl = $_SERVER['HTTP_REFERER'];
} else {
//Check if we must delete the rate
if ($rating == -999) {
delete_records('glossary_ratings','userid',$oldrating->userid, 'entryid',$oldrating->entryid);
- glossary_update_grades($grade_item, $entry->userid);
+ glossary_update_grades($glossary, $entry->userid);
} else if ($rating != $oldrating->rating) {
$oldrating->rating = $rating;
if (! update_record("glossary_ratings", $oldrating)) {
error("Could not update an old rating ($entry = $rating)");
}
- glossary_update_grades($grade_item, $entry->userid);
+ glossary_update_grades($glossary, $entry->userid);
}
} else if ($rating >= 0) {
if (! insert_record("glossary_ratings", $newrating)) {
error("Could not insert a new rating ($entry->id = $rating)");
}
- glossary_update_grades($grade_item, $entry->userid);
+ glossary_update_grades($glossary, $entry->userid);
}
}
/// This fragment is called by moodle_needs_upgrading() and /admin/index.php
/////////////////////////////////////////////////////////////////////////////////
-$module->version = 2007060300;
+$module->version = 2007060600;
$module->requires = 2007060100; // Requires this Moodle version
$module->cron = 0; // Period for cron to check this module (secs)