/** * Actual implementation of the reset course functionality, delete all the * data responses for course $data->courseid. * * @global object * @global object * @param object $data the data submitted from the reset course. * @return array status array */ function data_reset_userdata($data) { global $CFG, $DB; require_once $CFG->libdir . '/filelib.php'; require_once $CFG->dirroot . '/rating/lib.php'; $componentstr = get_string('modulenameplural', 'data'); $status = array(); $allrecordssql = "SELECT r.id\n FROM {data_records} r\n INNER JOIN {data} d ON r.dataid = d.id\n WHERE d.course = ?"; $alldatassql = "SELECT d.id\n FROM {data} d\n WHERE d.course=?"; $rm = new rating_manager(); $ratingdeloptions = new stdClass(); $ratingdeloptions->component = 'mod_data'; $ratingdeloptions->ratingarea = 'entry'; // Set the file storage - may need it to remove files later. $fs = get_file_storage(); // delete entries if requested if (!empty($data->reset_data)) { $DB->delete_records_select('comments', "itemid IN ({$allrecordssql}) AND commentarea='database_entry'", array($data->courseid)); $DB->delete_records_select('data_content', "recordid IN ({$allrecordssql})", array($data->courseid)); $DB->delete_records_select('data_records', "dataid IN ({$alldatassql})", array($data->courseid)); if ($datas = $DB->get_records_sql($alldatassql, array($data->courseid))) { foreach ($datas as $dataid => $unused) { if (!($cm = get_coursemodule_from_instance('data', $dataid))) { continue; } $datacontext = context_module::instance($cm->id); // Delete any files that may exist. $fs->delete_area_files($datacontext->id, 'mod_data', 'content'); $ratingdeloptions->contextid = $datacontext->id; $rm->delete_ratings($ratingdeloptions); } } if (empty($data->reset_gradebook_grades)) { // remove all grades from gradebook data_reset_gradebook($data->courseid); } $status[] = array('component' => $componentstr, 'item' => get_string('deleteallentries', 'data'), 'error' => false); } // remove entries by users not enrolled into course if (!empty($data->reset_data_notenrolled)) { $recordssql = "SELECT r.id, r.userid, r.dataid, u.id AS userexists, u.deleted AS userdeleted\n FROM {data_records} r\n JOIN {data} d ON r.dataid = d.id\n LEFT JOIN {user} u ON r.userid = u.id\n WHERE d.course = ? AND r.userid > 0"; $course_context = context_course::instance($data->courseid); $notenrolled = array(); $fields = array(); $rs = $DB->get_recordset_sql($recordssql, array($data->courseid)); foreach ($rs as $record) { if (array_key_exists($record->userid, $notenrolled) or !$record->userexists or $record->userdeleted or !is_enrolled($course_context, $record->userid)) { //delete ratings if (!($cm = get_coursemodule_from_instance('data', $record->dataid))) { continue; } $datacontext = context_module::instance($cm->id); $ratingdeloptions->contextid = $datacontext->id; $ratingdeloptions->itemid = $record->id; $rm->delete_ratings($ratingdeloptions); // Delete any files that may exist. if ($contents = $DB->get_records('data_content', array('recordid' => $record->id), '', 'id')) { foreach ($contents as $content) { $fs->delete_area_files($datacontext->id, 'mod_data', 'content', $content->id); } } $notenrolled[$record->userid] = true; $DB->delete_records('comments', array('itemid' => $record->id, 'commentarea' => 'database_entry')); $DB->delete_records('data_content', array('recordid' => $record->id)); $DB->delete_records('data_records', array('id' => $record->id)); } } $rs->close(); $status[] = array('component' => $componentstr, 'item' => get_string('deletenotenrolled', 'data'), 'error' => false); } // remove all ratings if (!empty($data->reset_data_ratings)) { if ($datas = $DB->get_records_sql($alldatassql, array($data->courseid))) { foreach ($datas as $dataid => $unused) { if (!($cm = get_coursemodule_from_instance('data', $dataid))) { continue; } $datacontext = context_module::instance($cm->id); $ratingdeloptions->contextid = $datacontext->id; $rm->delete_ratings($ratingdeloptions); } } if (empty($data->reset_gradebook_grades)) { // remove all grades from gradebook data_reset_gradebook($data->courseid); } $status[] = array('component' => $componentstr, 'item' => get_string('deleteallratings'), 'error' => false); } // remove all comments if (!empty($data->reset_data_comments)) { $DB->delete_records_select('comments', "itemid IN ({$allrecordssql}) AND commentarea='database_entry'", array($data->courseid)); $status[] = array('component' => $componentstr, 'item' => get_string('deleteallcomments'), 'error' => false); } // updating dates - shift may be negative too if ($data->timeshift) { shift_course_mod_dates('data', array('timeavailablefrom', 'timeavailableto', 'timeviewfrom', 'timeviewto'), $data->timeshift, $data->courseid); $status[] = array('component' => $componentstr, 'item' => get_string('datechanged'), 'error' => false); } return $status; }
/** * Actual implementation of the reset course functionality, delete all the * data responses for course $data->courseid. * * @global object * @global object * @param object $data the data submitted from the reset course. * @return array status array */ function data_reset_userdata($data) { global $CFG, $DB; require_once($CFG->libdir.'/filelib.php'); require_once($CFG->dirroot.'/rating/lib.php'); $componentstr = get_string('modulenameplural', 'data'); $status = array(); $allrecordssql = "SELECT r.id FROM {data_records} r INNER JOIN {data} d ON r.dataid = d.id WHERE d.course = ?"; $alldatassql = "SELECT d.id FROM {data} d WHERE d.course=?"; $rm = new rating_manager(); $ratingdeloptions = new stdClass; $ratingdeloptions->component = 'mod_data'; $ratingdeloptions->ratingarea = 'entry'; // delete entries if requested if (!empty($data->reset_data)) { $DB->delete_records_select('comments', "itemid IN ($allrecordssql) AND commentarea='database_entry'", array($data->courseid)); $DB->delete_records_select('data_content', "recordid IN ($allrecordssql)", array($data->courseid)); $DB->delete_records_select('data_records', "dataid IN ($alldatassql)", array($data->courseid)); if ($datas = $DB->get_records_sql($alldatassql, array($data->courseid))) { foreach ($datas as $dataid=>$unused) { fulldelete("$CFG->dataroot/$data->courseid/moddata/data/$dataid"); if (!$cm = get_coursemodule_from_instance('data', $dataid)) { continue; } $datacontext = get_context_instance(CONTEXT_MODULE, $cm->id); $ratingdeloptions->contextid = $datacontext->id; $rm->delete_ratings($ratingdeloptions); } } if (empty($data->reset_gradebook_grades)) { // remove all grades from gradebook data_reset_gradebook($data->courseid); } $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallentries', 'data'), 'error'=>false); } // remove entries by users not enrolled into course if (!empty($data->reset_data_notenrolled)) { $recordssql = "SELECT r.id, r.userid, r.dataid, u.id AS userexists, u.deleted AS userdeleted FROM {data_records} r JOIN {data} d ON r.dataid = d.id LEFT JOIN {user} u ON r.userid = u.id WHERE d.course = ? AND r.userid > 0"; $course_context = get_context_instance(CONTEXT_COURSE, $data->courseid); $notenrolled = array(); $fields = array(); $rs = $DB->get_recordset_sql($recordssql, array($data->courseid)); foreach ($rs as $record) { if (array_key_exists($record->userid, $notenrolled) or !$record->userexists or $record->userdeleted or !is_enrolled($course_context, $record->userid)) { //delete ratings if (!$cm = get_coursemodule_from_instance('data', $record->dataid)) { continue; } $datacontext = get_context_instance(CONTEXT_MODULE, $cm->id); $ratingdeloptions->contextid = $datacontext->id; $ratingdeloptions->itemid = $record->id; $rm->delete_ratings($ratingdeloptions); $DB->delete_records('comments', array('itemid'=>$record->id, 'commentarea'=>'database_entry')); $DB->delete_records('data_content', array('recordid'=>$record->id)); $DB->delete_records('data_records', array('id'=>$record->id)); // HACK: this is ugly - the recordid should be before the fieldid! if (!array_key_exists($record->dataid, $fields)) { if ($fs = $DB->get_records('data_fields', array('dataid'=>$record->dataid))) { $fields[$record->dataid] = array_keys($fs); } else { $fields[$record->dataid] = array(); } } foreach($fields[$record->dataid] as $fieldid) { fulldelete("$CFG->dataroot/$data->courseid/moddata/data/$record->dataid/$fieldid/$record->id"); } $notenrolled[$record->userid] = true; } } $rs->close(); $status[] = array('component'=>$componentstr, 'item'=>get_string('deletenotenrolled', 'data'), 'error'=>false); } // remove all ratings if (!empty($data->reset_data_ratings)) { if ($datas = $DB->get_records_sql($alldatassql, array($data->courseid))) { foreach ($datas as $dataid=>$unused) { if (!$cm = get_coursemodule_from_instance('data', $dataid)) { continue; } $datacontext = get_context_instance(CONTEXT_MODULE, $cm->id); $ratingdeloptions->contextid = $datacontext->id; $rm->delete_ratings($ratingdeloptions); } } if (empty($data->reset_gradebook_grades)) { // remove all grades from gradebook data_reset_gradebook($data->courseid); } $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallratings'), 'error'=>false); } // remove all comments if (!empty($data->reset_data_comments)) { $DB->delete_records_select('comments', "itemid IN ($allrecordssql) AND commentarea='database_entry'", array($data->courseid)); $status[] = array('component'=>$componentstr, 'item'=>get_string('deleteallcomments'), 'error'=>false); } // updating dates - shift may be negative too if ($data->timeshift) { shift_course_mod_dates('data', array('timeavailablefrom', 'timeavailableto', 'timeviewfrom', 'timeviewto'), $data->timeshift, $data->courseid); $status[] = array('component'=>$componentstr, 'item'=>get_string('datechanged'), 'error'=>false); } return $status; }
/** * Actual implementation of the rest coures functionality, delete all the * data responses for course $data->courseid. * @param $data the data submitted from the reset course. * @return array status array */ function data_reset_userdata($data) { global $CFG; require_once $CFG->libdir . '/filelib.php'; $componentstr = get_string('modulenameplural', 'data'); $status = array(); $allrecordssql = "SELECT r.id\n FROM {$CFG->prefix}data_records r\n INNER JOIN {$CFG->prefix}data d ON r.dataid = d.id\n WHERE d.course = {$data->courseid}"; $alldatassql = "SELECT d.id\n FROM {$CFG->prefix}data d\n WHERE d.course={$data->courseid}"; // delete entries if requested if (!empty($data->reset_data)) { delete_records_select('data_ratings', "recordid IN ({$allrecordssql})"); delete_records_select('data_comments', "recordid IN ({$allrecordssql})"); delete_records_select('data_content', "recordid IN ({$allrecordssql})"); delete_records_select('data_records', "dataid IN ({$alldatassql})"); if ($datas = get_records_sql($alldatassql)) { foreach ($datas as $dataid => $unused) { fulldelete("{$CFG->dataroot}/{$data->courseid}/moddata/data/{$dataid}"); } } if (empty($data->reset_gradebook_grades)) { // remove all grades from gradebook data_reset_gradebook($data->courseid); } $status[] = array('component' => $componentstr, 'item' => get_string('deleteallentries', 'data'), 'error' => false); } // remove entries by users not enrolled into course if (!empty($data->reset_data_notenrolled)) { $recordssql = "SELECT r.id, r.userid, r.dataid, u.id AS userexists, u.deleted AS userdeleted\n FROM {$CFG->prefix}data_records r\n INNER JOIN {$CFG->prefix}data d ON r.dataid = d.id\n LEFT OUTER JOIN {$CFG->prefix}user u ON r.userid = u.id\n WHERE d.course = {$data->courseid} AND r.userid > 0"; $course_context = get_context_instance(CONTEXT_COURSE, $data->courseid); $notenrolled = array(); $fields = array(); if ($rs = get_recordset_sql($recordssql)) { while ($record = rs_fetch_next_record($rs)) { if (array_key_exists($record->userid, $notenrolled) or !$record->userexists or $record->userdeleted or !has_capability('moodle/course:view', $course_context, $record->userid)) { delete_records('data_ratings', 'recordid', $record->id); delete_records('data_comments', 'recordid', $record->id); delete_records('data_content', 'recordid', $record->id); delete_records('data_records', 'id', $record->id); // HACK: this is ugly - the recordid should be before the fieldid! if (!array_key_exists($record->dataid, $fields)) { if ($fs = get_records('data_fields', 'dataid', $record->dataid)) { $fields[$record->dataid] = array_keys($fs); } else { $fields[$record->dataid] = array(); } } foreach ($fields[$record->dataid] as $fieldid) { fulldelete("{$CFG->dataroot}/{$data->courseid}/moddata/data/{$record->dataid}/{$fieldid}/{$record->id}"); } $notenrolled[$record->userid] = true; } } rs_close($rs); $status[] = array('component' => $componentstr, 'item' => get_string('deletenotenrolled', 'data'), 'error' => false); } } // remove all ratings if (!empty($data->reset_data_ratings)) { delete_records_select('data_ratings', "recordid IN ({$allrecordssql})"); if (empty($data->reset_gradebook_grades)) { // remove all grades from gradebook data_reset_gradebook($data->courseid); } $status[] = array('component' => $componentstr, 'item' => get_string('deleteallratings'), 'error' => false); } // remove all comments if (!empty($data->reset_data_comments)) { delete_records_select('data_comments', "recordid IN ({$allrecordssql})"); $status[] = array('component' => $componentstr, 'item' => get_string('deleteallcomments'), 'error' => false); } // updating dates - shift may be negative too if ($data->timeshift) { shift_course_mod_dates('data', array('timeavailablefrom', 'timeavailableto', 'timeviewfrom', 'timeviewto'), $data->timeshift, $data->courseid); $status[] = array('component' => $componentstr, 'item' => get_string('datechanged'), 'error' => false); } return $status; }