diff --git a/course/lib.php b/course/lib.php index e3094fddecb..e731709b266 100644 --- a/course/lib.php +++ b/course/lib.php @@ -230,629 +230,6 @@ function build_mnet_logs_array($hostid, $course, $user=0, $date=0, $order="l.tim return $result; } -function build_logs_array($course, $user=0, $date=0, $order="l.time ASC", $limitfrom='', $limitnum='', - $modname="", $modid=0, $modaction="", $groupid=0) { - global $DB, $SESSION, $USER; - // It is assumed that $date is the GMT time of midnight for that day, - // and so the next 86400 seconds worth of logs are printed. - - /// Setup for group handling. - - /// If the group mode is separate, and this user does not have editing privileges, - /// then only the user's group can be viewed. - if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/course:managegroups', context_course::instance($course->id))) { - if (isset($SESSION->currentgroup[$course->id])) { - $groupid = $SESSION->currentgroup[$course->id]; - } else { - $groupid = groups_get_all_groups($course->id, $USER->id); - if (is_array($groupid)) { - $groupid = array_shift(array_keys($groupid)); - $SESSION->currentgroup[$course->id] = $groupid; - } else { - $groupid = 0; - } - } - } - /// If this course doesn't have groups, no groupid can be specified. - else if (!$course->groupmode) { - $groupid = 0; - } - - $joins = array(); - $params = array(); - - if ($course->id != SITEID || $modid != 0) { - $joins[] = "l.course = :courseid"; - $params['courseid'] = $course->id; - } - - if ($modname) { - $joins[] = "l.module = :modname"; - $params['modname'] = $modname; - } - - if ('site_errors' === $modid) { - $joins[] = "( l.action='error' OR l.action='infected' )"; - } else if ($modid) { - $joins[] = "l.cmid = :modid"; - $params['modid'] = $modid; - } - - if ($modaction) { - $firstletter = substr($modaction, 0, 1); - if ($firstletter == '-') { - $joins[] = $DB->sql_like('l.action', ':modaction', false, true, true); - $params['modaction'] = '%'.substr($modaction, 1).'%'; - } else { - $joins[] = $DB->sql_like('l.action', ':modaction', false); - $params['modaction'] = '%'.$modaction.'%'; - } - } - - - /// Getting all members of a group. - if ($groupid and !$user) { - if ($gusers = groups_get_members($groupid)) { - $gusers = array_keys($gusers); - $joins[] = 'l.userid IN (' . implode(',', $gusers) . ')'; - } else { - $joins[] = 'l.userid = 0'; // No users in groups, so we want something that will always be false. - } - } - else if ($user) { - $joins[] = "l.userid = :userid"; - $params['userid'] = $user; - } - - if ($date) { - $enddate = $date + 86400; - $joins[] = "l.time > :date AND l.time < :enddate"; - $params['date'] = $date; - $params['enddate'] = $enddate; - } - - $selector = implode(' AND ', $joins); - - $totalcount = 0; // Initialise - $result = array(); - $result['logs'] = get_logs($selector, $params, $order, $limitfrom, $limitnum, $totalcount); - $result['totalcount'] = $totalcount; - return $result; -} - - -function print_log($course, $user=0, $date=0, $order="l.time ASC", $page=0, $perpage=100, - $url="", $modname="", $modid=0, $modaction="", $groupid=0) { - - global $CFG, $DB, $OUTPUT; - - if (!$logs = build_logs_array($course, $user, $date, $order, $page*$perpage, $perpage, - $modname, $modid, $modaction, $groupid)) { - echo $OUTPUT->notification("No logs found!"); - echo $OUTPUT->footer(); - exit; - } - - $courses = array(); - - if ($course->id == SITEID) { - $courses[0] = ''; - if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) { - foreach ($ccc as $cc) { - $courses[$cc->id] = $cc->shortname; - } - } - } else { - $courses[$course->id] = $course->shortname; - } - - $totalcount = $logs['totalcount']; - $count=0; - $ldcache = array(); - $tt = getdate(time()); - $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]); - - $strftimedatetime = get_string("strftimedatetime"); - - echo "
\n"; - print_string("displayingrecords", "", $totalcount); - echo "
\n"; - - echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage"); - - $table = new html_table(); - $table->classes = array('logtable','generaltable'); - $table->align = array('right', 'left', 'left'); - $table->head = array( - get_string('time'), - get_string('ip_address'), - get_string('fullnameuser'), - get_string('action'), - get_string('info') - ); - $table->data = array(); - - if ($course->id == SITEID) { - array_unshift($table->align, 'left'); - array_unshift($table->head, get_string('course')); - } - - // Make sure that the logs array is an array, even it is empty, to avoid warnings from the foreach. - if (empty($logs['logs'])) { - $logs['logs'] = array(); - } - - foreach ($logs['logs'] as $log) { - - if (isset($ldcache[$log->module][$log->action])) { - $ld = $ldcache[$log->module][$log->action]; - } else { - $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); - $ldcache[$log->module][$log->action] = $ld; - } - if ($ld && is_numeric($log->info)) { - // ugly hack to make sure fullname is shown correctly - if ($ld->mtable == 'user' && $ld->field == $DB->sql_concat('firstname', "' '" , 'lastname')) { - $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); - } else { - $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); - } - } - - //Filter log->info - $log->info = format_string($log->info); - - // If $log->url has been trimmed short by the db size restriction - // code in add_to_log, keep a note so we don't add a link to a broken url - $brokenurl=(core_text::strlen($log->url)==100 && core_text::substr($log->url,97)=='...'); - - $row = array(); - if ($course->id == SITEID) { - if (empty($log->course)) { - $row[] = get_string('site'); - } else { - $row[] = "wwwroot}/course/view.php?id={$log->course}\">". format_string($courses[$log->course]).""; - } - } - - $row[] = userdate($log->time, '%a').' '.userdate($log->time, $strftimedatetime); - - $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid"); - $row[] = $OUTPUT->action_link($link, $log->ip, new popup_action('click', $link, 'iplookup', array('height' => 440, 'width' => 700))); - - $row[] = html_writer::link(new moodle_url("/user/view.php?id={$log->userid}&course={$log->course}"), fullname($log, has_capability('moodle/site:viewfullnames', context_course::instance($course->id)))); - - $displayaction="$log->module $log->action"; - if ($brokenurl) { - $row[] = $displayaction; - } else { - $link = make_log_url($log->module,$log->url); - $row[] = $OUTPUT->action_link($link, $displayaction, new popup_action('click', $link, 'fromloglive'), array('height' => 440, 'width' => 700)); - } - $row[] = $log->info; - $table->data[] = $row; - } - - echo html_writer::table($table); - echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage"); -} - - -function print_mnet_log($hostid, $course, $user=0, $date=0, $order="l.time ASC", $page=0, $perpage=100, - $url="", $modname="", $modid=0, $modaction="", $groupid=0) { - - global $CFG, $DB, $OUTPUT; - - if (!$logs = build_mnet_logs_array($hostid, $course, $user, $date, $order, $page*$perpage, $perpage, - $modname, $modid, $modaction, $groupid)) { - echo $OUTPUT->notification("No logs found!"); - echo $OUTPUT->footer(); - exit; - } - - if ($course->id == SITEID) { - $courses[0] = ''; - if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname,c.visible')) { - foreach ($ccc as $cc) { - $courses[$cc->id] = $cc->shortname; - } - } - } - - $totalcount = $logs['totalcount']; - $count=0; - $ldcache = array(); - $tt = getdate(time()); - $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]); - - $strftimedatetime = get_string("strftimedatetime"); - - echo "
\n"; - print_string("displayingrecords", "", $totalcount); - echo "
\n"; - - echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage"); - - echo "\n"; - echo ""; - if ($course->id == SITEID) { - echo "\n"; - } - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - echo "\n"; - - if (empty($logs['logs'])) { - echo "
".get_string('course')."".get_string('time')."".get_string('ip_address')."".get_string('fullnameuser')."".get_string('action')."".get_string('info')."
\n"; - return; - } - - $row = 1; - foreach ($logs['logs'] as $log) { - - $log->info = $log->coursename; - $row = ($row + 1) % 2; - - if (isset($ldcache[$log->module][$log->action])) { - $ld = $ldcache[$log->module][$log->action]; - } else { - $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); - $ldcache[$log->module][$log->action] = $ld; - } - if (0 && $ld && !empty($log->info)) { - // ugly hack to make sure fullname is shown correctly - if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) { - $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); - } else { - $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); - } - } - - //Filter log->info - $log->info = format_string($log->info); - - echo ''; - if ($course->id == SITEID) { - $courseshortname = format_string($courses[$log->course], true, array('context' => context_course::instance(SITEID))); - echo "\n"; - echo " wwwroot}/course/view.php?id={$log->course}\">".$courseshortname."\n"; - echo "\n"; - } - echo "".userdate($log->time, '%a'). - ' '.userdate($log->time, $strftimedatetime)."\n"; - echo "\n"; - $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid"); - echo $OUTPUT->action_link($link, $log->ip, new popup_action('click', $link, 'iplookup', array('height' => 400, 'width' => 700))); - echo "\n"; - $fullname = fullname($log, has_capability('moodle/site:viewfullnames', context_course::instance($course->id))); - echo "\n"; - echo " wwwroot/user/view.php?id={$log->userid}\">$fullname\n"; - echo "\n"; - echo "\n"; - echo $log->action .': '.$log->module; - echo "\n"; - echo "{$log->info}\n"; - echo "\n"; - } - echo "\n"; - - echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage"); -} - - -function print_log_csv($course, $user, $date, $order='l.time DESC', $modname, - $modid, $modaction, $groupid) { - global $DB, $CFG; - - require_once($CFG->libdir . '/csvlib.class.php'); - - $csvexporter = new csv_export_writer('tab'); - - $header = array(); - $header[] = get_string('course'); - $header[] = get_string('time'); - $header[] = get_string('ip_address'); - $header[] = get_string('fullnameuser'); - $header[] = get_string('action'); - $header[] = get_string('info'); - - if (!$logs = build_logs_array($course, $user, $date, $order, '', '', - $modname, $modid, $modaction, $groupid)) { - return false; - } - - $courses = array(); - - if ($course->id == SITEID) { - $courses[0] = ''; - if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) { - foreach ($ccc as $cc) { - $courses[$cc->id] = $cc->shortname; - } - } - } else { - $courses[$course->id] = $course->shortname; - } - - $count=0; - $ldcache = array(); - $tt = getdate(time()); - $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]); - - $strftimedatetime = get_string("strftimedatetime"); - - $csvexporter->set_filename('logs', '.txt'); - $title = array(get_string('savedat').userdate(time(), $strftimedatetime)); - $csvexporter->add_data($title); - $csvexporter->add_data($header); - - if (empty($logs['logs'])) { - return true; - } - - foreach ($logs['logs'] as $log) { - if (isset($ldcache[$log->module][$log->action])) { - $ld = $ldcache[$log->module][$log->action]; - } else { - $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); - $ldcache[$log->module][$log->action] = $ld; - } - if ($ld && is_numeric($log->info)) { - // ugly hack to make sure fullname is shown correctly - if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) { - $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); - } else { - $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); - } - } - - //Filter log->info - $log->info = format_string($log->info); - $log->info = strip_tags(urldecode($log->info)); // Some XSS protection - - $coursecontext = context_course::instance($course->id); - $firstField = format_string($courses[$log->course], true, array('context' => $coursecontext)); - $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext)); - $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url); - $row = array($firstField, userdate($log->time, $strftimedatetime), $log->ip, $fullname, $log->module.' '.$log->action.' ('.$actionurl.')', $log->info); - $csvexporter->add_data($row); - } - $csvexporter->download_file(); - return true; -} - - -function print_log_xls($course, $user, $date, $order='l.time DESC', $modname, - $modid, $modaction, $groupid) { - - global $CFG, $DB; - - require_once("$CFG->libdir/excellib.class.php"); - - if (!$logs = build_logs_array($course, $user, $date, $order, '', '', - $modname, $modid, $modaction, $groupid)) { - return false; - } - - $courses = array(); - - if ($course->id == SITEID) { - $courses[0] = ''; - if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) { - foreach ($ccc as $cc) { - $courses[$cc->id] = $cc->shortname; - } - } - } else { - $courses[$course->id] = $course->shortname; - } - - $count=0; - $ldcache = array(); - $tt = getdate(time()); - $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]); - - $strftimedatetime = get_string("strftimedatetime"); - - $nroPages = ceil(count($logs)/(EXCELROWS-FIRSTUSEDEXCELROW+1)); - $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false); - $filename .= '.xls'; - - $workbook = new MoodleExcelWorkbook('-'); - $workbook->send($filename); - - $worksheet = array(); - $headers = array(get_string('course'), get_string('time'), get_string('ip_address'), - get_string('fullnameuser'), get_string('action'), get_string('info')); - - // Creating worksheets - for ($wsnumber = 1; $wsnumber <= $nroPages; $wsnumber++) { - $sheettitle = get_string('logs').' '.$wsnumber.'-'.$nroPages; - $worksheet[$wsnumber] = $workbook->add_worksheet($sheettitle); - $worksheet[$wsnumber]->set_column(1, 1, 30); - $worksheet[$wsnumber]->write_string(0, 0, get_string('savedat'). - userdate(time(), $strftimedatetime)); - $col = 0; - foreach ($headers as $item) { - $worksheet[$wsnumber]->write(FIRSTUSEDEXCELROW-1,$col,$item,''); - $col++; - } - } - - if (empty($logs['logs'])) { - $workbook->close(); - return true; - } - - $formatDate =& $workbook->add_format(); - $formatDate->set_num_format(get_string('log_excel_date_format')); - - $row = FIRSTUSEDEXCELROW; - $wsnumber = 1; - $myxls =& $worksheet[$wsnumber]; - foreach ($logs['logs'] as $log) { - if (isset($ldcache[$log->module][$log->action])) { - $ld = $ldcache[$log->module][$log->action]; - } else { - $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); - $ldcache[$log->module][$log->action] = $ld; - } - if ($ld && is_numeric($log->info)) { - // ugly hack to make sure fullname is shown correctly - if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) { - $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); - } else { - $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); - } - } - - // Filter log->info - $log->info = format_string($log->info); - $log->info = strip_tags(urldecode($log->info)); // Some XSS protection - - if ($nroPages>1) { - if ($row > EXCELROWS) { - $wsnumber++; - $myxls =& $worksheet[$wsnumber]; - $row = FIRSTUSEDEXCELROW; - } - } - - $coursecontext = context_course::instance($course->id); - - $myxls->write($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext)), ''); - $myxls->write_date($row, 1, $log->time, $formatDate); // write_date() does conversion/timezone support. MDL-14934 - $myxls->write($row, 2, $log->ip, ''); - $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext)); - $myxls->write($row, 3, $fullname, ''); - $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url); - $myxls->write($row, 4, $log->module.' '.$log->action.' ('.$actionurl.')', ''); - $myxls->write($row, 5, $log->info, ''); - - $row++; - } - - $workbook->close(); - return true; -} - -function print_log_ods($course, $user, $date, $order='l.time DESC', $modname, - $modid, $modaction, $groupid) { - - global $CFG, $DB; - - require_once("$CFG->libdir/odslib.class.php"); - - if (!$logs = build_logs_array($course, $user, $date, $order, '', '', - $modname, $modid, $modaction, $groupid)) { - return false; - } - - $courses = array(); - - if ($course->id == SITEID) { - $courses[0] = ''; - if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) { - foreach ($ccc as $cc) { - $courses[$cc->id] = $cc->shortname; - } - } - } else { - $courses[$course->id] = $course->shortname; - } - - $count=0; - $ldcache = array(); - $tt = getdate(time()); - $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]); - - $strftimedatetime = get_string("strftimedatetime"); - - $nroPages = ceil(count($logs)/(EXCELROWS-FIRSTUSEDEXCELROW+1)); - $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false); - $filename .= '.ods'; - - $workbook = new MoodleODSWorkbook('-'); - $workbook->send($filename); - - $worksheet = array(); - $headers = array(get_string('course'), get_string('time'), get_string('ip_address'), - get_string('fullnameuser'), get_string('action'), get_string('info')); - - // Creating worksheets - for ($wsnumber = 1; $wsnumber <= $nroPages; $wsnumber++) { - $sheettitle = get_string('logs').' '.$wsnumber.'-'.$nroPages; - $worksheet[$wsnumber] = $workbook->add_worksheet($sheettitle); - $worksheet[$wsnumber]->set_column(1, 1, 30); - $worksheet[$wsnumber]->write_string(0, 0, get_string('savedat'). - userdate(time(), $strftimedatetime)); - $col = 0; - foreach ($headers as $item) { - $worksheet[$wsnumber]->write(FIRSTUSEDEXCELROW-1,$col,$item,''); - $col++; - } - } - - if (empty($logs['logs'])) { - $workbook->close(); - return true; - } - - $formatDate =& $workbook->add_format(); - $formatDate->set_num_format(get_string('log_excel_date_format')); - - $row = FIRSTUSEDEXCELROW; - $wsnumber = 1; - $myxls =& $worksheet[$wsnumber]; - foreach ($logs['logs'] as $log) { - if (isset($ldcache[$log->module][$log->action])) { - $ld = $ldcache[$log->module][$log->action]; - } else { - $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); - $ldcache[$log->module][$log->action] = $ld; - } - if ($ld && is_numeric($log->info)) { - // ugly hack to make sure fullname is shown correctly - if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) { - $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); - } else { - $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); - } - } - - // Filter log->info - $log->info = format_string($log->info); - $log->info = strip_tags(urldecode($log->info)); // Some XSS protection - - if ($nroPages>1) { - if ($row > EXCELROWS) { - $wsnumber++; - $myxls =& $worksheet[$wsnumber]; - $row = FIRSTUSEDEXCELROW; - } - } - - $coursecontext = context_course::instance($course->id); - - $myxls->write_string($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext))); - $myxls->write_date($row, 1, $log->time); - $myxls->write_string($row, 2, $log->ip); - $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext)); - $myxls->write_string($row, 3, $fullname); - $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url); - $myxls->write_string($row, 4, $log->module.' '.$log->action.' ('.$actionurl.')'); - $myxls->write_string($row, 5, $log->info); - - $row++; - } - - $workbook->close(); - return true; -} - /** * Checks the integrity of the course data. * diff --git a/lib/datalib.php b/lib/datalib.php index 43e2411beb3..96a940cf683 100644 --- a/lib/datalib.php +++ b/lib/datalib.php @@ -1671,116 +1671,6 @@ function user_accesstime_log($courseid=0) { } } -/** - * Select all log records based on SQL criteria - * - * @package core - * @category log - * @global moodle_database $DB - * @param string $select SQL select criteria - * @param array $params named sql type params - * @param string $order SQL order by clause to sort the records returned - * @param string $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set) - * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set) - * @param int $totalcount Passed in by reference. - * @return array - */ -function get_logs($select, array $params=null, $order='l.time DESC', $limitfrom='', $limitnum='', &$totalcount) { - global $DB; - - if ($order) { - $order = "ORDER BY $order"; - } - - $selectsql = ""; - $countsql = ""; - - if ($select) { - $select = "WHERE $select"; - } - - $sql = "SELECT COUNT(*) - FROM {log} l - $select"; - - $totalcount = $DB->count_records_sql($sql, $params); - $allnames = get_all_user_name_fields(true, 'u'); - $sql = "SELECT l.*, $allnames, u.picture - FROM {log} l - LEFT JOIN {user} u ON l.userid = u.id - $select - $order"; - - return $DB->get_records_sql($sql, $params, $limitfrom, $limitnum) ; -} - - -/** - * Select all log records for a given course and user - * - * @package core - * @category log - * @global moodle_database $DB - * @uses DAYSECS - * @param int $userid The id of the user as found in the 'user' table. - * @param int $courseid The id of the course as found in the 'course' table. - * @param string $coursestart unix timestamp representing course start date and time. - * @return array - */ -function get_logs_usercourse($userid, $courseid, $coursestart) { - global $DB; - - $params = array(); - - $courseselect = ''; - if ($courseid) { - $courseselect = "AND course = :courseid"; - $params['courseid'] = $courseid; - } - $params['userid'] = $userid; - // We have to sanitize this param ourselves here instead of relying on DB. - // Postgres complains if you use name parameter or column alias in GROUP BY. - // See MDL-27696 and 51c3e85 for details. - $coursestart = (int)$coursestart; - - return $DB->get_records_sql("SELECT FLOOR((time - $coursestart)/". DAYSECS .") AS day, COUNT(*) AS num - FROM {log} - WHERE userid = :userid - AND time > $coursestart $courseselect - GROUP BY FLOOR((time - $coursestart)/". DAYSECS .")", $params); -} - -/** - * Select all log records for a given course, user, and day - * - * @package core - * @category log - * @global moodle_database $DB - * @uses HOURSECS - * @param int $userid The id of the user as found in the 'user' table. - * @param int $courseid The id of the course as found in the 'course' table. - * @param string $daystart unix timestamp of the start of the day for which the logs needs to be retrived - * @return array - */ -function get_logs_userday($userid, $courseid, $daystart) { - global $DB; - - $params = array('userid'=>$userid); - - $courseselect = ''; - if ($courseid) { - $courseselect = "AND course = :courseid"; - $params['courseid'] = $courseid; - } - $daystart = (int)$daystart; // note: unfortunately pg complains if you use name parameter or column alias in GROUP BY - - return $DB->get_records_sql("SELECT FLOOR((time - $daystart)/". HOURSECS .") AS hour, COUNT(*) AS num - FROM {log} - WHERE userid = :userid - AND time > $daystart $courseselect - GROUP BY FLOOR((time - $daystart)/". HOURSECS .") ", $params); -} - /// GENERAL HELPFUL THINGS /////////////////////////////////// /** diff --git a/lib/deprecatedlib.php b/lib/deprecatedlib.php index 375906a6ec6..01bd4caf5ad 100644 --- a/lib/deprecatedlib.php +++ b/lib/deprecatedlib.php @@ -5618,3 +5618,756 @@ function message_is_user_blocked($recipient, $sender = null) { return \core_message\api::is_user_blocked($recipient, $sender); } + +/** + * Display logs. + * + * @deprecated since 3.2 + */ +function print_log($course, $user=0, $date=0, $order="l.time ASC", $page=0, $perpage=100, + $url="", $modname="", $modid=0, $modaction="", $groupid=0) { + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + + global $CFG, $DB, $OUTPUT; + + if (!$logs = build_logs_array($course, $user, $date, $order, $page*$perpage, $perpage, + $modname, $modid, $modaction, $groupid)) { + echo $OUTPUT->notification("No logs found!"); + echo $OUTPUT->footer(); + exit; + } + + $courses = array(); + + if ($course->id == SITEID) { + $courses[0] = ''; + if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) { + foreach ($ccc as $cc) { + $courses[$cc->id] = $cc->shortname; + } + } + } else { + $courses[$course->id] = $course->shortname; + } + + $totalcount = $logs['totalcount']; + $ldcache = array(); + + $strftimedatetime = get_string("strftimedatetime"); + + echo "
\n"; + print_string("displayingrecords", "", $totalcount); + echo "
\n"; + + echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage"); + + $table = new html_table(); + $table->classes = array('logtable','generaltable'); + $table->align = array('right', 'left', 'left'); + $table->head = array( + get_string('time'), + get_string('ip_address'), + get_string('fullnameuser'), + get_string('action'), + get_string('info') + ); + $table->data = array(); + + if ($course->id == SITEID) { + array_unshift($table->align, 'left'); + array_unshift($table->head, get_string('course')); + } + + // Make sure that the logs array is an array, even it is empty, to avoid warnings from the foreach. + if (empty($logs['logs'])) { + $logs['logs'] = array(); + } + + foreach ($logs['logs'] as $log) { + + if (isset($ldcache[$log->module][$log->action])) { + $ld = $ldcache[$log->module][$log->action]; + } else { + $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); + $ldcache[$log->module][$log->action] = $ld; + } + if ($ld && is_numeric($log->info)) { + // ugly hack to make sure fullname is shown correctly + if ($ld->mtable == 'user' && $ld->field == $DB->sql_concat('firstname', "' '" , 'lastname')) { + $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); + } else { + $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); + } + } + + //Filter log->info + $log->info = format_string($log->info); + + // If $log->url has been trimmed short by the db size restriction + // code in add_to_log, keep a note so we don't add a link to a broken url + $brokenurl=(core_text::strlen($log->url)==100 && core_text::substr($log->url,97)=='...'); + + $row = array(); + if ($course->id == SITEID) { + if (empty($log->course)) { + $row[] = get_string('site'); + } else { + $row[] = "wwwroot}/course/view.php?id={$log->course}\">". format_string($courses[$log->course]).""; + } + } + + $row[] = userdate($log->time, '%a').' '.userdate($log->time, $strftimedatetime); + + $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid"); + $row[] = $OUTPUT->action_link($link, $log->ip, new popup_action('click', $link, 'iplookup', array('height' => 440, 'width' => 700))); + + $row[] = html_writer::link(new moodle_url("/user/view.php?id={$log->userid}&course={$log->course}"), fullname($log, has_capability('moodle/site:viewfullnames', context_course::instance($course->id)))); + + $displayaction="$log->module $log->action"; + if ($brokenurl) { + $row[] = $displayaction; + } else { + $link = make_log_url($log->module,$log->url); + $row[] = $OUTPUT->action_link($link, $displayaction, new popup_action('click', $link, 'fromloglive'), array('height' => 440, 'width' => 700)); + } + $row[] = $log->info; + $table->data[] = $row; + } + + echo html_writer::table($table); + echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage"); +} + +/** + * Display MNET logs. + * + * @deprecated since 3.2 + */ +function print_mnet_log($hostid, $course, $user=0, $date=0, $order="l.time ASC", $page=0, $perpage=100, + $url="", $modname="", $modid=0, $modaction="", $groupid=0) { + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + + global $CFG, $DB, $OUTPUT; + + if (!$logs = build_mnet_logs_array($hostid, $course, $user, $date, $order, $page*$perpage, $perpage, + $modname, $modid, $modaction, $groupid)) { + echo $OUTPUT->notification("No logs found!"); + echo $OUTPUT->footer(); + exit; + } + + if ($course->id == SITEID) { + $courses[0] = ''; + if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname,c.visible')) { + foreach ($ccc as $cc) { + $courses[$cc->id] = $cc->shortname; + } + } + } + + $totalcount = $logs['totalcount']; + $ldcache = array(); + + $strftimedatetime = get_string("strftimedatetime"); + + echo "
\n"; + print_string("displayingrecords", "", $totalcount); + echo "
\n"; + + echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage"); + + echo "\n"; + echo ""; + if ($course->id == SITEID) { + echo "\n"; + } + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + echo "\n"; + + if (empty($logs['logs'])) { + echo "
".get_string('course')."".get_string('time')."".get_string('ip_address')."".get_string('fullnameuser')."".get_string('action')."".get_string('info')."
\n"; + return; + } + + $row = 1; + foreach ($logs['logs'] as $log) { + + $log->info = $log->coursename; + $row = ($row + 1) % 2; + + if (isset($ldcache[$log->module][$log->action])) { + $ld = $ldcache[$log->module][$log->action]; + } else { + $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); + $ldcache[$log->module][$log->action] = $ld; + } + if (0 && $ld && !empty($log->info)) { + // ugly hack to make sure fullname is shown correctly + if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) { + $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); + } else { + $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); + } + } + + //Filter log->info + $log->info = format_string($log->info); + + echo ''; + if ($course->id == SITEID) { + $courseshortname = format_string($courses[$log->course], true, array('context' => context_course::instance(SITEID))); + echo "\n"; + echo " wwwroot}/course/view.php?id={$log->course}\">".$courseshortname."\n"; + echo "\n"; + } + echo "".userdate($log->time, '%a'). + ' '.userdate($log->time, $strftimedatetime)."\n"; + echo "\n"; + $link = new moodle_url("/iplookup/index.php?ip=$log->ip&user=$log->userid"); + echo $OUTPUT->action_link($link, $log->ip, new popup_action('click', $link, 'iplookup', array('height' => 400, 'width' => 700))); + echo "\n"; + $fullname = fullname($log, has_capability('moodle/site:viewfullnames', context_course::instance($course->id))); + echo "\n"; + echo " wwwroot/user/view.php?id={$log->userid}\">$fullname\n"; + echo "\n"; + echo "\n"; + echo $log->action .': '.$log->module; + echo "\n"; + echo "{$log->info}\n"; + echo "\n"; + } + echo "\n"; + + echo $OUTPUT->paging_bar($totalcount, $page, $perpage, "$url&perpage=$perpage"); +} + +/** + * Display logs in CSV format. + * + * @deprecated since 3.2 + */ +function print_log_csv($course, $user, $date, $order='l.time DESC', $modname, + $modid, $modaction, $groupid) { + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + + global $DB, $CFG; + + require_once($CFG->libdir . '/csvlib.class.php'); + + $csvexporter = new csv_export_writer('tab'); + + $header = array(); + $header[] = get_string('course'); + $header[] = get_string('time'); + $header[] = get_string('ip_address'); + $header[] = get_string('fullnameuser'); + $header[] = get_string('action'); + $header[] = get_string('info'); + + if (!$logs = build_logs_array($course, $user, $date, $order, '', '', + $modname, $modid, $modaction, $groupid)) { + return false; + } + + $courses = array(); + + if ($course->id == SITEID) { + $courses[0] = ''; + if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) { + foreach ($ccc as $cc) { + $courses[$cc->id] = $cc->shortname; + } + } + } else { + $courses[$course->id] = $course->shortname; + } + + $count=0; + $ldcache = array(); + $tt = getdate(time()); + $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]); + + $strftimedatetime = get_string("strftimedatetime"); + + $csvexporter->set_filename('logs', '.txt'); + $title = array(get_string('savedat').userdate(time(), $strftimedatetime)); + $csvexporter->add_data($title); + $csvexporter->add_data($header); + + if (empty($logs['logs'])) { + return true; + } + + foreach ($logs['logs'] as $log) { + if (isset($ldcache[$log->module][$log->action])) { + $ld = $ldcache[$log->module][$log->action]; + } else { + $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); + $ldcache[$log->module][$log->action] = $ld; + } + if ($ld && is_numeric($log->info)) { + // ugly hack to make sure fullname is shown correctly + if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) { + $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); + } else { + $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); + } + } + + //Filter log->info + $log->info = format_string($log->info); + $log->info = strip_tags(urldecode($log->info)); // Some XSS protection + + $coursecontext = context_course::instance($course->id); + $firstField = format_string($courses[$log->course], true, array('context' => $coursecontext)); + $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext)); + $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url); + $row = array($firstField, userdate($log->time, $strftimedatetime), $log->ip, $fullname, $log->module.' '.$log->action.' ('.$actionurl.')', $log->info); + $csvexporter->add_data($row); + } + $csvexporter->download_file(); + return true; +} + +/** + * Display logs in XLS format. + * + * @deprecated since 3.2 + */ +function print_log_xls($course, $user, $date, $order='l.time DESC', $modname, + $modid, $modaction, $groupid) { + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + + global $CFG, $DB; + + require_once("$CFG->libdir/excellib.class.php"); + + if (!$logs = build_logs_array($course, $user, $date, $order, '', '', + $modname, $modid, $modaction, $groupid)) { + return false; + } + + $courses = array(); + + if ($course->id == SITEID) { + $courses[0] = ''; + if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) { + foreach ($ccc as $cc) { + $courses[$cc->id] = $cc->shortname; + } + } + } else { + $courses[$course->id] = $course->shortname; + } + + $count=0; + $ldcache = array(); + $tt = getdate(time()); + $today = mktime (0, 0, 0, $tt["mon"], $tt["mday"], $tt["year"]); + + $strftimedatetime = get_string("strftimedatetime"); + + $nroPages = ceil(count($logs)/(EXCELROWS-FIRSTUSEDEXCELROW+1)); + $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false); + $filename .= '.xls'; + + $workbook = new MoodleExcelWorkbook('-'); + $workbook->send($filename); + + $worksheet = array(); + $headers = array(get_string('course'), get_string('time'), get_string('ip_address'), + get_string('fullnameuser'), get_string('action'), get_string('info')); + + // Creating worksheets + for ($wsnumber = 1; $wsnumber <= $nroPages; $wsnumber++) { + $sheettitle = get_string('logs').' '.$wsnumber.'-'.$nroPages; + $worksheet[$wsnumber] = $workbook->add_worksheet($sheettitle); + $worksheet[$wsnumber]->set_column(1, 1, 30); + $worksheet[$wsnumber]->write_string(0, 0, get_string('savedat'). + userdate(time(), $strftimedatetime)); + $col = 0; + foreach ($headers as $item) { + $worksheet[$wsnumber]->write(FIRSTUSEDEXCELROW-1,$col,$item,''); + $col++; + } + } + + if (empty($logs['logs'])) { + $workbook->close(); + return true; + } + + $formatDate =& $workbook->add_format(); + $formatDate->set_num_format(get_string('log_excel_date_format')); + + $row = FIRSTUSEDEXCELROW; + $wsnumber = 1; + $myxls =& $worksheet[$wsnumber]; + foreach ($logs['logs'] as $log) { + if (isset($ldcache[$log->module][$log->action])) { + $ld = $ldcache[$log->module][$log->action]; + } else { + $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); + $ldcache[$log->module][$log->action] = $ld; + } + if ($ld && is_numeric($log->info)) { + // ugly hack to make sure fullname is shown correctly + if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) { + $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); + } else { + $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); + } + } + + // Filter log->info + $log->info = format_string($log->info); + $log->info = strip_tags(urldecode($log->info)); // Some XSS protection + + if ($nroPages>1) { + if ($row > EXCELROWS) { + $wsnumber++; + $myxls =& $worksheet[$wsnumber]; + $row = FIRSTUSEDEXCELROW; + } + } + + $coursecontext = context_course::instance($course->id); + + $myxls->write($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext)), ''); + $myxls->write_date($row, 1, $log->time, $formatDate); // write_date() does conversion/timezone support. MDL-14934 + $myxls->write($row, 2, $log->ip, ''); + $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext)); + $myxls->write($row, 3, $fullname, ''); + $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url); + $myxls->write($row, 4, $log->module.' '.$log->action.' ('.$actionurl.')', ''); + $myxls->write($row, 5, $log->info, ''); + + $row++; + } + + $workbook->close(); + return true; +} + +/** + * Display logs in ODS format. + * + * @deprecated since 3.2 + */ +function print_log_ods($course, $user, $date, $order='l.time DESC', $modname, + $modid, $modaction, $groupid) { + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + + global $CFG, $DB; + + require_once("$CFG->libdir/odslib.class.php"); + + if (!$logs = build_logs_array($course, $user, $date, $order, '', '', + $modname, $modid, $modaction, $groupid)) { + return false; + } + + $courses = array(); + + if ($course->id == SITEID) { + $courses[0] = ''; + if ($ccc = get_courses('all', 'c.id ASC', 'c.id,c.shortname')) { + foreach ($ccc as $cc) { + $courses[$cc->id] = $cc->shortname; + } + } + } else { + $courses[$course->id] = $course->shortname; + } + + $ldcache = array(); + + $strftimedatetime = get_string("strftimedatetime"); + + $nroPages = ceil(count($logs)/(EXCELROWS-FIRSTUSEDEXCELROW+1)); + $filename = 'logs_'.userdate(time(),get_string('backupnameformat', 'langconfig'),99,false); + $filename .= '.ods'; + + $workbook = new MoodleODSWorkbook('-'); + $workbook->send($filename); + + $worksheet = array(); + $headers = array(get_string('course'), get_string('time'), get_string('ip_address'), + get_string('fullnameuser'), get_string('action'), get_string('info')); + + // Creating worksheets + for ($wsnumber = 1; $wsnumber <= $nroPages; $wsnumber++) { + $sheettitle = get_string('logs').' '.$wsnumber.'-'.$nroPages; + $worksheet[$wsnumber] = $workbook->add_worksheet($sheettitle); + $worksheet[$wsnumber]->set_column(1, 1, 30); + $worksheet[$wsnumber]->write_string(0, 0, get_string('savedat'). + userdate(time(), $strftimedatetime)); + $col = 0; + foreach ($headers as $item) { + $worksheet[$wsnumber]->write(FIRSTUSEDEXCELROW-1,$col,$item,''); + $col++; + } + } + + if (empty($logs['logs'])) { + $workbook->close(); + return true; + } + + $formatDate =& $workbook->add_format(); + $formatDate->set_num_format(get_string('log_excel_date_format')); + + $row = FIRSTUSEDEXCELROW; + $wsnumber = 1; + $myxls =& $worksheet[$wsnumber]; + foreach ($logs['logs'] as $log) { + if (isset($ldcache[$log->module][$log->action])) { + $ld = $ldcache[$log->module][$log->action]; + } else { + $ld = $DB->get_record('log_display', array('module'=>$log->module, 'action'=>$log->action)); + $ldcache[$log->module][$log->action] = $ld; + } + if ($ld && is_numeric($log->info)) { + // ugly hack to make sure fullname is shown correctly + if (($ld->mtable == 'user') and ($ld->field == $DB->sql_concat('firstname', "' '" , 'lastname'))) { + $log->info = fullname($DB->get_record($ld->mtable, array('id'=>$log->info)), true); + } else { + $log->info = $DB->get_field($ld->mtable, $ld->field, array('id'=>$log->info)); + } + } + + // Filter log->info + $log->info = format_string($log->info); + $log->info = strip_tags(urldecode($log->info)); // Some XSS protection + + if ($nroPages>1) { + if ($row > EXCELROWS) { + $wsnumber++; + $myxls =& $worksheet[$wsnumber]; + $row = FIRSTUSEDEXCELROW; + } + } + + $coursecontext = context_course::instance($course->id); + + $myxls->write_string($row, 0, format_string($courses[$log->course], true, array('context' => $coursecontext))); + $myxls->write_date($row, 1, $log->time); + $myxls->write_string($row, 2, $log->ip); + $fullname = fullname($log, has_capability('moodle/site:viewfullnames', $coursecontext)); + $myxls->write_string($row, 3, $fullname); + $actionurl = $CFG->wwwroot. make_log_url($log->module,$log->url); + $myxls->write_string($row, 4, $log->module.' '.$log->action.' ('.$actionurl.')'); + $myxls->write_string($row, 5, $log->info); + + $row++; + } + + $workbook->close(); + return true; +} + +/** + * Build an array of logs. + * + * @deprecated since 3.2 + */ +function build_logs_array($course, $user=0, $date=0, $order="l.time ASC", $limitfrom='', $limitnum='', + $modname="", $modid=0, $modaction="", $groupid=0) { + global $DB, $SESSION, $USER; + + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + // It is assumed that $date is the GMT time of midnight for that day, + // and so the next 86400 seconds worth of logs are printed. + + // Setup for group handling. + + // If the group mode is separate, and this user does not have editing privileges, + // then only the user's group can be viewed. + if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/course:managegroups', context_course::instance($course->id))) { + if (isset($SESSION->currentgroup[$course->id])) { + $groupid = $SESSION->currentgroup[$course->id]; + } else { + $groupid = groups_get_all_groups($course->id, $USER->id); + if (is_array($groupid)) { + $groupid = array_shift(array_keys($groupid)); + $SESSION->currentgroup[$course->id] = $groupid; + } else { + $groupid = 0; + } + } + } + // If this course doesn't have groups, no groupid can be specified. + else if (!$course->groupmode) { + $groupid = 0; + } + + $joins = array(); + $params = array(); + + if ($course->id != SITEID || $modid != 0) { + $joins[] = "l.course = :courseid"; + $params['courseid'] = $course->id; + } + + if ($modname) { + $joins[] = "l.module = :modname"; + $params['modname'] = $modname; + } + + if ('site_errors' === $modid) { + $joins[] = "( l.action='error' OR l.action='infected' )"; + } else if ($modid) { + $joins[] = "l.cmid = :modid"; + $params['modid'] = $modid; + } + + if ($modaction) { + $firstletter = substr($modaction, 0, 1); + if ($firstletter == '-') { + $joins[] = $DB->sql_like('l.action', ':modaction', false, true, true); + $params['modaction'] = '%'.substr($modaction, 1).'%'; + } else { + $joins[] = $DB->sql_like('l.action', ':modaction', false); + $params['modaction'] = '%'.$modaction.'%'; + } + } + + + /// Getting all members of a group. + if ($groupid and !$user) { + if ($gusers = groups_get_members($groupid)) { + $gusers = array_keys($gusers); + $joins[] = 'l.userid IN (' . implode(',', $gusers) . ')'; + } else { + $joins[] = 'l.userid = 0'; // No users in groups, so we want something that will always be false. + } + } + else if ($user) { + $joins[] = "l.userid = :userid"; + $params['userid'] = $user; + } + + if ($date) { + $enddate = $date + 86400; + $joins[] = "l.time > :date AND l.time < :enddate"; + $params['date'] = $date; + $params['enddate'] = $enddate; + } + + $selector = implode(' AND ', $joins); + + $totalcount = 0; // Initialise + $result = array(); + $result['logs'] = get_logs($selector, $params, $order, $limitfrom, $limitnum, $totalcount); + $result['totalcount'] = $totalcount; + return $result; +} + +/** + * Select all log records for a given course and user. + * + * @deprecated since 3.2 + * @param int $userid The id of the user as found in the 'user' table. + * @param int $courseid The id of the course as found in the 'course' table. + * @param string $coursestart unix timestamp representing course start date and time. + * @return array + */ +function get_logs_usercourse($userid, $courseid, $coursestart) { + global $DB; + + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + + $params = array(); + + $courseselect = ''; + if ($courseid) { + $courseselect = "AND course = :courseid"; + $params['courseid'] = $courseid; + } + $params['userid'] = $userid; + // We have to sanitize this param ourselves here instead of relying on DB. + // Postgres complains if you use name parameter or column alias in GROUP BY. + // See MDL-27696 and 51c3e85 for details. + $coursestart = (int)$coursestart; + + return $DB->get_records_sql("SELECT FLOOR((time - $coursestart)/". DAYSECS .") AS day, COUNT(*) AS num + FROM {log} + WHERE userid = :userid + AND time > $coursestart $courseselect + GROUP BY FLOOR((time - $coursestart)/". DAYSECS .")", $params); +} + +/** + * Select all log records for a given course, user, and day. + * + * @deprecated since 3.2 + * @param int $userid The id of the user as found in the 'user' table. + * @param int $courseid The id of the course as found in the 'course' table. + * @param string $daystart unix timestamp of the start of the day for which the logs needs to be retrived + * @return array + */ +function get_logs_userday($userid, $courseid, $daystart) { + global $DB; + + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + + $params = array('userid'=>$userid); + + $courseselect = ''; + if ($courseid) { + $courseselect = "AND course = :courseid"; + $params['courseid'] = $courseid; + } + // Note: unfortunately pg complains if you use name parameter or column alias in GROUP BY. + $daystart = (int) $daystart; + + return $DB->get_records_sql("SELECT FLOOR((time - $daystart)/". HOURSECS .") AS hour, COUNT(*) AS num + FROM {log} + WHERE userid = :userid + AND time > $daystart $courseselect + GROUP BY FLOOR((time - $daystart)/". HOURSECS .") ", $params); +} + +/** + * Select all log records based on SQL criteria. + * + * @deprecated since 3.2 + * @param string $select SQL select criteria + * @param array $params named sql type params + * @param string $order SQL order by clause to sort the records returned + * @param string $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set) + * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set) + * @param int $totalcount Passed in by reference. + * @return array + */ +function get_logs($select, array $params=null, $order='l.time DESC', $limitfrom='', $limitnum='', &$totalcount) { + global $DB; + + debugging(__FUNCTION__ . '() is deprecated. Please use the report_log framework instead.', DEBUG_DEVELOPER); + + if ($order) { + $order = "ORDER BY $order"; + } + + if ($select) { + $select = "WHERE $select"; + } + + $sql = "SELECT COUNT(*) + FROM {log} l + $select"; + + $totalcount = $DB->count_records_sql($sql, $params); + $allnames = get_all_user_name_fields(true, 'u'); + $sql = "SELECT l.*, $allnames, u.picture + FROM {log} l + LEFT JOIN {user} u ON l.userid = u.id + $select + $order"; + + return $DB->get_records_sql($sql, $params, $limitfrom, $limitnum) ; +} diff --git a/lib/upgrade.txt b/lib/upgrade.txt index a976d78ac4c..e7966bb9fc6 100644 --- a/lib/upgrade.txt +++ b/lib/upgrade.txt @@ -28,6 +28,15 @@ information provided here is intended especially for developers. - put_records_csv() Please use download_as_dataformat (lib/dataformatlib.php) instead. - zip_files() - See MDL-24343 for more information. - unzip_file() - See MDL-24343 for more information. + - print_log - See MDL-43681 for more information + - print_log_csv - See MDL-43681 for more information + - print_log_ods - See MDL-43681 for more information + - print_log_xls - See MDL-43681 for more information + - print_mnet_log - See MDL-43681 for more information + - build_logs_array - See MDL-43681 for more information + - get_logs - See MDL-43681 for more information + - get_logs_usercourse - See MDL-43681 for more information + - get_logs_userdat - See MDL-43681 for more information * The password_compat library was removed as it is no longer required. * Phpunit has been upgraded to 5.4.x and following has been deprecated and is not used any more: - setExpectedException(), use @expectedException or $this->expectException() and $this->expectExceptionMessage()