Merge branch 'MDL-68963-master' of git://github.com/bmbrands/moodle
[moodle.git] / mod / h5pactivity / classes / local / report / participants.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  * H5P activity participants report
19  *
20  * @package    mod_h5pactivity
21  * @since      Moodle 3.9
22  * @copyright  2020 Ferran Recio <ferran@moodle.com>
23  * @license    http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
24  */
26 namespace mod_h5pactivity\local\report;
28 use mod_h5pactivity\local\report;
29 use mod_h5pactivity\local\manager;
30 use mod_h5pactivity\local\attempt;
31 use table_sql;
32 use moodle_url;
33 use html_writer;
34 use stdClass;
36 defined('MOODLE_INTERNAL') || die();
38 global $CFG;
39 require_once($CFG->libdir.'/tablelib.php');
41 /**
42  * Class  H5P activity participants report.
43  *
44  * @package    mod_h5pactivity
45  * @since      Moodle 3.9
46  * @copyright  2020 Ferran Recio <ferran@moodle.com>
47  */
48 class participants extends table_sql implements report {
50     /** @var manager the H5P activity manager instance. */
51     private $manager;
53     /** @var array the users scored attempts. */
54     private $scores;
56     /** @var array the user attempts count. */
57     private $count;
59     /**
60      * Create a new participants report.
61      *
62      * @param manager $manager h5pactivitymanager object
63      */
64     public function __construct(manager $manager) {
65         parent::__construct('mod_h5pactivity-participants');
66         $this->manager = $manager;
67         $this->scores = $manager->get_users_scaled_score();
68         $this->count = $manager->count_users_attempts();
70         // Setup table_sql.
71         $columns = ['fullname', 'timemodified', 'score', 'attempts'];
72         $headers = [
73             get_string('fullname'), get_string('date'),
74             get_string('score', 'mod_h5pactivity'), get_string('attempts', 'mod_h5pactivity'),
75         ];
76         $this->define_columns($columns);
77         $this->define_headers($headers);
78         $this->set_attribute('class', 'generaltable generalbox boxaligncenter boxwidthwide');
79         $this->sortable(true);
80         $this->no_sorting('score');
81         $this->no_sorting('timemodified');
82         $this->no_sorting('attempts');
83         $this->pageable(true);
85         // Set query SQL.
86         $capjoin = get_enrolled_with_capabilities_join($this->manager->get_context(), '', 'mod/h5pactivity:submit');
87         $this->set_sql(
88             'DISTINCT u.id, u.picture, u.firstname, u.lastname, u.firstnamephonetic, u.lastnamephonetic,
89             u.middlename, u.alternatename, u.imagealt, u.email',
90             "{user} u $capjoin->joins",
91             $capjoin->wheres,
92             $capjoin->params);
93     }
95     /**
96      * Return the report user record.
97      *
98      * Participants report has no specific user.
99      *
100      * @return stdClass|null a user or null
101      */
102     public function get_user(): ?stdClass {
103         return null;
104     }
106     /**
107      * Return the report attempt object.
108      *
109      * Participants report has no specific attempt.
110      *
111      * @return attempt|null the attempt object or null
112      */
113     public function get_attempt(): ?attempt {
114         return null;
115     }
117     /**
118      * Print the report.
119      */
120     public function print(): void {
121         global $PAGE, $OUTPUT;
123         $this->define_baseurl($PAGE->url);
125         echo $OUTPUT->heading(get_string('attempts_report', 'mod_h5pactivity'));
127         $this->out($this->get_page_size(), true);
128     }
130     /**
131      * Warning in case no user has the selected initials letters.
132      *
133      */
134     public function print_nothing_to_display() {
135         global $OUTPUT;
136         echo $this->render_reset_button();
137         $this->print_initials_bar();
138         echo $OUTPUT->notification(get_string('noparticipants', 'mod_h5pactivity'), 'warning');
139     }
141     /**
142      * Generate the fullname column.
143      *
144      * @param stdClass $user
145      * @return string
146      */
147     public function col_fullname($user): string {
148         global $OUTPUT;
149         $cm = $this->manager->get_coursemodule();
150         return $OUTPUT->user_picture($user, ['size' => 35, 'courseid' => $cm->course, 'includefullname' => true]);
151     }
153     /**
154      * Generate score column.
155      *
156      * @param stdClass $user the user record
157      * @return string
158      */
159     public function col_score(stdClass $user): string {
160         $cm = $this->manager->get_coursemodule();
161         if (isset($this->scores[$user->id])) {
162             $score = $this->scores[$user->id];
163             $maxgrade = floatval(100);
164             $scaled = round($maxgrade * $score->scaled).'%';
165             if (empty($score->attemptid)) {
166                 return $scaled;
167             } else {
168                 $url = new moodle_url('/mod/h5pactivity/report.php', ['a' => $cm->instance, 'attemptid' => $score->attemptid]);
169                 return html_writer::link($url, $scaled);
170             }
171         }
172         return '';
173     }
175     /**
176      * Generate attempts count column, if any.
177      *
178      * @param stdClass $user the user record
179      * @return string
180      */
181     public function col_attempts(stdClass $user): string {
182         $cm = $this->manager->get_coursemodule();
183         if (isset($this->count[$user->id])) {
184             $msg = get_string('review_user_attempts', 'mod_h5pactivity', $this->count[$user->id]);
185             $url = new moodle_url('/mod/h5pactivity/report.php', ['a' => $cm->instance, 'userid' => $user->id]);
186             return html_writer::link($url, $msg);
187         }
188         return '';
190     }
192     /**
193      * Generate attempt timemodified column, if any.
194      *
195      * @param stdClass $user the user record
196      * @return string
197      */
198     public function col_timemodified(stdClass $user): string {
199         if (isset($this->scores[$user->id])) {
200             $score = $this->scores[$user->id];
201             return userdate($score->timemodified);
202         }
203         return '';
204     }