. /** * Task log table. * * @package core_admin * @copyright 2018 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ namespace core_admin; defined('MOODLE_INTERNAL') || die(); require_once($CFG->libdir . '/tablelib.php'); /** * Table to display list of task logs. * * @copyright 2018 Andrew Nicols * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ class task_log_table extends \table_sql { /** * Constructor for the task_log table. * * @param string $filter * @param int $resultfilter */ public function __construct(string $filter = '', int $resultfilter = null) { global $DB; if (-1 === $resultfilter) { $resultfilter = null; } parent::__construct('tasklogs'); $columnheaders = [ 'classname' => get_string('name'), 'type' => get_string('tasktype', 'admin'), 'userid' => get_string('user', 'admin'), 'timestart' => get_string('task_starttime', 'admin'), 'duration' => get_string('task_duration', 'admin'), 'db' => get_string('task_dbstats', 'admin'), 'result' => get_string('task_result', 'admin'), 'actions' => '', ]; $this->define_columns(array_keys($columnheaders)); $this->define_headers(array_values($columnheaders)); // The name column is a header. $this->define_header_column('classname'); // This table is not collapsible. $this->collapsible(false); // The actions class should not wrap. Use the BS text utility class. $this->column_class('actions', 'text-nowrap'); // Allow pagination. $this->pageable(true); // Allow sorting. Default to sort by timestarted DESC. $this->sortable(true, 'timestart', SORT_DESC); // Add filtering. $where = []; $params = []; if (!empty($filter)) { $orwhere = []; $filter = str_replace('\\', '\\\\', $filter); // Check the class name. $orwhere[] = $DB->sql_like('classname', ':classfilter', false, false); $params['classfilter'] = '%' . $DB->sql_like_escape($filter) . '%'; $orwhere[] = $DB->sql_like('output', ':outputfilter', false, false); $params['outputfilter'] = '%' . $DB->sql_like_escape($filter) . '%'; $where[] = "(" . implode(' OR ', $orwhere) . ")"; } if (null !== $resultfilter) { $where[] = 'tl.result = :result'; $params['result'] = $resultfilter; } $where = implode(' AND ', $where); $this->set_sql('', '', $where, $params); } /** * Query the db. Store results in the table object for use by build_table. * * @param int $pagesize size of page for paginated displayed table. * @param bool $useinitialsbar do you want to use the initials bar. Bar * will only be used if there is a fullname column defined for the table. */ public function query_db($pagesize, $useinitialsbar = true) { global $DB; // Fetch the attempts. $sort = $this->get_sql_sort(); if ($sort) { $sort = "ORDER BY $sort"; } $extrafields = get_extra_user_fields(\context_system::instance()); $userfields = \user_picture::fields('u', $extrafields, 'userid2', 'user'); $where = ''; if (!empty($this->sql->where)) { $where = "WHERE {$this->sql->where}"; } $sql = "SELECT tl.*, tl.dbreads + tl.dbwrites AS db, tl.timeend - tl.timestart AS duration, {$userfields} FROM {task_log} tl LEFT JOIN {user} u ON u.id = tl.userid {$where} {$sort}"; $this->pagesize($pagesize, $DB->count_records_sql("SELECT COUNT('x') FROM {task_log} tl {$where}", $this->sql->params)); if (!$this->is_downloading()) { $this->rawdata = $DB->get_records_sql($sql, $this->sql->params, $this->get_page_start(), $this->get_page_size()); } else { $this->rawdata = $DB->get_records_sql($sql, $this->sql->params); } } /** * Format the name cell. * * @param \stdClass $row * @return string */ public function col_classname($row) : string { $output = ''; if (class_exists($row->classname)) { $task = new $row->classname; if ($task instanceof \core\task\scheduled_task) { $output = $task->get_name(); } } $output .= \html_writer::tag('div', "\\{$row->classname}", [ 'class' => 'task-class', ]); return $output; } /** * Format the type cell. * * @param \stdClass $row * @return string */ public function col_type($row) : string { if (\core\task\database_logger::TYPE_SCHEDULED == $row->type) { return get_string('task_type:scheduled', 'admin'); } else { return get_string('task_type:adhoc', 'admin'); } } /** * Format the timestart cell. * * @param \stdClass $row * @return string */ public function col_result($row) : string { if ($row->result) { return get_string('task_result:failed', 'admin'); } else { return get_string('success'); } } /** * Format the timestart cell. * * @param \stdClass $row * @return string */ public function col_timestart($row) : string { return userdate($row->timestart, get_string('strftimedatetimeshort', 'langconfig')); } /** * Format the duration cell. * * @param \stdClass $row * @return string */ public function col_duration($row) : string { $duration = round($row->timeend - $row->timestart, 2); if (empty($duration)) { // The format_time function returns 'now' when the difference is exactly 0. // Note: format_time performs concatenation in exactly this fashion so we should do this for consistency. return '0 ' . get_string('secs', 'moodle'); } return format_time($duration); } /** * Format the DB details cell. * * @param \stdClass $row * @return string */ public function col_db($row) : string { $output = ''; $output .= \html_writer::div(get_string('task_stats:dbreads', 'admin', $row->dbreads)); $output .= \html_writer::div(get_string('task_stats:dbwrites', 'admin', $row->dbwrites)); return $output; } /** * Format the actions cell. * * @param \stdClass $row * @return string */ public function col_actions($row) : string { global $OUTPUT; $actions = []; $url = new \moodle_url('/admin/tasklogs.php', ['logid' => $row->id]); // Quick view. $actions[] = $OUTPUT->action_icon( $url, new \pix_icon('e/search', get_string('view')), new \popup_action('click', $url) ); // Download. $actions[] = $OUTPUT->action_icon( new \moodle_url($url, ['download' => true]), new \pix_icon('t/download', get_string('download')) ); return implode(' ', $actions); } /** * Format the user cell. * * @param \stdClass $row * @return string */ public function col_userid($row) : string { if (empty($row->userid)) { return ''; } $user = (object) []; username_load_fields_from_object($user, $row, 'user'); return fullname($user); } }