2 // This file is part of Moodle - http://moodle.org/
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.
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.
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/>.
18 * Attendance module renderable components are defined here
20 * @package mod_attendance
21 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
22 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
25 defined('MOODLE_INTERNAL') ||
die();
27 require_once(dirname(__FILE__
).'/locallib.php');
31 * Represents info about attendance tabs.
33 * Proxy class for security reasons (renderers must not have access to all attendance methods)
35 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
36 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
39 class attendance_tabs
implements renderable
{
41 const TAB_SESSIONS
= 1;
48 /** Preferences tab */
49 const TAB_PREFERENCES
= 5;
51 const TAB_TEMPORARYUSERS
= 6; // Tab for managing temporary users.
55 const TAB_WARNINGS
= 8;
57 const TAB_ABSENTEE
= 9;
58 /** @var int current tab */
61 /** @var stdClass attendance */
65 * Prepare info about sessions for attendance taking into account view parameters.
67 * @param mod_attendance_structure $att
68 * @param int $currenttab - one of attendance_tabs constants
70 public function __construct(mod_attendance_structure
$att, $currenttab=null
) {
72 $this->currenttab
= $currenttab;
76 * Return array of rows where each row is an array of tab objects
77 * taking into account permissions of current user
79 public function get_tabs() {
81 $context = $this->att
->context
;
82 $capabilities = array(
83 'mod/attendance:manageattendances',
84 'mod/attendance:takeattendances',
85 'mod/attendance:changeattendances'
87 if (has_any_capability($capabilities, $context)) {
88 $toprow[] = new tabobject(self
::TAB_SESSIONS
, $this->att
->url_manage()->out(),
89 get_string('sessions', 'attendance'));
92 if (has_capability('mod/attendance:manageattendances', $context)) {
93 $toprow[] = new tabobject(self
::TAB_ADD
,
94 $this->att
->url_sessions()->out(true
,
95 array('action' => mod_attendance_sessions_page_params
::ACTION_ADD
)),
96 get_string('addsession', 'attendance'));
98 if (has_capability('mod/attendance:viewreports', $context)) {
99 $toprow[] = new tabobject(self
::TAB_REPORT
, $this->att
->url_report()->out(),
100 get_string('report', 'attendance'));
103 if (has_capability('mod/attendance:viewreports', $context) &&
104 get_config('attendance', 'enablewarnings')) {
105 $toprow[] = new tabobject(self
::TAB_ABSENTEE
, $this->att
->url_absentee()->out(),
106 get_string('absenteereport', 'attendance'));
109 if (has_capability('mod/attendance:export', $context)) {
110 $toprow[] = new tabobject(self
::TAB_EXPORT
, $this->att
->url_export()->out(),
111 get_string('export', 'attendance'));
114 if (has_capability('mod/attendance:changepreferences', $context)) {
115 $toprow[] = new tabobject(self
::TAB_PREFERENCES
, $this->att
->url_preferences()->out(),
116 get_string('statussetsettings', 'attendance'));
118 if (get_config('attendance', 'enablewarnings')) {
119 $toprow[] = new tabobject(self
::TAB_WARNINGS
, $this->att
->url_warnings()->out(),
120 get_string('warnings', 'attendance'));
123 if (has_capability('mod/attendance:managetemporaryusers', $context)) {
124 $toprow[] = new tabobject(self
::TAB_TEMPORARYUSERS
, $this->att
->url_managetemp()->out(),
125 get_string('tempusers', 'attendance'));
127 if ($this->currenttab
== self
::TAB_UPDATE
&& has_capability('mod/attendance:manageattendances', $context)) {
128 $toprow[] = new tabobject(self
::TAB_UPDATE
,
129 $this->att
->url_sessions()->out(true
,
130 array('action' => mod_attendance_sessions_page_params
::ACTION_UPDATE
)),
131 get_string('changesession', 'attendance'));
134 return array($toprow);
139 * Class attendance_filter_controls
140 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
141 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
143 class attendance_filter_controls
implements renderable
{
144 /** @var int current view mode */
157 public $reportcontrol;
162 /** @var mod_attendance_structure */
166 * attendance_filter_controls constructor.
167 * @param mod_attendance_structure $att
168 * @param bool $report
170 public function __construct(mod_attendance_structure
$att, $report = false
) {
173 $this->pageparams
= $att->pageparams
;
175 $this->cm
= $att->cm
;
177 // This is a report control only if $reports is true and the attendance block can be graded.
178 $this->reportcontrol
= $report;
180 $this->curdate
= $att->pageparams
->curdate
;
182 $date = usergetdate($att->pageparams
->curdate
);
183 $mday = $date['mday'];
185 $year = $date['year'];
187 switch ($this->pageparams
->view
) {
189 $format = get_string('strftimedm', 'attendance');
190 $this->prevcur
= make_timestamp($year, $mon, $mday - 1);
191 $this->nextcur
= make_timestamp($year, $mon, $mday +
1);
192 $this->curdatetxt
= userdate($att->pageparams
->startdate
, $format);
195 $format = get_string('strftimedm', 'attendance');
196 $this->prevcur
= $att->pageparams
->startdate
- WEEKSECS
;
197 $this->nextcur
= $att->pageparams
->startdate + WEEKSECS
;
198 $this->curdatetxt
= userdate($att->pageparams
->startdate
, $format).
199 " - ".userdate($att->pageparams
->enddate
, $format);
201 case ATT_VIEW_MONTHS
:
203 $this->prevcur
= make_timestamp($year, $mon - 1);
204 $this->nextcur
= make_timestamp($year, $mon +
1);
205 $this->curdatetxt
= userdate($att->pageparams
->startdate
, $format);
209 $this->urlpath
= $PAGE->url
->out_omit_querystring();
210 $params = $att->pageparams
->get_significant_params();
211 $params['id'] = $att->cm
->id
;
212 $this->urlparams
= $params;
218 * Helper function for url.
220 * @param array $params
223 public function url($params=array()) {
224 $params = array_merge($this->urlparams
, $params);
226 return new moodle_url($this->urlpath
, $params);
230 * Helper function for url path.
233 public function url_path() {
234 return $this->urlpath
;
238 * Helper function for url_params.
239 * @param array $params
242 public function url_params($params=array()) {
243 $params = array_merge($this->urlparams
, $params);
252 public function get_group_mode() {
253 return $this->att
->get_group_mode();
260 public function get_sess_groups_list() {
261 return $this->att
->pageparams
->get_sess_groups_list();
265 * Get current session type.
268 public function get_current_sesstype() {
269 return $this->att
->pageparams
->get_current_sesstype();
274 * Represents info about attendance sessions taking into account view parameters.
276 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
277 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
279 class attendance_manage_data
implements renderable
{
280 /** @var array of sessions*/
283 /** @var int number of hidden sessions (sessions before $course->startdate)*/
284 public $hiddensessionscount;
288 public $hiddensesscount;
290 /** @var mod_attendance_structure */
293 * Prepare info about attendance sessions taking into account view parameters.
295 * @param mod_attendance_structure $att instance
297 public function __construct(mod_attendance_structure
$att) {
299 $this->sessions
= $att->get_filtered_sessions();
301 $this->groups
= groups_get_all_groups($att->course
->id
);
303 $this->hiddensessionscount
= $att->get_hidden_sessions_count();
309 * Helper function to return urls.
310 * @param int $sessionid
311 * @param int $grouptype
314 public function url_take($sessionid, $grouptype) {
315 return url_helpers
::url_take($this->att
, $sessionid, $grouptype);
319 * Must be called without or with both parameters
321 * @param int $sessionid
322 * @param null $action
325 public function url_sessions($sessionid=null
, $action=null
) {
326 return url_helpers
::url_sessions($this->att
, $sessionid, $action);
333 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
334 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
336 class attendance_take_data
implements renderable
{
339 /** @var array|null|stdClass */
352 public $sessions4copy;
359 /** @var mod_attendance_structure */
363 * attendance_take_data constructor.
364 * @param mod_attendance_structure $att
366 public function __construct(mod_attendance_structure
$att) {
367 if ($att->pageparams
->grouptype
) {
368 $this->users
= $att->get_users($att->pageparams
->grouptype
, $att->pageparams
->page
);
370 $this->users
= $att->get_users($att->pageparams
->group
, $att->pageparams
->page
);
373 $this->pageparams
= $att->pageparams
;
375 $this->groupmode
= $att->get_group_mode();
376 $this->cm
= $att->cm
;
378 $this->statuses
= $att->get_statuses();
380 $this->sessioninfo
= $att->get_session_info($att->pageparams
->sessionid
);
381 $this->updatemode
= $this->sessioninfo
->lasttaken
> 0;
383 if (isset($att->pageparams
->copyfrom
)) {
384 $this->sessionlog
= $att->get_session_log($att->pageparams
->copyfrom
);
385 } else if ($this->updatemode
) {
386 $this->sessionlog
= $att->get_session_log($att->pageparams
->sessionid
);
388 $this->sessionlog
= array();
391 if (!$this->updatemode
) {
392 $this->sessions4copy
= $att->get_today_sessions_for_copy($this->sessioninfo
);
395 $this->urlpath
= $att->url_take()->out_omit_querystring();
396 $params = $att->pageparams
->get_significant_params();
397 $params['id'] = $att->cm
->id
;
398 $this->urlparams
= $params;
405 * @param array $params
406 * @param array $excludeparams
409 public function url($params=array(), $excludeparams=array()) {
410 $params = array_merge($this->urlparams
, $params);
412 foreach ($excludeparams as $paramkey) {
413 unset($params[$paramkey]);
416 return new moodle_url($this->urlpath
, $params);
421 * @param array $params
424 public function url_view($params=array()) {
425 return url_helpers
::url_view($this->att
, $params);
432 public function url_path() {
433 return $this->urlpath
;
440 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
441 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
443 class attendance_user_data
implements renderable
{
444 /** @var mixed|object */
446 /** @var array|null|stdClass */
452 /** @var attendance_filter_controls */
453 public $filtercontrols;
466 * attendance_user_data constructor.
467 * @param mod_attendance_structure $att
470 public function __construct(mod_attendance_structure
$att, $userid) {
471 $this->user
= $att->get_user($userid);
473 $this->pageparams
= $att->pageparams
;
475 if ($this->pageparams
->mode
== mod_attendance_view_page_params
::MODE_THIS_COURSE
) {
476 $this->statuses
= $att->get_statuses(true
, true
);
478 $this->summary
= new mod_attendance_summary($att->id
, array($userid), $att->pageparams
->startdate
,
479 $att->pageparams
->enddate
);
481 $this->filtercontrols
= new attendance_filter_controls($att);
483 $this->sessionslog
= $att->get_user_filtered_sessions_log_extended($userid);
485 $this->groups
= groups_get_all_groups($att->course
->id
);
487 $this->coursesatts
= attendance_get_user_courses_attendances($userid);
488 $this->statuses
= array();
489 $this->summary
= array();
490 foreach ($this->coursesatts
as $atid => $ca) {
491 // Check to make sure the user can view this cm.
492 $modinfo = get_fast_modinfo($ca->courseid
);
493 if (!$modinfo->instances
['attendance'][$ca->attid
]->uservisible
) {
494 unset($this->coursesatts
[$atid]);
497 $this->coursesatts
[$atid]->cmid
= $modinfo->instances
['attendance'][$ca->attid
]->get_course_module_record()->id
;
499 $this->statuses
[$ca->attid
] = attendance_get_statuses($ca->attid
);
500 $this->summary
[$ca->attid
] = new mod_attendance_summary($ca->attid
, array($userid));
503 $this->urlpath
= $att->url_view()->out_omit_querystring();
504 $params = $att->pageparams
->get_significant_params();
505 $params['id'] = $att->cm
->id
;
506 $this->urlparams
= $params;
513 public function url() {
514 return new moodle_url($this->urlpath
, $this->urlparams
);
521 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
522 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
524 class attendance_report_data
implements renderable
{
525 /** @var array|null|stdClass */
535 /** @var array includes disablrd/deleted statuses. */
538 public $usersgroups = array();
540 public $sessionslog = array();
541 /** @var array|mod_attendance_summary */
542 public $summary = array();
543 /** @var mod_attendance_structure */
547 * attendance_report_data constructor.
548 * @param mod_attendance_structure $att
550 public function __construct(mod_attendance_structure
$att) {
551 $currenttime = time();
552 if ($att->pageparams
->view
== ATT_VIEW_NOTPRESENT
) {
553 $att->pageparams
->enddate
= $currenttime;
556 $this->pageparams
= $att->pageparams
;
558 $this->users
= $att->get_users($att->pageparams
->group
, $att->pageparams
->page
);
560 if (isset($att->pageparams
->userids
)) {
561 foreach ($this->users
as $key => $user) {
562 if (!in_array($user->id
, $att->pageparams
->userids
)) {
563 unset($this->users
[$key]);
568 $this->groups
= groups_get_all_groups($att->course
->id
);
570 $this->sessions
= $att->get_filtered_sessions();
572 $this->statuses
= $att->get_statuses(true
, true
);
573 $this->allstatuses
= $att->get_statuses(false
, true
);
575 if ($att->pageparams
->view
== ATT_VIEW_SUMMARY
) {
576 $this->summary
= new mod_attendance_summary($att->id
);
578 $this->summary
= new mod_attendance_summary($att->id
, array_keys($this->users
),
579 $att->pageparams
->startdate
, $att->pageparams
->enddate
);
582 foreach ($this->users
as $key => $user) {
583 $usersummary = $this->summary
->get_taken_sessions_summary_for($user->id
);
584 if ($att->pageparams
->view
!= ATT_VIEW_NOTPRESENT ||
585 $usersummary->takensessionspoints
< $usersummary->takensessionsmaxpoints ||
586 $usersummary->takensessionsmaxpoints
== 0) {
587 $this->usersgroups
[$user->id
] = groups_get_all_groups($att->course
->id
, $user->id
);
589 $this->sessionslog
[$user->id
] = $att->get_user_filtered_sessions_log($user->id
);
591 unset($this->users
[$key]);
600 * @param int $sessionid
601 * @param int $grouptype
604 public function url_take($sessionid, $grouptype) {
605 return url_helpers
::url_take($this->att
, $sessionid, $grouptype);
610 * @param array $params
613 public function url_view($params=array()) {
614 return url_helpers
::url_view($this->att
, $params);
619 * @param array $params
622 public function url($params=array()) {
623 $params = array_merge($params, $this->pageparams
->get_significant_params());
625 return $this->att
->url_report($params);
631 * Class preferences data.
633 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
634 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
636 class attendance_preferences_data
implements renderable
{
639 /** @var mod_attendance_structure */
645 * attendance_preferences_data constructor.
646 * @param mod_attendance_structure $att
647 * @param array $errors
649 public function __construct(mod_attendance_structure
$att, $errors) {
650 $this->statuses
= $att->get_statuses(false
);
651 $this->errors
= $errors;
653 foreach ($this->statuses
as $st) {
654 $st->haslogs
= attendance_has_logs_for_status($st->id
);
661 * url helper function
662 * @param array $params
663 * @param bool $significantparams
666 public function url($params=array(), $significantparams=true
) {
667 if ($significantparams) {
668 $params = array_merge($this->att
->pageparams
->get_significant_params(), $params);
671 return $this->att
->url_preferences($params);
678 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
679 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
681 class attendance_default_statusset
implements renderable
{
688 * attendance_default_statusset constructor.
689 * @param array $statuses
690 * @param array $errors
692 public function __construct($statuses, $errors) {
693 $this->statuses
= $statuses;
694 $this->errors
= $errors;
699 * @param stdClass $params
702 public function url($params) {
703 return new moodle_url('/mod/attendance/defaultstatus.php', $params);
708 * Output a selector to change between status sets.
710 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
711 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
713 class attendance_set_selector
implements renderable
{
715 public $maxstatusset;
716 /** @var mod_attendance_structure */
720 * attendance_set_selector constructor.
721 * @param mod_attendance_structure $att
722 * @param int $maxstatusset
724 public function __construct(mod_attendance_structure
$att, $maxstatusset) {
726 $this->maxstatusset
= $maxstatusset;
731 * @param array $statusset
734 public function url($statusset) {
736 $params['statusset'] = $statusset;
738 return $this->att
->url_preferences($params);
742 * get current statusset.
745 public function get_current_statusset() {
746 if (isset($this->att
->pageparams
->statusset
)) {
747 return $this->att
->pageparams
->statusset
;
753 * get statusset name.
754 * @param int $statusset
757 public function get_status_name($statusset) {
758 return attendance_get_setname($this->att
->id
, $statusset, true
);
765 * @copyright 2011 Artem Andreev <andreev.artem@gmail.com>
766 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
771 * @param stdClass $att
772 * @param int $sessionid
773 * @param int $grouptype
776 public static function url_take($att, $sessionid, $grouptype) {
777 $params = array('sessionid' => $sessionid);
778 if (isset($grouptype)) {
779 $params['grouptype'] = $grouptype;
782 return $att->url_take($params);
786 * Must be called without or with both parameters
787 * @param stdClass $att
788 * @param null $sessionid
789 * @param null $action
792 public static function url_sessions($att, $sessionid=null
, $action=null
) {
793 if (isset($sessionid) && isset($action)) {
794 $params = array('sessionid' => $sessionid, 'action' => $action);
799 return $att->url_sessions($params);
804 * @param stdClass $att
805 * @param array $params
808 public static function url_view($att, $params=array()) {
809 return $att->url_view($params);
814 * Data structure representing an attendance password icon.
816 * @copyright 2017 Dan Marsden
817 * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
819 class attendance_password_icon
implements renderable
, templatable
{
822 * @var string text to show
827 * @var string Extra descriptive text next to the icon
829 public $linktext = null
;
834 * @param string $text string for help page title,
835 * string with _help suffix is used for the actual help text.
836 * string with _link suffix is used to create a link to further info (if it exists)
837 * @param string $sessionid
839 public function __construct($text, $sessionid) {
841 $this->sessionid
= $sessionid;
845 * Export this data so it can be used as the context for a mustache template.
847 * @param renderer_base $output Used to do a final render of any components that need to be rendered for export.
850 public function export_for_template(renderer_base
$output) {
852 $title = get_string('password', 'attendance');
854 $data = new stdClass();
856 $data->text
= $this->text
;
859 $data->icon
= (new pix_icon('key', '', 'attendance'))->export_for_template($output);
860 $data->linktext
= '';
861 $data->title
= $title;
862 $data->url
= (new moodle_url('/mod/attendance/password.php', [
863 'session' => $this->sessionid
]))->out(false
);
865 $data->ltr
= !right_to_left();