Commit | Line | Data |
---|---|---|
d9cb06dc | 1 | <?php |
d9cb06dc | 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/>. | |
16 | ||
17 | /** | |
18 | * Display user activity reports for a course | |
19 | * | |
20 | * @copyright 1999 Martin Dougiamas http://dougiamas.com | |
21 | * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later | |
22 | * @package course | |
23 | */ | |
24 | ||
25 | require_once("../config.php"); | |
26 | require_once("lib.php"); | |
27 | ||
28 | $id = required_param('id',PARAM_INT); // course id | |
29 | $user = required_param('user',PARAM_INT); // user id | |
30 | $mode = optional_param('mode', "todaylogs", PARAM_ALPHA); | |
d9cb06dc | 31 | |
a6855934 | 32 | $url = new moodle_url('/course/user.php', array('id'=>$id,'user'=>$user, 'mode'=>$mode)); |
f9903ed0 | 33 | |
74df2951 | 34 | $course = $DB->get_record('course', array('id'=>$id), '*', MUST_EXIST); |
a260c847 | 35 | $user = $DB->get_record("user", array("id"=>$user, 'deleted'=>0), '*', MUST_EXIST); |
5bf04b36 | 36 | |
4d00fded PS |
37 | if ($mode === 'outline' or $mode === 'complete') { |
38 | $url = new moodle_url('/report/outline/user.php', array('id'=>$user->id, 'course'=>$course->id, 'mode'=>$mode)); | |
39 | redirect($url); | |
a260c847 PS |
40 | } |
41 | if ($mode === 'todaylogs' or $mode === 'alllogs') { | |
fad8e024 PS |
42 | $logmode = ($mode === 'todaylogs') ? 'today' : 'all'; |
43 | $url = new moodle_url('/report/log/user.php', array('id'=>$user->id, 'course'=>$course->id, 'mode'=>$logmode)); | |
44 | redirect($url); | |
a260c847 PS |
45 | } |
46 | if ($mode === 'stats') { | |
beda8fa8 PS |
47 | $url = new moodle_url('/report/stats/user.php', array('id'=>$user->id, 'course'=>$course->id)); |
48 | redirect($url); | |
4d00fded | 49 | } |
a260c847 PS |
50 | if ($mode === 'coursecompletions' or $mode === 'coursecompletion') { |
51 | $url = new moodle_url('/report/completion/user.php', array('id'=>$user->id, 'course'=>$course->id)); | |
52 | redirect($url); | |
53 | } | |
4d00fded | 54 | |
9a5e297b AA |
55 | $coursecontext = context_course::instance($course->id); |
56 | $personalcontext = context_user::instance($user->id); | |
358e2a0b | 57 | |
d000b16a MG |
58 | if ($id == SITEID) { |
59 | $PAGE->set_context($personalcontext); | |
60 | $PAGE->set_heading(fullname($user)); | |
61 | } else { | |
62 | $PAGE->set_context($coursecontext); | |
63 | $PAGE->set_secondary_active_tab('participants'); | |
64 | $PAGE->set_heading($course->fullname); | |
65 | } | |
c78dbe03 | 66 | |
a0b15989 PS |
67 | $PAGE->set_url('/course/user.php', array('id'=>$id, 'user'=>$user->id, 'mode'=>$mode)); |
68 | ||
df997f84 | 69 | require_login(); |
d5814f4e | 70 | $PAGE->set_pagelayout('report'); |
df997f84 | 71 | if (has_capability('moodle/user:viewuseractivitiesreport', $personalcontext) and !is_enrolled($coursecontext)) { |
d9cb06dc | 72 | // do not require parents to be enrolled in courses ;-) |
73 | $PAGE->set_course($course); | |
74 | } else { | |
75 | require_login($course); | |
76 | } | |
6bb91986 | 77 | |
d9cb06dc | 78 | if ($user->deleted) { |
79 | echo $OUTPUT->header(); | |
80 | echo $OUTPUT->heading(get_string('userdeleted')); | |
81 | echo $OUTPUT->footer(); | |
82 | die; | |
83 | } | |
f5fc83e8 | 84 | |
d9cb06dc | 85 | // prepare list of allowed modes |
86 | $myreports = ($course->showreports and $USER->id == $user->id); | |
87 | $anyreport = has_capability('moodle/user:viewuseractivitiesreport', $personalcontext); | |
358e2a0b | 88 | |
d9cb06dc | 89 | $modes = array(); |
358e2a0b | 90 | |
abbee05e FM |
91 | // Used for grade reports, it represents whether we should be viewing the report as ourselves, or as the targetted user. |
92 | $viewasuser = false; | |
93 | ||
d9cb06dc | 94 | if (has_capability('moodle/grade:viewall', $coursecontext)) { |
95 | //ok - can view all course grades | |
96 | $modes[] = 'grade'; | |
358e2a0b | 97 | |
d9cb06dc | 98 | } else if ($course->showgrades and $user->id == $USER->id and has_capability('moodle/grade:view', $coursecontext)) { |
99 | //ok - can view own grades | |
100 | $modes[] = 'grade'; | |
358e2a0b | 101 | |
d9cb06dc | 102 | } else if ($course->showgrades and has_capability('moodle/grade:viewall', $personalcontext)) { |
103 | // ok - can view grades of this user - parent most probably | |
104 | $modes[] = 'grade'; | |
abbee05e | 105 | $viewasuser = true; |
3c7da16d | 106 | |
d9cb06dc | 107 | } else if ($course->showgrades and $anyreport) { |
108 | // ok - can view grades of this user - parent most probably | |
109 | $modes[] = 'grade'; | |
abbee05e | 110 | $viewasuser = true; |
d9cb06dc | 111 | } |
358e2a0b | 112 | |
d9cb06dc | 113 | if (empty($modes)) { |
114 | require_capability('moodle/user:viewuseractivitiesreport', $personalcontext); | |
115 | } | |
358e2a0b | 116 | |
d9cb06dc | 117 | if (!in_array($mode, $modes)) { |
7e85563d | 118 | // forbidden or non-existent mode |
d9cb06dc | 119 | $mode = reset($modes); |
120 | } | |
85a6e76c | 121 | |
f49151c3 PS |
122 | $eventdata = array( |
123 | 'context' => $coursecontext, | |
124 | 'relateduserid' => $user->id, | |
125 | 'other' => array('mode' => $mode), | |
126 | ); | |
68a72358 AG |
127 | $event = \core\event\course_user_report_viewed::create($eventdata); |
128 | $event->trigger(); | |
f9903ed0 | 129 | |
d9cb06dc | 130 | $stractivityreport = get_string("activityreport"); |
7a7e209d SH |
131 | |
132 | $PAGE->navigation->extend_for_user($user); | |
870815fa | 133 | $PAGE->navigation->set_userid_for_parent_checks($user->id); // see MDL-25805 for reasons and for full commit reference for reversal when fixed. |
d9cb06dc | 134 | $PAGE->set_title("$course->shortname: $stractivityreport ($mode)"); |
f9a0ea69 | 135 | |
d9cb06dc | 136 | switch ($mode) { |
137 | case "grade": | |
c9451960 AG |
138 | // Change the navigation to point to the my grade node (If we are a student). |
139 | if ($USER->id == $user->id) { | |
140 | require_once($CFG->dirroot . '/user/lib.php'); | |
4887d152 | 141 | // Get the correct 'Grades' url to point to. |
c9451960 | 142 | $activeurl = user_mygrades_url(); |
96304ae6 | 143 | $navbar = $PAGE->navbar->add(get_string('grades', 'grades'), $activeurl, navigation_node::TYPE_SETTING, null, 'grades'); |
c78dbe03 | 144 | $activenode = $navbar->add($course->shortname); |
c9451960 AG |
145 | $activenode->make_active(); |
146 | // Find the course node and collapse it. | |
147 | $coursenode = $PAGE->navigation->find($course->id, navigation_node::TYPE_COURSE); | |
148 | $coursenode->collapse = true; | |
149 | $coursenode->make_inactive(); | |
96304ae6 | 150 | |
b0a83aa7 | 151 | if (!preg_match('/^user\d{0,}$/', $activenode->key ?? '')) { // No user name found. |
96304ae6 MM |
152 | $userurl = new moodle_url('/user/view.php', array('id' => $user->id, 'course' => $course->id)); |
153 | // Add the user name. | |
154 | $usernode = $activenode->add(fullname($user), $userurl, navigation_node::TYPE_SETTING); | |
155 | $usernode->add(get_string('grades')); | |
156 | } else { | |
157 | $url = new moodle_url('/course/user.php', array('id' => $id, 'user' => $user->id, 'mode' => $mode)); | |
158 | $reportnode = $activenode->add(get_string('pluginname', 'gradereport_user'), $url); | |
159 | } | |
c78dbe03 | 160 | } else { |
12261113 AG |
161 | if ($course->id == SITEID) { |
162 | $activenode = $PAGE->navigation->find('user' . $user->id, null); | |
163 | } else { | |
4b937932 | 164 | $currentcoursenode = $PAGE->navigation->find($course->id, navigation_node::TYPE_COURSE); |
12261113 AG |
165 | $activenode = $currentcoursenode->find_active_node(); |
166 | } | |
4b937932 | 167 | |
c78dbe03 | 168 | // Check to see if the active node is a user name. |
12261113 | 169 | if (!preg_match('/^user\d{0,}$/', $activenode->key)) { // No user name found. |
c78dbe03 AG |
170 | $userurl = new moodle_url('/user/view.php', array('id' => $user->id, 'course' => $course->id)); |
171 | // Add the user name. | |
172 | $PAGE->navbar->add(fullname($user), $userurl, navigation_node::TYPE_SETTING); | |
173 | } | |
12261113 | 174 | $PAGE->navbar->add(get_string('report')); |
45367bdf | 175 | $gradeurl = new moodle_url('/course/user.php', array('id' => $id, 'user' => $user->id, 'mode' => $mode)); |
c78dbe03 AG |
176 | // Add the 'grades' node to the navbar. |
177 | $navbar = $PAGE->navbar->add(get_string('grades', 'grades'), $gradeurl, navigation_node::TYPE_SETTING); | |
c9451960 | 178 | } |
96304ae6 | 179 | |
c9451960 AG |
180 | echo $OUTPUT->header(); |
181 | ||
d000b16a | 182 | if ($course->id !== SITEID) { |
d000b16a MG |
183 | $userheading = array( |
184 | 'heading' => fullname($user, has_capability('moodle/site:viewfullnames', $PAGE->context)), | |
185 | 'user' => $user, | |
186 | 'usercontext' => $personalcontext, | |
187 | ); | |
188 | echo $OUTPUT->context_header($userheading, 2); | |
189 | ||
190 | echo $OUTPUT->heading(get_string('grades', 'moodle'), 2, 'main mt-4 mb-4'); | |
191 | } | |
192 | ||
d9cb06dc | 193 | if (empty($CFG->grade_profilereport) or !file_exists($CFG->dirroot.'/grade/report/'.$CFG->grade_profilereport.'/lib.php')) { |
194 | $CFG->grade_profilereport = 'user'; | |
195 | } | |
196 | require_once $CFG->libdir.'/gradelib.php'; | |
197 | require_once $CFG->dirroot.'/grade/lib.php'; | |
198 | require_once $CFG->dirroot.'/grade/report/'.$CFG->grade_profilereport.'/lib.php'; | |
199 | ||
1964d68f | 200 | // User must be able to view this grade report. |
6d18f136 PH |
201 | if (!$viewasuser) { |
202 | require_capability('gradereport/' . $CFG->grade_profilereport . ':view', $coursecontext); | |
203 | } | |
1964d68f | 204 | |
d9cb06dc | 205 | $functionname = 'grade_report_'.$CFG->grade_profilereport.'_profilereport'; |
206 | if (function_exists($functionname)) { | |
abbee05e | 207 | $functionname($course, $user, $viewasuser); |
d9cb06dc | 208 | } |
209 | break; | |
210 | ||
d9cb06dc | 211 | default: |
e35bac3e SL |
212 | // It's unlikely to reach this piece of code, as the mode is never empty and it sets mode as grade in most of the cases. |
213 | // Display the page header to avoid breaking the navigation. A course/user.php review will be done in MDL-49939. | |
c9451960 | 214 | echo $OUTPUT->header(); |
d9cb06dc | 215 | } |
f9903ed0 | 216 | |
d9cb06dc | 217 | echo $OUTPUT->footer(); |