MDL-10012 Implement grade_updated event triggers in Database

This commit is contained in:
skodak 2007-06-03 19:36:20 +00:00
parent 5980d52f23
commit 04366d79cf
4 changed files with 259 additions and 55 deletions

View File

@ -54,6 +54,16 @@ function xmldb_data_upgrade($oldversion=0) {
$result = $result && add_field($table, $field);
}
if ($result && $oldversion < 2007060300) {
require_once($CFG->dirroot.'/mod/data/lib.php');
// too much debug output
$db->debug = false;
data_update_grades();
$db->debug = true;
}
return $result;
}

View File

@ -22,6 +22,8 @@
// //
///////////////////////////////////////////////////////////////////////////
require_once($CFG->libdir.'/gradelib.php');
/// Some constants
define ('DATA_MAX_ENTRIES', 50);
define ('DATA_PERPAGE_SINGLE', 1);
@ -624,6 +626,9 @@ function data_add_instance($data) {
return false;
}
$data = stripslashes_recursive($data);
data_grade_item_create($data);
return $data->id;
}
@ -633,18 +638,21 @@ function data_add_instance($data) {
function data_update_instance($data) {
global $CFG;
$data->id = $data->instance;
$data->timemodified = time();
$data->id = $data->instance;
if (empty($data->assessed)) {
$data->assessed = 0;
}
$data->timemodified = time();
if (! $data->instance = update_record('data', $data)) {
if (! update_record('data', $data)) {
return false;
}
return $data->instance;
$data = stripslashes_recursive($data);
data_grade_item_update($data);
return true;
}
@ -684,10 +692,11 @@ function data_delete_instance($id) { //takes the dataid
// Delete the instance itself
if (! delete_records('data', 'id', $id)) {
return false;
}
return true;
$result = delete_records('data', 'id', $id);
glossary_grade_item_delete($data);
return $result;
}
/************************************************************************
@ -723,6 +732,180 @@ function data_user_complete($course, $user, $mod, $data) {
}
}
/**
* Return grade for given user or all users.
*
* @param int $dataid id of data
* @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) {
global $CFG;
$user = $userid ? "AND u.id = $userid" : "";
$sql = "SELECT u.id, 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
$user
GROUP BY u.id";
return get_records_sql($sql);
}
/**
* Update grades by firing grade_updated event
*
* @param object $grade_item null means all databases
* @param int $userid specific user only, 0 mean all
*/
function data_update_grades($grade_item=null, $userid=0, $nullifnone=true) {
global $CFG;
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);
}
} else if ($userid and $nullifnone) {
$eventdata = new object();
$eventdata->itemid = $grade_item->id;
$eventdata->userid = $userid;
$eventdata->gradevalue = NULL;
events_trigger('grade_updated', $eventdata);
}
} else {
$sql = "SELECT d.*, cm.idnumber as cmidnumber
FROM {$CFG->prefix}data d, {$CFG->prefix}course_modules cm, {$CFG->prefix}modules m
WHERE m.name='data' AND m.id=cm.module AND cm.instance=d.id";
if ($rs = get_recordset_sql($sql)) {
if ($rs->RecordCount() > 0) {
while ($data = rs_fetch_next_record($rs)) {
if (!$data->assessed) {
continue; // no grading
}
$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
*
* @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;
}
$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);
if (!$data->assessed or $data->scale == 0) {
//how to indicate no grading?
$params['gradetype'] = GRADE_TYPE_TEXT;
} else if ($data->scale > 0) {
$params['gradetype'] = GRADE_TYPE_VALUE;
$params['grademax'] = $data->scale;
$params['grademin'] = 0;
} else if ($data->scale < 0) {
$params['gradetype'] = GRADE_TYPE_SCALE;
$params['scaleid'] = -$data->scale;
}
$itemid = grade_create_item($params);
return $itemid;
}
/**
* Delete grade item for given data
*
* @param object $data object
* @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();
}
}
}
/************************************************************************
* returns a list of participants of this database *
************************************************************************/
@ -1094,6 +1277,7 @@ function data_print_ratings($data, $record) {
echo '<div class="ratings" style="text-align:center">';
echo '<form id="form" method="post" action="rate.php">';
echo '<input type="hidden" name="dataid" value="'.$data->id.'" />';
if (has_capability('mod/data:rate', $context) and !data_isowner($record->id)) {
data_print_ratings_mean($record->id, $ratingsscale, has_capability('mod/data:viewrating', $context));
@ -1191,14 +1375,14 @@ function data_print_rating_menu($recordid, $userid, $scale) {
static $strrate;
if (!$rating = get_record("data_ratings", "userid", $userid, "recordid", $recordid)) {
$rating->rating = 0;
$rating->rating = -999;
}
if (empty($strrate)) {
$strrate = get_string("rate", "data");
}
choose_from_menu($scale, $recordid, $rating->rating, "$strrate...");
choose_from_menu($scale, $recordid, $rating->rating, "$strrate...", '', -999);
}
@ -1583,11 +1767,8 @@ function data_print_header($course, $cm, $data, $currenttab='') {
print_heading(format_string($data->name));
/// Groups needed for Add entry tab
if ($groupmode = groupmode($course, $cm)) { // Groups are being used
$currentgroup = get_and_set_current_group($course, $groupmode);
} else {
$currentgroup = 0;
}
$groupmode = groupmode($course, $cm);
$currentgroup = get_and_set_current_group($course, $groupmode);
/// Print the tabs
@ -1604,7 +1785,7 @@ function data_print_header($course, $cm, $data, $currenttab='') {
}
}
function data_user_can_add_entry($data, $currentgroup=false, $groupmode='') {
function data_user_can_add_entry($data, $currentgroup, $groupmode) {
global $USER;
if (!$cm = get_coursemodule_from_instance('data', $data->id)) {
@ -1616,16 +1797,18 @@ function data_user_can_add_entry($data, $currentgroup=false, $groupmode='') {
return false;
}
if (!$groupmode or has_capability('moodle/site:accessallgroups', $context)) {
return true;
}
if ($currentgroup) {
return (has_capability('moodle/site:accessallgroups', $context) or ismember($currentgroup));
return ismember($currentgroup);
} else {
//else it might be group 0 in visible mode
if ($groupmode == VISIBLEGROUPS){
$result = groups_is_member($currentgroup);
return $result;
} else {
return true;
} else {
return false;
}
}
}

View File

@ -2,13 +2,42 @@
require_once('../../config.php');
require_once('lib.php');
if (!($data = data_submitted($CFG->wwwroot.'/mod/data/view.php')) or !confirm_sesskey()) {
$dataid = required_param('dataid', PARAM_INT); // The forum the rated posts are from
if (!$data = get_record('data', 'id', $dataid)) {
error("Incorrect data id");
}
if (!$course = get_record('course', 'id', $data->course)) {
error("Course ID was incorrect");
}
if (!$cm = get_coursemodule_from_instance('data', $data->id)) {
error("Course Module ID was incorrect");
}
require_login($course, false, $cm);
if (isguestuser()) {
error("Guests are not allowed to rate entries.");
}
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
require_capability('mod/data:rate', $context);
if (!$data->assessed) {
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");
}
$count = 0;
foreach ((array)$data as $recordid => $rating) {
foreach ((array)$frmdata as $recordid => $rating) {
if (!is_numeric($recordid)) {
continue;
}
@ -16,38 +45,13 @@
if (!$record = get_record('data_records', 'id', $recordid)) {
error("Record ID is incorrect");
}
if (!$data = get_record('data', 'id', $record->dataid)) {
error("Data ID is incorrect");
}
if (!$course = get_record('course', 'id', $data->course)) {
error("Course is misconfigured");
}
if (!$cm = get_coursemodule_from_instance('data', $data->id, $course->id)) {
error("Course Module ID was incorrect");
}
require_login($course->id, false, $cm);
$context = get_context_instance(CONTEXT_MODULE, $cm->id);
if (isguest()) {
error("Guests are not allowed to rate posts");
}
if (!$data->assessed or !has_capability('mod/data:rate', $context)) {
error("Not allowed to rate.");
if ($data->id != $record->dataid) {
error("Incorrect record.");
}
if ($record->userid == $USER->id) {
error("You can not rate your own data");
}
if (!$scale = make_grades_menu($data->scale)) {
error("Icorrect scale");
}
if (!array_key_exists($rating, $scale)) {
error("Icorrect rating value");
continue;
}
// input validation ok
@ -55,11 +59,17 @@
$count++;
if ($oldrating = get_record('data_ratings', 'userid', $USER->id, 'recordid', $record->id)) {
if ($rating != $oldrating->rating) {
if ($rating == -999) {
delete_records('data_ratings', 'userid', $oldrating->userid, 'recordid', $oldrating->recordid);
data_update_grades($grade_item, $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);
}
} else if ($rating) {
$newrating = new object();
@ -69,6 +79,7 @@
if (! insert_record('data_ratings', $newrating)) {
error("Could not insert a new rating ($record->id = $rating)");
}
data_update_grades($grade_item, $record->userid);
}
}

View File

@ -5,8 +5,8 @@
// This fragment is called by /admin/index.php
////////////////////////////////////////////////////////////////////////////////
$module->version = 2007022601;
$module->requires = 2007020200; // Requires this Moodle version
$module->version = 2007060300;
$module->requires = 2007060100; // Requires this Moodle version
$module->cron = 60;
?>