MDL-21235 more conversion to new select
[moodle.git] / course / report / log / lib.php
1 <?php
3 // This file is part of Moodle - http://moodle.org/
4 //
5 // Moodle is free software: you can redistribute it and/or modify
6 // it under the terms of the GNU General Public License as published by
7 // the Free Software Foundation, either version 3 of the License, or
8 // (at your option) any later version.
9 //
10 // Moodle is distributed in the hope that it will be useful,
11 // but WITHOUT ANY WARRANTY; without even the implied warranty of
12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 // GNU General Public License for more details.
14 //
15 // You should have received a copy of the GNU General Public License
16 // along with Moodle.  If not, see <http://www.gnu.org/licenses/>.
18 /**
19  * This file contains functions used by the log reports
20  *
21  * @package course
22  * @copyright  1999 onwards  Martin Dougiamas  http://moodle.com
23  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 function print_mnet_log_selector_form($hostid, $course, $selecteduser=0, $selecteddate='today',
27                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
29     global $USER, $CFG, $SITE, $DB, $OUTPUT, $SESSION;
30     require_once $CFG->dirroot.'/mnet/peer.php';
32     $mnet_peer = new mnet_peer();
33     $mnet_peer->set_id($hostid);
35     $sql = "SELECT DISTINCT course, hostid, coursename FROM {mnet_log}";
36     $courses = $DB->get_records_sql($sql);
37     $remotecoursecount = count($courses);
39     // first check to see if we can override showcourses and showusers
40     $numcourses = $remotecoursecount + $DB->count_records('course');
41     if ($numcourses < COURSE_MAX_COURSES_PER_DROPDOWN && !$showcourses) {
42         $showcourses = 1;
43     }
45     $sitecontext = get_context_instance(CONTEXT_SYSTEM);
47     // Context for remote data is always SITE
48     // Groups for remote data are always OFF
49     if ($hostid == $CFG->mnet_localhost_id) {
50         $context = get_context_instance(CONTEXT_COURSE, $course->id);
52         /// Setup for group handling.
53         if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
54             $selectedgroup = -1;
55             $showgroups = false;
56         } else if ($course->groupmode) {
57             $showgroups = true;
58         } else {
59             $selectedgroup = 0;
60             $showgroups = false;
61         }
63         if ($selectedgroup === -1) {
64             if (isset($SESSION->currentgroup[$course->id])) {
65                 $selectedgroup =  $SESSION->currentgroup[$course->id];
66             } else {
67                 $selectedgroup = groups_get_all_groups($course->id, $USER->id);
68                 if (is_array($selectedgroup)) {
69                     $selectedgroup = array_shift(array_keys($selectedgroup));
70                     $SESSION->currentgroup[$course->id] = $selectedgroup;
71                 } else {
72                     $selectedgroup = 0;
73                 }
74             }
75         }
77     } else {
78         $context = $sitecontext;
79     }
81     // Get all the possible users
82     $users = array();
84     // Define limitfrom and limitnum for queries below
85     // If $showusers is enabled... don't apply limitfrom and limitnum
86     $limitfrom = empty($showusers) ? 0 : '';
87     $limitnum  = empty($showusers) ? COURSE_MAX_USERS_PER_DROPDOWN + 1 : '';
89     // If looking at a different host, we're interested in all our site users
90     if ($hostid == $CFG->mnet_localhost_id && $course->id != SITEID) {
91         $courseusers = get_users_by_capability($context, 'moodle/course:view', 'u.id, u.firstname, u.lastname, u.idnumber', 'lastname ASC, firstname ASC', $limitfrom, $limitnum, $selectedgroup,'', false);
92     } else {
93         // this may be a lot of users :-(
94         $courseusers = $DB->get_records('user', array('deleted'=>0), 'lastaccess DESC', 'id, firstname, lastname, idnumber', $limitfrom, $limitnum);
95     }
97     if (count($courseusers) < COURSE_MAX_USERS_PER_DROPDOWN && !$showusers) {
98         $showusers = 1;
99     }
101     if ($showusers) {
102         if ($courseusers) {
103             foreach ($courseusers as $courseuser) {
104                 $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
105             }
106         }
107         if ($guest = get_complete_user_data('username', 'guest')) {
108             $users[$guest->id] = fullname($guest);
109         }
110     }
112     // Get all the hosts that have log records
113     $sql = "select distinct
114                 h.id,
115                 h.name
116             from
117                 {mnet_host} h,
118                 {mnet_log} l
119             where
120                 h.id = l.hostid
121             order by
122                 h.name";
124     if ($hosts = $DB->get_records_sql($sql)) {
125         foreach($hosts as $host) {
126             $hostarray[$host->id] = $host->name;
127         }
128     }
130     $hostarray[$CFG->mnet_localhost_id] = $SITE->fullname;
131     asort($hostarray);
133     foreach($hostarray as $hostid => $name) {
134         $courses = array();
135         $sites = array();
136         if ($CFG->mnet_localhost_id == $hostid) {
137             if (has_capability('coursereport/log:view', $sitecontext) && $showcourses) {
138                 if ($ccc = $DB->get_records("course", null, "fullname","id,fullname,category")) {
139                     foreach ($ccc as $cc) {
140                         if ($cc->id == SITEID) {
141                             $sites["$hostid/$cc->id"]   = format_string($cc->fullname).' ('.get_string('site').')';
142                         } else {
143                             $courses["$hostid/$cc->id"] = format_string($cc->fullname);
144                         }
145                     }
146                 }
147             }
148         } else {
149             if (has_capability('coursereport/log:view', $sitecontext) && $showcourses) {
150                 $sql = "SELECT DISTINCT course, coursename FROM {mnet_log} where hostid = ?";
151                 if ($ccc = $DB->get_records_sql($sql, array($hostid))) {
152                     foreach ($ccc as $cc) {
153                         if (1 == $cc->course) { // TODO: this might be wrong - site course may have another id
154                             $sites["$hostid/$cc->course"]   = $cc->coursename.' ('.get_string('site').')';
155                         } else {
156                             $courses["$hostid/$cc->course"] = $cc->coursename;
157                         }
158                     }
159                 }
160             }
161         }
163         asort($courses);
164         $dropdown[$name] = $sites + $courses;
165     }
168     $activities = array();
169     $selectedactivity = "";
171 /// Casting $course->modinfo to string prevents one notice when the field is null
172     if ($modinfo = unserialize((string)$course->modinfo)) {
173         $section = 0;
174         if ($course->format == 'weeks') {  // Bodgy
175             $strsection = get_string("week");
176         } else {
177             $strsection = get_string("topic");
178         }
179         foreach ($modinfo as $mod) {
180             if ($mod->mod == "label") {
181                 continue;
182             }
183             if ($mod->section > 0 and $section <> $mod->section) {
184                 $activities["section/$mod->section"] = "-------------- $strsection $mod->section --------------";
185             }
186             $section = $mod->section;
187             $mod->name = strip_tags(format_string(urldecode($mod->name),true));
188             if (strlen($mod->name) > 55) {
189                 $mod->name = substr($mod->name, 0, 50)."...";
190             }
191             if (!$mod->visible) {
192                 $mod->name = "(".$mod->name.")";
193             }
194             $activities["$mod->cm"] = $mod->name;
196             if ($mod->cm == $modid) {
197                 $selectedactivity = "$mod->cm";
198             }
199         }
200     }
202     if (has_capability('coursereport/log:view', $sitecontext) && !$course->category) {
203         $activities["site_errors"] = get_string("siteerrors");
204         if ($modid === "site_errors") {
205             $selectedactivity = "site_errors";
206         }
207     }
209     $strftimedate = get_string("strftimedate");
210     $strftimedaydate = get_string("strftimedaydate");
212     asort($users);
214     // Prepare the list of action options.
215     $actions = array(
216         'view' => get_string('view'),
217         'add' => get_string('add'),
218         'update' => get_string('update'),
219         'delete' => get_string('delete'),
220         '-view' => get_string('allchanges')
221     );
223     // Get all the possible dates
224     // Note that we are keeping track of real (GMT) time and user time
225     // User time is only used in displays - all calcs and passing is GMT
227     $timenow = time(); // GMT
229     // What day is it now for the user, and when is midnight that day (in GMT).
230     $timemidnight = $today = usergetmidnight($timenow);
232     // Put today up the top of the list
233     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate) );
235     if (!$course->startdate or ($course->startdate > $timenow)) {
236         $course->startdate = $course->timecreated;
237     }
239     $numdates = 1;
240     while ($timemidnight > $course->startdate and $numdates < 365) {
241         $timemidnight = $timemidnight - 86400;
242         $timenow = $timenow - 86400;
243         $dates["$timemidnight"] = userdate($timenow, $strftimedaydate);
244         $numdates++;
245     }
247     if ($selecteddate == "today") {
248         $selecteddate = $today;
249     }
251     echo "<form class=\"logselectform\" action=\"$CFG->wwwroot/course/report/log/index.php\" method=\"get\">\n";
252     echo "<div>\n";//invisible fieldset here breaks wrapping
253     echo "<input type=\"hidden\" name=\"chooselog\" value=\"1\" />\n";
254     echo "<input type=\"hidden\" name=\"showusers\" value=\"$showusers\" />\n";
255     echo "<input type=\"hidden\" name=\"showcourses\" value=\"$showcourses\" />\n";
256     if (has_capability('coursereport/log:view', $sitecontext) && $showcourses) {
257         $cid = empty($course->id)? '1' : $course->id;
258         $select = html_select::make($dropdown, "host_course", $hostid.'/'.$cid);
259         $select->nested = true;
260         echo $OUTPUT->select($select);
261     } else {
262         $courses = array();
263         $courses[$course->id] = $course->fullname . ((empty($course->category)) ? ' ('.get_string('site').') ' : '');
264         echo html_writer::input_select($courses,"id",$course->id, false);
265         if (has_capability('coursereport/log:view', $sitecontext)) {
266             $a = new object();
267             $a->url = "$CFG->wwwroot/course/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
268                 ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showcourses=1&showusers=$showusers";
269             print_string('logtoomanycourses','moodle',$a);
270         }
271     }
273     if ($showgroups) {
274         if ($cgroups = groups_get_all_groups($course->id)) {
275             foreach ($cgroups as $cgroup) {
276                 $groups[$cgroup->id] = $cgroup->name;
277             }
278         }
279         else {
280             $groups = array();
281         }
282         echo html_writer::input_select($groups, "group", $selectedgroup, get_string("allgroups"));
283     }
285     if ($showusers) {
286         echo html_writer::input_select($users, "user", $selecteduser, get_string("allparticipants"));
287     }
288     else {
289         $users = array();
290         if (!empty($selecteduser)) {
291             $user = $DB->get_record('user', array('id'=>$selecteduser));
292             $users[$selecteduser] = fullname($user);
293         }
294         else {
295             $users[0] = get_string('allparticipants');
296         }
297         echo html_writer::input_select($users, "user", $selecteduser, false);
298         $a->url = "$CFG->wwwroot/course/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
299             ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showusers=1&showcourses=$showcourses";
300         print_string('logtoomanyusers','moodle',$a);
301     }
303     echo html_writer::input_select($dates, "date", $selecteddate, get_string("alldays"));
304     echo html_writer::input_select($activities, "modid", $selectedactivity, get_string("allactivities"));
305     echo html_writer::input_select($actions, 'modaction', $modaction, get_string("allactions"));
307     $logformats = array('showashtml' => get_string('displayonpage'),
308                         'downloadascsv' => get_string('downloadtext'),
309                         'downloadasods' => get_string('downloadods'),
310                         'downloadasexcel' => get_string('downloadexcel'));
311     echo html_writer::input_select($logformats, 'logformat', $logformat, false);
312     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
313     echo '</div>';
314     echo '</form>';
317 function print_log_selector_form($course, $selecteduser=0, $selecteddate='today',
318                                  $modname="", $modid=0, $modaction='', $selectedgroup=-1, $showcourses=0, $showusers=0, $logformat='showashtml') {
320     global $USER, $CFG, $DB, $OUTPUT, $SESSION;
322     // first check to see if we can override showcourses and showusers
323     $numcourses =  $DB->count_records("course");
324     if ($numcourses < COURSE_MAX_COURSES_PER_DROPDOWN && !$showcourses) {
325         $showcourses = 1;
326     }
328     $sitecontext = get_context_instance(CONTEXT_SYSTEM);
329     $context = get_context_instance(CONTEXT_COURSE, $course->id);
331     /// Setup for group handling.
332     if ($course->groupmode == SEPARATEGROUPS and !has_capability('moodle/site:accessallgroups', $context)) {
333         $selectedgroup = -1;
334         $showgroups = false;
335     } else if ($course->groupmode) {
336         $showgroups = true;
337     } else {
338         $selectedgroup = 0;
339         $showgroups = false;
340     }
342     if ($selectedgroup === -1) {
343         if (isset($SESSION->currentgroup[$course->id])) {
344             $selectedgroup =  $SESSION->currentgroup[$course->id];
345         } else {
346             $selectedgroup = groups_get_all_groups($course->id, $USER->id);
347             if (is_array($selectedgroup)) {
348                 $selectedgroup = array_shift(array_keys($selectedgroup));
349                 $SESSION->currentgroup[$course->id] = $selectedgroup;
350             } else {
351                 $selectedgroup = 0;
352             }
353         }
354     }
356     // Get all the possible users
357     $users = array();
359     if ($course->id != SITEID) {
360         $courseusers = get_users_by_capability($context, 'moodle/course:view', 'u.id, u.firstname, u.lastname, u.idnumber', 'lastname ASC, firstname ASC', '','',$selectedgroup,null, false);
361     } else {
362         // this may be a lot of users :-(
363         $courseusers = $DB->get_records('user', array('deleted'=>0), 'lastaccess DESC', 'id, firstname, lastname, idnumber');
364     }
366     if (count($courseusers) < COURSE_MAX_USERS_PER_DROPDOWN && !$showusers) {
367         $showusers = 1;
368     }
370     if ($showusers) {
371         if ($courseusers) {
372             foreach ($courseusers as $courseuser) {
373                 $users[$courseuser->id] = fullname($courseuser, has_capability('moodle/site:viewfullnames', $context));
374             }
375         }
376         if ($guest = get_complete_user_data('username', 'guest')) {
377             $users[$guest->id] = fullname($guest);
378         }
379     }
381     if (has_capability('coursereport/log:view', $sitecontext) && $showcourses) {
382         if ($ccc = $DB->get_records("course", null, "fullname", "id,fullname,category")) {
383             foreach ($ccc as $cc) {
384                 if ($cc->category) {
385                     $courses["$cc->id"] = format_string($cc->fullname);
386                 } else {
387                     $courses["$cc->id"] = format_string($cc->fullname) . ' (Site)';
388                 }
389             }
390         }
391         asort($courses);
392     }
394     $activities = array();
395     $selectedactivity = "";
397 /// Casting $course->modinfo to string prevents one notice when the field is null
398     if ($modinfo = unserialize((string)$course->modinfo)) {
399         $section = 0;
400         if ($course->format == 'weeks') {  // Bodgy
401             $strsection = get_string("week");
402         } else {
403             $strsection = get_string("topic");
404         }
405         foreach ($modinfo as $mod) {
406             if ($mod->mod == "label") {
407                 continue;
408             }
409             if ($mod->section > 0 and $section <> $mod->section) {
410                 $activities["section/$mod->section"] = "-------------- $strsection $mod->section --------------";
411             }
412             $section = $mod->section;
413             $mod->name = strip_tags(format_string(urldecode($mod->name),true));
414             if (strlen($mod->name) > 55) {
415                 $mod->name = substr($mod->name, 0, 50)."...";
416             }
417             if (!$mod->visible) {
418                 $mod->name = "(".$mod->name.")";
419             }
420             $activities["$mod->cm"] = $mod->name;
422             if ($mod->cm == $modid) {
423                 $selectedactivity = "$mod->cm";
424             }
425         }
426     }
428     if (has_capability('coursereport/log:view', $sitecontext) && ($course->id == SITEID)) {
429         $activities["site_errors"] = get_string("siteerrors");
430         if ($modid === "site_errors") {
431             $selectedactivity = "site_errors";
432         }
433     }
435     $strftimedate = get_string("strftimedate");
436     $strftimedaydate = get_string("strftimedaydate");
438     asort($users);
440     // Prepare the list of action options.
441     $actions = array(
442         'view' => get_string('view'),
443         'add' => get_string('add'),
444         'update' => get_string('update'),
445         'delete' => get_string('delete'),
446         '-view' => get_string('allchanges')
447     );
449     // Get all the possible dates
450     // Note that we are keeping track of real (GMT) time and user time
451     // User time is only used in displays - all calcs and passing is GMT
453     $timenow = time(); // GMT
455     // What day is it now for the user, and when is midnight that day (in GMT).
456     $timemidnight = $today = usergetmidnight($timenow);
458     // Put today up the top of the list
459     $dates = array("$timemidnight" => get_string("today").", ".userdate($timenow, $strftimedate) );
461     if (!$course->startdate or ($course->startdate > $timenow)) {
462         $course->startdate = $course->timecreated;
463     }
465     $numdates = 1;
466     while ($timemidnight > $course->startdate and $numdates < 365) {
467         $timemidnight = $timemidnight - 86400;
468         $timenow = $timenow - 86400;
469         $dates["$timemidnight"] = userdate($timenow, $strftimedaydate);
470         $numdates++;
471     }
473     if ($selecteddate == "today") {
474         $selecteddate = $today;
475     }
477     echo "<form class=\"logselectform\" action=\"$CFG->wwwroot/course/report/log/index.php\" method=\"get\">\n";
478     echo "<div>\n";
479     echo "<input type=\"hidden\" name=\"chooselog\" value=\"1\" />\n";
480     echo "<input type=\"hidden\" name=\"showusers\" value=\"$showusers\" />\n";
481     echo "<input type=\"hidden\" name=\"showcourses\" value=\"$showcourses\" />\n";
482     if (has_capability('coursereport/log:view', $sitecontext) && $showcourses) {
483         echo html_writer::input_select($courses, "id", $course->id, false);
484     } else {
485         //        echo '<input type="hidden" name="id" value="'.$course->id.'" />';
486         $courses = array();
487         $courses[$course->id] = $course->fullname . (($course->id == SITEID) ? ' ('.get_string('site').') ' : '');
488         echo html_writer::input_select($courses,"id",$course->id, false);
489         if (has_capability('coursereport/log:view', $sitecontext)) {
490             $a = new object();
491             $a->url = "$CFG->wwwroot/course/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
492                 ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showcourses=1&showusers=$showusers";
493             print_string('logtoomanycourses','moodle',$a);
494         }
495     }
497     if ($showgroups) {
498         if ($cgroups = groups_get_all_groups($course->id)) {
499             foreach ($cgroups as $cgroup) {
500                 $groups[$cgroup->id] = $cgroup->name;
501             }
502         }
503         else {
504             $groups = array();
505         }
506         echo html_writer::input_select($groups, "group", $selectedgroup, get_string("allgroups"));
507     }
509     if ($showusers) {
510         echo html_writer::input_select($users, "user", $selecteduser, get_string("allparticipants"));
511     }
512     else {
513         $users = array();
514         if (!empty($selecteduser)) {
515             $user = $DB->get_record('user', array('id'=>$selecteduser));
516             $users[$selecteduser] = fullname($user);
517         }
518         else {
519             $users[0] = get_string('allparticipants');
520         }
521         echo html_writer::input_select($users, "user", $selecteduser, false);
522         $a = new object();
523         $a->url = "$CFG->wwwroot/course/report/log/index.php?chooselog=0&group=$selectedgroup&user=$selecteduser"
524             ."&id=$course->id&date=$selecteddate&modid=$selectedactivity&showusers=1&showcourses=$showcourses";
525         print_string('logtoomanyusers','moodle',$a);
526     }
527     echo html_writer::input_select($dates, "date", $selecteddate, get_string("alldays"));
529     echo html_writer::input_select($activities, "modid", $selectedactivity, get_string("allactivities"));
530     echo html_writer::input_select($actions, 'modaction', $modaction, get_string("allactions"));
532     $logformats = array('showashtml' => get_string('displayonpage'),
533                         'downloadascsv' => get_string('downloadtext'),
534                         'downloadasods' => get_string('downloadods'),
535                         'downloadasexcel' => get_string('downloadexcel'));
537     echo html_writer::input_select($logformats, 'logformat', $logformat, false);
538     echo '<input type="submit" value="'.get_string('gettheselogs').'" />';
539     echo '</div>';
540     echo '</form>';
543 /**
544  * This function extends the navigation with the report items
545  *
546  * @param navigation_node $navigation The navigation node to extend
547  * @param stdClass $course The course to object for the report
548  * @param stdClass $context The context of the course
549  */
550 function log_report_extend_navigation($navigation, $course, $context) {
551     global $CFG, $OUTPUT;
552     if (has_capability('coursereport/log:view', $context)) {
553         $url = new moodle_url('/course/report/log/index.php', array('id'=>$course->id));
554         $navigation->add(get_string('log:view', 'coursereport_log'), $url, navigation_node::TYPE_SETTING, null, null, $OUTPUT->pix_url('i/report'));
555     }
556     if (has_capability('coursereport/log:viewlive', $context)) {
557         $livelogs = get_string('livelogs');
558         $link = html_link::make('/course/report/log/live.php?id='. $course->id, $livelogs);
559         $link->add_action(new popup_action('click', $link->url, 'livelog', array('height' => 500, 'width' => 800)));
560         $navigation->add($livelogs, $link, navigation_node::TYPE_SETTING, null, null, $OUTPUT->pix_url('i/report'));
561     }