MDL-68963 qtype_calculatedmulti: show question content inline
[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             'u.*',
89             "{user} u $capjoin->joins",
90             $capjoin->wheres,
91             $capjoin->params);
92     }
94     /**
95      * Return the report user record.
96      *
97      * Participants report has no specific user.
98      *
99      * @return stdClass|null a user or null
100      */
101     public function get_user(): ?stdClass {
102         return null;
103     }
105     /**
106      * Return the report attempt object.
107      *
108      * Participants report has no specific attempt.
109      *
110      * @return attempt|null the attempt object or null
111      */
112     public function get_attempt(): ?attempt {
113         return null;
114     }
116     /**
117      * Print the report.
118      */
119     public function print(): void {
120         global $PAGE, $OUTPUT;
122         $this->define_baseurl($PAGE->url);
124         echo $OUTPUT->heading(get_string('attempts_report', 'mod_h5pactivity'));
126         $this->out($this->get_page_size(), true);
127     }
129     /**
130      * Warning in case no user has the selected initials letters.
131      *
132      */
133     public function print_nothing_to_display() {
134         global $OUTPUT;
135         echo $this->render_reset_button();
136         $this->print_initials_bar();
137         echo $OUTPUT->notification(get_string('noparticipants', 'mod_h5pactivity'), 'warning');
138     }
140     /**
141      * Generate the fullname column.
142      *
143      * @param stdClass $user
144      * @return string
145      */
146     public function col_fullname($user): string {
147         global $OUTPUT;
148         $cm = $this->manager->get_coursemodule();
149         return $OUTPUT->user_picture($user, ['size' => 35, 'courseid' => $cm->course, 'includefullname' => true]);
150     }
152     /**
153      * Generate score column.
154      *
155      * @param stdClass $user the user record
156      * @return string
157      */
158     public function col_score(stdClass $user): string {
159         $cm = $this->manager->get_coursemodule();
160         if (isset($this->scores[$user->id])) {
161             $score = $this->scores[$user->id];
162             $maxgrade = floatval(100);
163             $scaled = round($maxgrade * $score->scaled).'%';
164             if (empty($score->attemptid)) {
165                 return $scaled;
166             } else {
167                 $url = new moodle_url('/mod/h5pactivity/report.php', ['a' => $cm->instance, 'attemptid' => $score->attemptid]);
168                 return html_writer::link($url, $scaled);
169             }
170         }
171         return '';
172     }
174     /**
175      * Generate attempts count column, if any.
176      *
177      * @param stdClass $user the user record
178      * @return string
179      */
180     public function col_attempts(stdClass $user): string {
181         $cm = $this->manager->get_coursemodule();
182         if (isset($this->count[$user->id])) {
183             $msg = get_string('review_user_attempts', 'mod_h5pactivity', $this->count[$user->id]);
184             $url = new moodle_url('/mod/h5pactivity/report.php', ['a' => $cm->instance, 'userid' => $user->id]);
185             return html_writer::link($url, $msg);
186         }
187         return '';
189     }
191     /**
192      * Generate attempt timemodified column, if any.
193      *
194      * @param stdClass $user the user record
195      * @return string
196      */
197     public function col_timemodified(stdClass $user): string {
198         if (isset($this->scores[$user->id])) {
199             $score = $this->scores[$user->id];
200             return userdate($score->timemodified);
201         }
202         return '';
203     }