mirror of
https://github.com/moodle/moodle.git
synced 2025-04-26 02:44:13 +02:00
MDL-10012 Implement grade_updated event triggers in Database
This commit is contained in:
parent
5980d52f23
commit
04366d79cf
@ -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;
|
||||
}
|
||||
|
||||
|
227
mod/data/lib.php
227
mod/data/lib.php
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
||||
?>
|
||||
|
Loading…
x
Reference in New Issue
Block a user