MDL-66213 report_loglive: Do not look up course 0
[moodle.git] / report / loglive / classes / renderable.php
1 <?php
2 // This file is part of Moodle - http://moodle.org/
3 //
4 // Moodle is free software: you can redistribute it and/or modify
5 // it under the terms of the GNU General Public License as published by
6 // the Free Software Foundation, either version 3 of the License, or
7 // (at your option) any later version.
8 //
9 // Moodle is distributed in the hope that it will be useful,
10 // but WITHOUT ANY WARRANTY; without even the implied warranty of
11 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12 // GNU General Public License for more details.
13 //
14 // You should have received a copy of the GNU General Public License
15 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
17 /**
18  * Loglive report renderable class.
19  *
20  * @package    report_loglive
21  * @copyright  2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
22  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 defined('MOODLE_INTERNAL') || die;
27 /**
28  * Report loglive renderable class.
29  *
30  * @since      Moodle 2.7
31  * @package    report_loglive
32  * @copyright  2014 onwards Ankit Agarwal <ankit.agrr@gmail.com>
33  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
34  */
35 class report_loglive_renderable implements renderable {
37     /** @const int number of seconds to show logs from, by default. */
38     const CUTOFF = 3600;
40     /** @var \core\log\manager log manager */
41     protected $logmanager;
43     /** @var string selected log reader pluginname */
44     public $selectedlogreader = null;
46     /** @var int page number */
47     public $page;
49     /** @var int perpage records to show */
50     public $perpage;
52     /** @var stdClass course record */
53     public $course;
55     /** @var moodle_url url of report page */
56     public $url;
58     /** @var int selected date from which records should be displayed */
59     public $date;
61     /** @var string order to sort */
62     public $order;
64     /** @var int group id */
65     public $groupid;
67     /** @var report_loglive_table_log table log which will be used for rendering logs */
68     public $tablelog;
70     /** @var  int refresh rate in seconds */
71     protected $refresh  = 60;
73     /**
74      * Constructor.
75      *
76      * @param string $logreader (optional)reader pluginname from which logs will be fetched.
77      * @param stdClass|int $course (optional) course record or id
78      * @param moodle_url|string $url (optional) page url.
79      * @param int $date date (optional) from which records will be fetched.
80      * @param int $page (optional) page number.
81      * @param int $perpage (optional) number of records to show per page.
82      * @param string $order (optional) sortorder of fetched records
83      */
84     public function __construct($logreader = "", $course = 0, $url = "", $date = 0, $page = 0, $perpage = 100,
85                                 $order = "timecreated DESC") {
87         global $PAGE;
89         // Use first reader as selected reader, if not passed.
90         if (empty($logreader)) {
91             $readers = $this->get_readers();
92             if (!empty($readers)) {
93                 reset($readers);
94                 $logreader = key($readers);
95             } else {
96                 $logreader = null;
97             }
98         }
99         $this->selectedlogreader = $logreader;
101         // Use page url if empty.
102         if (empty($url)) {
103             $url = new moodle_url($PAGE->url);
104         } else {
105             $url = new moodle_url($url);
106         }
107         $this->url = $url;
109         // Use site course id, if course is empty.
110         if (!empty($course) && is_int($course)) {
111             $course = get_course($course);
112         }
113         $this->course = $course;
115         if ($date == 0 ) {
116             $date = time() - self::CUTOFF;
117         }
118         $this->date = $date;
120         $this->page = $page;
121         $this->perpage = $perpage;
122         $this->order = $order;
123         $this->set_refresh_rate();
124     }
126     /**
127      * Get a list of enabled sql_reader objects/name
128      *
129      * @param bool $nameonly if true only reader names will be returned.
130      *
131      * @return array core\log\sql_reader object or name.
132      */
133     public function get_readers($nameonly = false) {
134         if (!isset($this->logmanager)) {
135             $this->logmanager = get_log_manager();
136         }
138         $readers = $this->logmanager->get_readers('core\log\sql_reader');
139         if ($nameonly) {
140             foreach ($readers as $pluginname => $reader) {
141                 $readers[$pluginname] = $reader->get_name();
142             }
143         }
144         return $readers;
145     }
147     /**
148      * Setup table log.
149      */
150     protected function setup_table() {
151         $filter = $this->setup_filters();
152         $this->tablelog = new report_loglive_table_log('report_loglive', $filter);
153         $this->tablelog->define_baseurl($this->url);
154     }
156     /**
157      * Setup table log for ajax output.
158      */
159     protected function setup_table_ajax() {
160         $filter = $this->setup_filters();
161         $this->tablelog = new report_loglive_table_log_ajax('report_loglive', $filter);
162         $this->tablelog->define_baseurl($this->url);
163     }
165     /**
166      * Setup filters
167      *
168      * @return stdClass filters
169      */
170     protected function setup_filters() {
171         $readers = $this->get_readers();
173         // Set up filters.
174         $filter = new \stdClass();
175         if (!empty($this->course)) {
176             $filter->courseid = $this->course->id;
177             $context = context_course::instance($filter->courseid);
178             if (!has_capability('moodle/site:viewanonymousevents', $context)) {
179                 $filter->anonymous = 0;
180             }
181         } else {
182             $filter->courseid = 0;
183         }
184         $filter->logreader = $readers[$this->selectedlogreader];
185         $filter->date = $this->date;
186         $filter->orderby = $this->order;
188         return $filter;
189     }
191     /**
192      * Set refresh rate of the live updates.
193      */
194     protected function set_refresh_rate() {
195         if (defined('BEHAT_SITE_RUNNING')) {
196             // Hack for behat tests.
197             $this->refresh = 5;
198         } else {
199             if (defined('REPORT_LOGLIVE_REFRESH')) {
200                 // Backward compatibility.
201                 $this->refresh = REPORT_LOGLIVE_REFERESH;
202             } else {
203                 // Default.
204                 $this->refresh = 60;
205             }
206         }
207     }
209     /**
210      * Get refresh rate of the live updates.
211      */
212     public function get_refresh_rate() {
213         return $this->refresh;
214     }
216     /**
217      * Setup table and return it.
218      *
219      * @param bool $ajax If set to true report_loglive_table_log_ajax is set instead of report_loglive_table_log.
220      *
221      * @return report_loglive_table_log|report_loglive_table_log_ajax table object
222      */
223     public function get_table($ajax = false) {
224         if (empty($this->tablelog)) {
225             if ($ajax) {
226                 $this->setup_table_ajax();
227             } else {
228                 $this->setup_table();
229             }
230         }
231         return $this->tablelog;
232     }