Merge branch 'MDL-62151-master' of git://github.com/bmbrands/moodle
[moodle.git] / lib / classes / analytics / analyser / student_enrolments.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  * Student enrolments analyser.
19  *
20  * @package   core
21  * @copyright 2016 David Monllao {@link http://www.davidmonllao.com}
22  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
23  */
25 namespace core\analytics\analyser;
27 defined('MOODLE_INTERNAL') || die();
29 require_once($CFG->dirroot . '/lib/enrollib.php');
31 /**
32  * Student enrolments analyser.
33  *
34  * It does return all student enrolments including the suspended ones.
35  *
36  * @package   core
37  * @copyright 2016 David Monllao {@link http://www.davidmonllao.com}
38  * @license   http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39  */
40 class student_enrolments extends \core_analytics\local\analyser\by_course {
42     /**
43      * @var array Cache for user_enrolment id - course id relation.
44      */
45     protected $samplecourses = array();
47     /**
48      * Defines the origin of the samples in the database.
49      *
50      * @return string
51      */
52     public function get_samples_origin() {
53         return 'user_enrolments';
54     }
56     /**
57      * Returns the student enrolment course context.
58      *
59      * @param int $sampleid
60      * @return \context
61      */
62     public function sample_access_context($sampleid) {
63         return \context_course::instance($this->get_sample_courseid($sampleid));
64     }
66     /**
67      * Returns the student enrolment course.
68      *
69      * @param int $sampleid
70      * @return \core_analytics\analysable
71      */
72     public function get_sample_analysable($sampleid) {
73         $course = enrol_get_course_by_user_enrolment_id($sampleid);
74         return \core_analytics\course::instance($course);
75     }
77     /**
78      * Data provided by get_all_samples & get_samples.
79      *
80      * @return string[]
81      */
82     protected function provided_sample_data() {
83         return array('user_enrolments', 'context', 'course', 'user');
84     }
86     /**
87      * All course student enrolments.
88      *
89      * It does return all student enrolments including the suspended ones.
90      *
91      * @param \core_analytics\analysable $course
92      * @return array
93      */
94     protected function get_all_samples(\core_analytics\analysable $course) {
96         $enrolments = enrol_get_course_users($course->get_id());
98         // We fetch all enrolments, but we are only interested in students.
99         $studentids = $course->get_students();
101         $samplesdata = array();
102         foreach ($enrolments as $userenrolmentid => $user) {
104             if (empty($studentids[$user->id])) {
105                 // Not a student.
106                 continue;
107             }
109             $sampleid = $userenrolmentid;
110             $samplesdata[$sampleid]['user_enrolments'] = (object)array(
111                 'id' => $user->ueid,
112                 'status' => $user->uestatus,
113                 'enrolid' => $user->ueenrolid,
114                 'userid' => $user->id,
115                 'timestart' => $user->uetimestart,
116                 'timeend' => $user->uetimeend,
117                 'modifierid' => $user->uemodifierid,
118                 'timecreated' => $user->uetimecreated,
119                 'timemodified' => $user->uetimemodified
120             );
121             unset($user->ueid);
122             unset($user->uestatus);
123             unset($user->ueenrolid);
124             unset($user->uetimestart);
125             unset($user->uetimeend);
126             unset($user->uemodifierid);
127             unset($user->uetimecreated);
128             unset($user->uetimemodified);
130             $samplesdata[$sampleid]['course'] = $course->get_course_data();
131             $samplesdata[$sampleid]['context'] = $course->get_context();
132             $samplesdata[$sampleid]['user'] = $user;
134             // Fill the cache.
135             $this->samplecourses[$sampleid] = $course->get_id();
136         }
138         $enrolids = array_keys($samplesdata);
139         return array(array_combine($enrolids, $enrolids), $samplesdata);
140     }
142     /**
143      * Returns all samples from the samples ids.
144      *
145      * @param int[] $sampleids
146      * @return array
147      */
148     public function get_samples($sampleids) {
149         global $DB;
151         $enrolments = enrol_get_course_users(false, false, array(), $sampleids);
153         // Some course enrolments.
154         list($enrolsql, $params) = $DB->get_in_or_equal($sampleids, SQL_PARAMS_NAMED);
156         $samplesdata = array();
157         foreach ($enrolments as $userenrolmentid => $user) {
159             $sampleid = $userenrolmentid;
160             $samplesdata[$sampleid]['user_enrolments'] = (object)array(
161                 'id' => $user->ueid,
162                 'status' => $user->uestatus,
163                 'enrolid' => $user->ueenrolid,
164                 'userid' => $user->id,
165                 'timestart' => $user->uetimestart,
166                 'timeend' => $user->uetimeend,
167                 'modifierid' => $user->uemodifierid,
168                 'timecreated' => $user->uetimecreated,
169                 'timemodified' => $user->uetimemodified
170             );
171             unset($user->ueid);
172             unset($user->uestatus);
173             unset($user->ueenrolid);
174             unset($user->uetimestart);
175             unset($user->uetimeend);
176             unset($user->uemodifierid);
177             unset($user->uetimecreated);
178             unset($user->uetimemodified);
180             // Enrolment samples are grouped by the course they belong to, so all $sampleids belong to the same
181             // course, $courseid and $coursemodinfo will only query the DB once and cache the course data in memory.
182             $courseid = $this->get_sample_courseid($sampleid);
183             $coursemodinfo = get_fast_modinfo($courseid);
184             $coursecontext = \context_course::instance($courseid);
186             $samplesdata[$sampleid]['course'] = $coursemodinfo->get_course();
187             $samplesdata[$sampleid]['context'] = $coursecontext;
188             $samplesdata[$sampleid]['user'] = $user;
190             // Fill the cache.
191             $this->samplecourses[$sampleid] = $coursemodinfo->get_course()->id;
192         }
194         $enrolids = array_keys($samplesdata);
195         return array(array_combine($enrolids, $enrolids), $samplesdata);
196     }
198     /**
199      * Returns the student enrolment course id.
200      *
201      * @param int $sampleid
202      * @return int
203      */
204     protected function get_sample_courseid($sampleid) {
205         global $DB;
207         if (empty($this->samplecourses[$sampleid])) {
208             $course = enrol_get_course_by_user_enrolment_id($sampleid);
209             $this->samplecourses[$sampleid] = $course->id;
210         }
212         return $this->samplecourses[$sampleid];
213     }
215     /**
216      * Returns the visible name of a sample + a renderable to display as sample picture.
217      *
218      * @param int $sampleid
219      * @param int $contextid
220      * @param array $sampledata
221      * @return array array(string, \renderable)
222      */
223     public function sample_description($sampleid, $contextid, $sampledata) {
224         $description = fullname($sampledata['user'], true, array('context' => $contextid));
225         return array($description, new \user_picture($sampledata['user']));
226     }