MDL-30975 Docs Documenting report/logs
[moodle.git] / report / log / graph.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  * Produces a graph of log accesses for a user
19  *
20  * Generates an image representing the log data in a graphical manner for a user.
21  * 
22  * @package    report
23  * @subpackage log
24  * @copyright  1999 onwards Martin Dougiamas (http://dougiamas.com)
25  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
26  */
28 require("../../config.php");
29 require_once("$CFG->libdir/graphlib.php");
30 require_once($CFG->dirroot.'/report/log/locallib.php');
32 $id   = required_param('id', PARAM_INT);       // Course ID
33 $type = required_param('type', PARAM_FILE);    // Graph Type
34 $user = required_param('user', PARAM_INT);     // Student ID
35 $date = optional_param('date', 0, PARAM_INT);  // A time of a day (in GMT)
37 $url = new moodle_url('/report/log/graph.php', array('id'=>$id,'type'=>$type,'user'=>$user,'date'=>$date));
38 $PAGE->set_url($url);
40 if ($type !== "usercourse.png" and $type !== "userday.png") {
41     $type = 'userday.png';
42 }
44 $course = $DB->get_record("course", array("id"=>$id), '*', MUST_EXIST);
45 $user = $DB->get_record("user", array("id"=>$user, 'deleted'=>0), '*', MUST_EXIST);
47 $coursecontext   = context_course::instance($course->id);
48 $personalcontext = context_user::instance($user->id);
50 if ($USER->id != $user->id and has_capability('moodle/user:viewuseractivitiesreport', $personalcontext)
51         and !is_enrolled($coursecontext, $USER) and is_enrolled($coursecontext, $user)) {
52     //TODO: do not require parents to be enrolled in courses - this is a hack!
53     require_login();
54     $PAGE->set_course($course);
55 } else {
56     require_login($course);
57 }
59 list($all, $today) = report_log_can_access_user_report($user, $course);
61 if ($type === "userday.png") {
62     if (!$today) {
63         require_capability('report/log:viewtoday', $coursecontext);
64     }
65 } else {
66     if (!$all) {
67         require_capability('report/log:view', $coursecontext);
68     }
69 }
71 add_to_log($course->id, 'course', 'report log', "report/log/graph.php?user=$user->id&id=$course->id&type=$type&date=$date", $course->id);
73 $logs = array();
75 $timenow = time();
77 if ($type === "usercourse.png") {
79    $site = get_site();
81    if ($course->id == $site->id) {
82        $courseselect = 0;
83    } else {
84        $courseselect = $course->id;
85    }
87    $maxseconds = REPORT_LOG_MAX_DISPLAY * 3600 * 24;  // seconds
88    //$maxseconds = 60 * 3600 * 24;  // seconds
89    if ($timenow - $course->startdate > $maxseconds) {
90        $course->startdate = $timenow - $maxseconds;
91    }
93    if (!empty($CFG->loglifetime)) {
94        $maxseconds = $CFG->loglifetime * 3600 * 24;  // seconds
95        if ($timenow - $course->startdate > $maxseconds) {
96            $course->startdate = $timenow - $maxseconds;
97        }
98    }
100    $timestart = $coursestart = usergetmidnight($course->startdate);
102    if ((($timenow - $timestart)/86400.0) > 40) {
103        $reducedays = 7;
104    } else {
105        $reducedays = 0;
106    }
108    $days = array();
109    $i = 0;
110    while ($timestart < $timenow) {
111        $timefinish = $timestart + 86400;
112        if ($reducedays) {
113            if ($i % $reducedays) {
114                $days[$i] = "";
115            } else {
116                $days[$i] = userdate($timestart, "%a %d %b");
117            }
118        } else {
119            $days[$i] = userdate($timestart, "%a %d %b");
120        }
121        $logs[$i] = 0;
122        $i++;
123        $timestart = $timefinish;
124    }
126    if ($rawlogs = get_logs_usercourse($user->id, $courseselect, $coursestart)) {
127        foreach ($rawlogs as $rawlog) {
128            $logs[$rawlog->day] = $rawlog->num;
129        }
130    }
132    $graph = new graph(750, 400);
134    $a->coursename = format_string($course->shortname, true, array('context' => $coursecontext));
135    $a->username = fullname($user, true);
136    $graph->parameter['title'] = get_string("hitsoncourse", "", $a);
138    $graph->x_data           = $days;
140    $graph->y_data['logs']   = $logs;
141    $graph->y_order = array('logs');
143    if (!empty($CFG->preferlinegraphs)) {
144        $graph->y_format['logs'] = array('colour' => 'blue','line' => 'line');
145    } else {
146        $graph->y_format['logs'] = array('colour' => 'blue','bar' => 'fill','bar_size' => 0.6);
147        $graph->parameter['bar_spacing'] = 0;
148    }
151    $graph->parameter['y_label_left']     = get_string("hits");
152    $graph->parameter['label_size']       = "12";
153    $graph->parameter['x_axis_angle']     = 90;
154    $graph->parameter['x_label_angle']    = 0;
155    $graph->parameter['tick_length'] = 0;
158    $graph->parameter['shadow']          = 'none';
160    error_reporting(5); // ignore most warnings such as font problems etc
161    $graph->draw_stack();
163 } else {
165    $site = get_site();
167    if ($course->id == $site->id) {
168        $courseselect = 0;
169    } else {
170        $courseselect = $course->id;
171    }
173    if ($date) {
174        $daystart = usergetmidnight($date);
175    } else {
176        $daystart = usergetmidnight(time());
177    }
178    $dayfinish = $daystart + 86400;
180    $hours = array();
181    for ($i=0; $i<=23; $i++) {
182        $logs[$i] = 0;
183        $hour = $daystart + $i * 3600;
184        $hours[$i] = $i;
185    }
187    if ($rawlogs = get_logs_userday($user->id, $courseselect, $daystart)) {
188        foreach ($rawlogs as $rawlog) {
189            $logs[$rawlog->hour] = $rawlog->num;
190        }
191    }
193    $graph = new graph(750, 400);
195    $a->coursename = format_string($course->shortname, true, array('context' => $coursecontext));
196    $a->username = fullname($user, true);
197    $graph->parameter['title'] = get_string("hitsoncoursetoday", "", $a);
199    $graph->x_data           = $hours;
201    $graph->y_data['logs']   = $logs;
202    $graph->y_order = array('logs');
204    if (!empty($CFG->preferlinegraphs)) {
205        $graph->y_format['logs'] = array('colour' => 'blue','line' => 'line');
206    } else {
207        $graph->y_format['logs'] = array('colour' => 'blue','bar' => 'fill','bar_size' => 0.9);
208    }
210    $graph->parameter['y_label_left']     = get_string("hits");
211    $graph->parameter['label_size']       = "12";
212    $graph->parameter['x_axis_angle']     = 0;
213    $graph->parameter['x_label_angle']    = 0;
215    $graph->parameter['shadow']          = 'none';
217    error_reporting(5); // ignore most warnings such as font problems etc
218    $graph->draw_stack();