aa14d0155d9555cc3b7ad2b1ff39d575d67ff53c
[moodle.git] / report / log / locallib.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  * This file contains functions used by the log reports
19  *
20  * @package    report
21  * @subpackage log
22  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 defined('MOODLE_INTERNAL') || die;
28 if (!defined('REPORT_LOG_MAX_DISPLAY')) {
29     define('REPORT_LOG_MAX_DISPLAY', 150); // days
30 }
32 require_once(dirname(__FILE__).'/lib.php');
34 function report_log_print_graph($course, $userid, $type, $date=0) {
35     global $CFG;
37     if (empty($CFG->gdversion)) {
38         echo "(".get_string("gdneed").")";
39     } else {
40         echo '<img src="'.$CFG->wwwroot.'/report/log/graph.php?id='.$course->id.
41              '&amp;user='.$userid.'&amp;type='.$type.'&amp;date='.$date.'" alt="" />';
42     }
43 }
45 function report_log_print_mnet_selector_form($hostid, $course, $selecteduser=0, $selecteddate='today',
46                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
48     global $USER, $CFG, $SITE, $DB, $OUTPUT, $SESSION;
49     require_once $CFG->dirroot.'/mnet/peer.php';
51     $mnet_peer = new mnet_peer();
52     $mnet_peer->set_id($hostid);
54     $sql = "SELECT DISTINCT course, hostid, coursename FROM {mnet_log}";
55     $courses = $DB->get_records_sql($sql);
56     $remotecoursecount = count($courses);
58     // first check to see if we can override showcourses and showusers
59     $numcourses = $remotecoursecount + $DB->count_records('course');
60     if ($numcourses < COURSE_MAX_COURSES_PER_DROPDOWN && !$showcourses) {
61         $showcourses = 1;
62     }
64     $sitecontext = get_context_instance(CONTEXT_SYSTEM);
66     // Context for remote data is always SITE
67     // Groups for remote data are always OFF
68     if ($hostid == $CFG->mnet_localhost_id) {
69         $context = get_context_instance(CONTEXT_COURSE, $course->id);
71         /// Setup for group handling.
72         if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
73             $selectedgroup = -1;
74             $showgroups = false;
75         } else if ($course->groupmode) {
76             $showgroups = true;
77         } else {
78             $selectedgroup = 0;
79             $showgroups = false;
80         }
82         if ($selectedgroup === -1) {
83             if (isset($SESSION->currentgroup[$course->id])) {
84                 $selectedgroup =  $SESSION->currentgroup[$course->id];
85             } else {
86                 $selectedgroup = groups_get_all_groups($course->id, $USER->id);
87                 if (is_array($selectedgroup)) {
88                     $selectedgroup = array_shift(array_keys($selectedgroup));
89                     $SESSION->currentgroup[$course->id] = $selectedgroup;
90                 } else {
91                     $selectedgroup = 0;
92                 }
93             }
94         }
96     } else {
97         $context = $sitecontext;
98     }
100     // Get all the possible users
101     $users = array();
103     // Define limitfrom and limitnum for queries below
104     // If $showusers is enabled... don't apply limitfrom and limitnum
105     $limitfrom = empty($showusers) ? 0 : '';
106     $limitnum  = empty($showusers) ? COURSE_MAX_USERS_PER_DROPDOWN + 1 : '';
108     // If looking at a different host, we're interested in all our site users
109     if ($hostid == $CFG->mnet_localhost_id && $course->id != SITEID) {
110         $courseusers = get_enrolled_users($context, '', $selectedgroup, 'u.id, u.firstname, u.lastname, u.idnumber', 'lastname ASC, firstname ASC', $limitfrom, $limitnum);
111     } else {
112         // this may be a lot of users :-(
113         $courseusers = $DB->get_records('user', array('deleted'=>0), 'lastaccess DESC', 'id, firstname, lastname, idnumber', $limitfrom, $limitnum);
114     }
116     if (count($courseusers) < COURSE_MAX_USERS_PER_DROPDOWN && !$showusers) {
117         $showusers = 1;
118     }
120     if ($showusers) {
121         if ($courseusers) {
122             foreach ($courseusers as $courseuser) {
123                 $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
124             }
125         }
126         $users[$CFG->siteguest] = get_string('guestuser');
127     }
129     // Get all the hosts that have log records
130     $sql = "select distinct
131                 h.id,
132                 h.name
133             from
134                 {mnet_host} h,
135                 {mnet_log} l
136             where
137                 h.id = l.hostid
138             order by
139                 h.name";
141     if ($hosts = $DB->get_records_sql($sql)) {
142         foreach($hosts as $host) {
143             $hostarray[$host->id] = $host->name;
144         }
145     }
147     $hostarray[$CFG->mnet_localhost_id] = $SITE->fullname;
148     asort($hostarray);
150     $dropdown = array();
152     foreach($hostarray as $hostid => $name) {
153         $courses = array();
154         $sites = array();
155         if ($CFG->mnet_localhost_id == $hostid) {
156             if (has_capability('report/log:view', $sitecontext) && $showcourses) {
157                 if ($ccc = $DB->get_records("course", null, "fullname","id,fullname,category")) {
158                     foreach ($ccc as $cc) {
159                         if ($cc->id == SITEID) {
160                             $sites["$hostid/$cc->id"]   = format_string($cc->fullname).' ('.get_string('site').')';
161                         } else {
162                             $courses["$hostid/$cc->id"] = format_string($cc->fullname);
163                         }
164                     }
165                 }
166             }
167         } else {
168             if (has_capability('report/log:view', $sitecontext) && $showcourses) {
169                 $sql = "SELECT DISTINCT course, coursename FROM {mnet_log} where hostid = ?";
170                 if ($ccc = $DB->get_records_sql($sql, array($hostid))) {
171                     foreach ($ccc as $cc) {
172                         if (1 == $cc->course) { // TODO: this might be wrong - site course may have another id
173                             $sites["$hostid/$cc->course"]   = $cc->coursename.' ('.get_string('site').')';
174                         } else {
175                             $courses["$hostid/$cc->course"] = $cc->coursename;
176                         }
177                     }
178                 }
179             }
180         }
182         asort($courses);
183         $dropdown[] = array($name=>($sites + $courses));
184     }
187     $activities = array();
188     $selectedactivity = "";
190 /// Casting $course->modinfo to string prevents one notice when the field is null
191     if ($modinfo = unserialize((string)$course->modinfo)) {
192         $section = 0;
193         $sections = get_all_sections($course->id);
194         foreach ($modinfo as $mod) {
195             if ($mod->mod == "label") {
196                 continue;
197             }
198             if ($mod->section > 0 and $section <> $mod->section) {
199                 $activities["section/$mod->section"] = '--- '.get_section_name($course, $sections[$mod->section]).' ---';
200             }
201             $section = $mod->section;
202             $mod->name = strip_tags(format_string($mod->name, true));
203             if (textlib::strlen($mod->name) > 55) {
204                 $mod->name = textlib::substr($mod->name, 0, 50)."...";
205             }
206             if (!$mod->visible) {
207                 $mod->name = "(".$mod->name.")";
208             }
209             $activities["$mod->cm"] = $mod->name;
211             if ($mod->cm == $modid) {
212                 $selectedactivity = "$mod->cm";
213             }
214         }
215     }
217     if (has_capability('report/log:view', $sitecontext) && !$course->category) {
218         $activities["site_errors"] = get_string("siteerrors");
219         if ($modid === "site_errors") {
220             $selectedactivity = "site_errors";
221         }
222     }
224     $strftimedate = get_string("strftimedate");
225     $strftimedaydate = get_string("strftimedaydate");
227     asort($users);
229     // Prepare the list of action options.
230     $actions = array(
231         'view' => get_string('view'),
232         'add' => get_string('add'),
233         'update' => get_string('update'),
234         'delete' => get_string('delete'),
235         '-view' => get_string('allchanges')
236     );
238     // Get all the possible dates
239     // Note that we are keeping track of real (GMT) time and user time
240     // User time is only used in displays - all calcs and passing is GMT
242     $timenow = time(); // GMT
244     // What day is it now for the user, and when is midnight that day (in GMT).
245     $timemidnight = $today = usergetmidnight($timenow);
247     // Put today up the top of the list
248     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate) );
250     if (!$course->startdate or ($course->startdate > $timenow)) {
251         $course->startdate = $course->timecreated;
252     }
254     $numdates = 1;
255     while ($timemidnight > $course->startdate and $numdates < 365) {
256         $timemidnight = $timemidnight - 86400;
257         $timenow = $timenow - 86400;
258         $dates["$timemidnight"] = userdate($timenow, $strftimedaydate);
259         $numdates++;
260     }
262     if ($selecteddate == "today") {
263         $selecteddate = $today;
264     }
266     echo "<form class=\"logselectform\" action=\"$CFG->wwwroot/report/log/index.php\" method=\"get\">\n";
267     echo "<div>\n";//invisible fieldset here breaks wrapping
268     echo "<input type=\"hidden\" name=\"chooselog\" value=\"1\" />\n";
269     echo "<input type=\"hidden\" name=\"showusers\" value=\"$showusers\" />\n";
270     echo "<input type=\"hidden\" name=\"showcourses\" value=\"$showcourses\" />\n";
271     if (has_capability('report/log:view', $sitecontext) && $showcourses) {
272         $cid = empty($course->id)? '1' : $course->id;
273         echo html_writer::select($dropdown, "host_course", $hostid.'/'.$cid);
274     } else {
275         $courses = array();
276         $courses[$course->id] = $course->fullname . ((empty($course->category)) ? ' ('.get_string('site').') ' : '');
277         echo html_writer::select($courses,"id",$course->id, false);
278         if (has_capability('report/log:view', $sitecontext)) {
279             $a = new stdClass();
280             $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
281                 ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showcourses=1&showusers=$showusers";
282             print_string('logtoomanycourses','moodle',$a);
283         }
284     }
286     if ($showgroups) {
287         if ($cgroups = groups_get_all_groups($course->id)) {
288             foreach ($cgroups as $cgroup) {
289                 $groups[$cgroup->id] = $cgroup->name;
290             }
291         }
292         else {
293             $groups = array();
294         }
295         echo html_writer::select($groups, "group", $selectedgroup, get_string("allgroups"));
296     }
298     if ($showusers) {
299         echo html_writer::select($users, "user", $selecteduser, get_string("allparticipants"));
300     }
301     else {
302         $users = array();
303         if (!empty($selecteduser)) {
304             $user = $DB->get_record('user', array('id'=>$selecteduser));
305             $users[$selecteduser] = fullname($user);
306         }
307         else {
308             $users[0] = get_string('allparticipants');
309         }
310         echo html_writer::select($users, "user", $selecteduser, false);
311         $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
312             ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showusers=1&showcourses=$showcourses";
313         print_string('logtoomanyusers','moodle',$a);
314     }
316     echo html_writer::select($dates, "date", $selecteddate, get_string("alldays"));
317     echo html_writer::select($activities, "modid", $selectedactivity, get_string("allactivities"));
318     echo html_writer::select($actions, 'modaction', $modaction, get_string("allactions"));
320     $logformats = array('showashtml' => get_string('displayonpage'),
321                         'downloadascsv' => get_string('downloadtext'),
322                         'downloadasods' => get_string('downloadods'),
323                         'downloadasexcel' => get_string('downloadexcel'));
324     echo html_writer::select($logformats, 'logformat', $logformat, false);
325     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
326     echo '</div>';
327     echo '</form>';
330 function report_log_print_selector_form($course, $selecteduser=0, $selecteddate='today',
331                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
333     global $USER, $CFG, $DB, $OUTPUT, $SESSION;
335     // first check to see if we can override showcourses and showusers
336     $numcourses =  $DB->count_records("course");
337     if ($numcourses < COURSE_MAX_COURSES_PER_DROPDOWN && !$showcourses) {
338         $showcourses = 1;
339     }
341     $sitecontext = get_context_instance(CONTEXT_SYSTEM);
342     $context = get_context_instance(CONTEXT_COURSE, $course->id);
344     /// Setup for group handling.
345     if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
346         $selectedgroup = -1;
347         $showgroups = false;
348     } else if ($course->groupmode) {
349         $showgroups = true;
350     } else {
351         $selectedgroup = 0;
352         $showgroups = false;
353     }
355     if ($selectedgroup === -1) {
356         if (isset($SESSION->currentgroup[$course->id])) {
357             $selectedgroup =  $SESSION->currentgroup[$course->id];
358         } else {
359             $selectedgroup = groups_get_all_groups($course->id, $USER->id);
360             if (is_array($selectedgroup)) {
361                 $selectedgroup = array_shift(array_keys($selectedgroup));
362                 $SESSION->currentgroup[$course->id] = $selectedgroup;
363             } else {
364                 $selectedgroup = 0;
365             }
366         }
367     }
369     // Get all the possible users
370     $users = array();
372     // Define limitfrom and limitnum for queries below
373     // If $showusers is enabled... don't apply limitfrom and limitnum
374     $limitfrom = empty($showusers) ? 0 : '';
375     $limitnum  = empty($showusers) ? COURSE_MAX_USERS_PER_DROPDOWN + 1 : '';
377     $courseusers = get_enrolled_users($context, '', $selectedgroup, 'u.id, u.firstname, u.lastname', 'lastname ASC, firstname ASC', $limitfrom, $limitnum);
379     if (count($courseusers) < COURSE_MAX_USERS_PER_DROPDOWN && !$showusers) {
380         $showusers = 1;
381     }
383     if ($showusers) {
384         if ($courseusers) {
385             foreach ($courseusers as $courseuser) {
386                 $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
387             }
388         }
389         $users[$CFG->siteguest] = get_string('guestuser');
390     }
392     if (has_capability('report/log:view', $sitecontext) && $showcourses) {
393         if ($ccc = $DB->get_records("course", null, "fullname", "id,fullname,category")) {
394             foreach ($ccc as $cc) {
395                 if ($cc->category) {
396                     $courses["$cc->id"] = format_string($cc->fullname);
397                 } else {
398                     $courses["$cc->id"] = format_string($cc->fullname) . ' (Site)';
399                 }
400             }
401         }
402         asort($courses);
403     }
405     $activities = array();
406     $selectedactivity = "";
408 /// Casting $course->modinfo to string prevents one notice when the field is null
409     if ($modinfo = unserialize((string)$course->modinfo)) {
410         $section = 0;
411         $sections = get_all_sections($course->id);
412         foreach ($modinfo as $mod) {
413             if ($mod->mod == "label") {
414                 continue;
415             }
416             if ($mod->section > 0 and $section <> $mod->section) {
417                 $activities["section/$mod->section"] = '--- '.get_section_name($course, $sections[$mod->section]).' ---';
418             }
419             $section = $mod->section;
420             $mod->name = strip_tags(format_string($mod->name, true));
421             if (textlib::strlen($mod->name) > 55) {
422                 $mod->name = textlib::substr($mod->name, 0, 50)."...";
423             }
424             if (!$mod->visible) {
425                 $mod->name = "(".$mod->name.")";
426             }
427             $activities["$mod->cm"] = $mod->name;
429             if ($mod->cm == $modid) {
430                 $selectedactivity = "$mod->cm";
431             }
432         }
433     }
435     if (has_capability('report/log:view', $sitecontext) && ($course->id == SITEID)) {
436         $activities["site_errors"] = get_string("siteerrors");
437         if ($modid === "site_errors") {
438             $selectedactivity = "site_errors";
439         }
440     }
442     $strftimedate = get_string("strftimedate");
443     $strftimedaydate = get_string("strftimedaydate");
445     asort($users);
447     // Prepare the list of action options.
448     $actions = array(
449         'view' => get_string('view'),
450         'add' => get_string('add'),
451         'update' => get_string('update'),
452         'delete' => get_string('delete'),
453         '-view' => get_string('allchanges')
454     );
456     // Get all the possible dates
457     // Note that we are keeping track of real (GMT) time and user time
458     // User time is only used in displays - all calcs and passing is GMT
460     $timenow = time(); // GMT
462     // What day is it now for the user, and when is midnight that day (in GMT).
463     $timemidnight = $today = usergetmidnight($timenow);
465     // Put today up the top of the list
466     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate) );
468     if (!$course->startdate or ($course->startdate > $timenow)) {
469         $course->startdate = $course->timecreated;
470     }
472     $numdates = 1;
473     while ($timemidnight > $course->startdate and $numdates < 365) {
474         $timemidnight = $timemidnight - 86400;
475         $timenow = $timenow - 86400;
476         $dates["$timemidnight"] = userdate($timenow, $strftimedaydate);
477         $numdates++;
478     }
480     if ($selecteddate == "today") {
481         $selecteddate = $today;
482     }
484     echo "<form class=\"logselectform\" action=\"$CFG->wwwroot/report/log/index.php\" method=\"get\">\n";
485     echo "<div>\n";
486     echo "<input type=\"hidden\" name=\"chooselog\" value=\"1\" />\n";
487     echo "<input type=\"hidden\" name=\"showusers\" value=\"$showusers\" />\n";
488     echo "<input type=\"hidden\" name=\"showcourses\" value=\"$showcourses\" />\n";
489     if (has_capability('report/log:view', $sitecontext) && $showcourses) {
490         echo html_writer::select($courses, "id", $course->id, false);
491     } else {
492         //        echo '<input type="hidden" name="id" value="'.$course->id.'" />';
493         $courses = array();
494         $courses[$course->id] = $course->fullname . (($course->id == SITEID) ? ' ('.get_string('site').') ' : '');
495         echo html_writer::select($courses,"id",$course->id, false);
496         if (has_capability('report/log:view', $sitecontext)) {
497             $a = new stdClass();
498             $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
499                 ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showcourses=1&showusers=$showusers";
500             print_string('logtoomanycourses','moodle',$a);
501         }
502     }
504     if ($showgroups) {
505         if ($cgroups = groups_get_all_groups($course->id)) {
506             foreach ($cgroups as $cgroup) {
507                 $groups[$cgroup->id] = $cgroup->name;
508             }
509         }
510         else {
511             $groups = array();
512         }
513         echo html_writer::select($groups, "group", $selectedgroup, get_string("allgroups"));
514     }
516     if ($showusers) {
517         echo html_writer::select($users, "user", $selecteduser, get_string("allparticipants"));
518     }
519     else {
520         $users = array();
521         if (!empty($selecteduser)) {
522             $user = $DB->get_record('user', array('id'=>$selecteduser));
523             $users[$selecteduser] = fullname($user);
524         }
525         else {
526             $users[0] = get_string('allparticipants');
527         }
528         echo html_writer::select($users, "user", $selecteduser, false);
529         $a = new stdClass();
530         $a->url = "$CFG->wwwroot/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
531             ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showusers=1&showcourses=$showcourses";
532         print_string('logtoomanyusers','moodle',$a);
533     }
534     echo html_writer::select($dates, "date", $selecteddate, get_string("alldays"));
536     echo html_writer::select($activities, "modid", $selectedactivity, get_string("allactivities"));
537     echo html_writer::select($actions, 'modaction', $modaction, get_string("allactions"));
539     $logformats = array('showashtml' => get_string('displayonpage'),
540                         'downloadascsv' => get_string('downloadtext'),
541                         'downloadasods' => get_string('downloadods'),
542                         'downloadasexcel' => get_string('downloadexcel'));
544     echo html_writer::select($logformats, 'logformat', $logformat, false);
545     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
546     echo '</div>';
547     echo '</form>';