|
@ -46,6 +46,8 @@ class mobile { |
|
|
$args = (object) $args; |
|
|
$args = (object) $args; |
|
|
$cmid = $args->cmid; |
|
|
$cmid = $args->cmid; |
|
|
$courseid = $args->courseid; |
|
|
$courseid = $args->courseid; |
|
|
|
|
|
$takenstatus = empty($args->status) ? '' : $args->status; |
|
|
|
|
|
$sessid = $args->sessid; |
|
|
$groupid = empty($args->group) ? 0 : $args->group; // By default, group 0. |
|
|
$groupid = empty($args->group) ? 0 : $args->group; // By default, group 0. |
|
|
|
|
|
|
|
|
// Capabilities check. |
|
|
// Capabilities check. |
|
@ -64,7 +66,7 @@ class mobile { |
|
|
$data['courseid'] = $courseid; |
|
|
$data['courseid'] = $courseid; |
|
|
$data['attendance'] = $attendance; |
|
|
$data['attendance'] = $attendance; |
|
|
|
|
|
|
|
|
$data['attendancefunction'] = 'mobile_take_attendance'; |
|
|
$data['attendancefunction'] = 'mobile_user_form'; |
|
|
$isteacher = false; |
|
|
$isteacher = false; |
|
|
if (has_capability('mod/attendance:takeattendances', $context)) { |
|
|
if (has_capability('mod/attendance:takeattendances', $context)) { |
|
|
$isteacher = true; |
|
|
$isteacher = true; |
|
@ -73,17 +75,15 @@ class mobile { |
|
|
|
|
|
|
|
|
// Add stats for this use to output. |
|
|
// Add stats for this use to output. |
|
|
$pageparams = new \mod_attendance_view_page_params(); |
|
|
$pageparams = new \mod_attendance_view_page_params(); |
|
|
|
|
|
|
|
|
$pageparams->studentid = $USER->id; |
|
|
$pageparams->studentid = $USER->id; |
|
|
|
|
|
if (!empty($takenstatus) && !empty($sessid)) { |
|
|
|
|
|
$pageparams->sessionid = $sessid; |
|
|
|
|
|
} |
|
|
$pageparams->mode = \mod_attendance_view_page_params::MODE_THIS_COURSE; |
|
|
$pageparams->mode = \mod_attendance_view_page_params::MODE_THIS_COURSE; |
|
|
$pageparams->view = 5; // Show all sessions for this course? |
|
|
$pageparams->view = 5; // Show all sessions for this course? |
|
|
|
|
|
|
|
|
$att = new \mod_attendance_structure($attendance, $cm, $course, $context, $pageparams); |
|
|
$att = new \mod_attendance_structure($attendance, $cm, $course, $context, $pageparams); |
|
|
|
|
|
|
|
|
$summary = new \mod_attendance_summary($att->id, array($USER->id), $att->pageparams->startdate, |
|
|
|
|
|
$att->pageparams->enddate); |
|
|
|
|
|
$data['summary'] = $summary->get_all_sessions_summary_for($USER->id); |
|
|
|
|
|
|
|
|
|
|
|
// Get list of sessions within the next 24hrs and in last 6hrs. |
|
|
// Get list of sessions within the next 24hrs and in last 6hrs. |
|
|
// TODO: provide way of adjusting which sessions to show in app. |
|
|
// TODO: provide way of adjusting which sessions to show in app. |
|
|
$time = time() - (6 * 60 * 60); |
|
|
$time = time() - (6 * 60 * 60); |
|
@ -104,9 +104,9 @@ class mobile { |
|
|
// This session isn't viewable to this student - probably a group session. |
|
|
// This session isn't viewable to this student - probably a group session. |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
list($canmark, $unused) = attendance_can_student_mark($sess, false); |
|
|
list($canmark, $reason) = attendance_can_student_mark($sess, false); |
|
|
if ($isteacher || $canmark) { |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if ($isteacher || $canmark) { |
|
|
$html = array('time' => attendance_construct_session_time($sess->sessdate, $sess->duration)); |
|
|
$html = array('time' => attendance_construct_session_time($sess->sessdate, $sess->duration)); |
|
|
if (!empty($sess->groupid)) { |
|
|
if (!empty($sess->groupid)) { |
|
|
// TODO In-efficient way to get group name - we should get all groups in one query. |
|
|
// TODO In-efficient way to get group name - we should get all groups in one query. |
|
@ -114,10 +114,61 @@ class mobile { |
|
|
$html['time'] .= ' ('.$groupname.')'; |
|
|
$html['time'] .= ' ('.$groupname.')'; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// Check if Status already recorded. |
|
|
if (!$isteacher && !empty($userdata->sessionslog['c'.$sess->id]->statusid)) { |
|
|
if (!$isteacher && !empty($userdata->sessionslog['c'.$sess->id]->statusid)) { |
|
|
$html['currentstatus'] = $userdata->statuses[$userdata->sessionslog['c'.$sess->id]->statusid]->description; |
|
|
$html['currentstatus'] = $userdata->statuses[$userdata->sessionslog['c'.$sess->id]->statusid]->description; |
|
|
} else { |
|
|
} else { |
|
|
|
|
|
// Status has not been recorded - If student, check auto-assign and form data. |
|
|
$html['sessid'] = $sess->id; |
|
|
$html['sessid'] = $sess->id; |
|
|
|
|
|
|
|
|
|
|
|
if (!$isteacher) { |
|
|
|
|
|
if (!empty($sess->subnet) && !address_in_subnet(getremoteaddr(), $sess->subnet)) { |
|
|
|
|
|
$data['messages'][]['string'] = 'subnetwrong'; // Lang string to show as a message. |
|
|
|
|
|
$html['sessid'] = null; // Unset sessid as we cannot record session on this ip. |
|
|
|
|
|
} else if ($sess->autoassignstatus && empty($sess->studentpassword)) { |
|
|
|
|
|
$statusid = attendance_session_get_highest_status($att, $sess); |
|
|
|
|
|
if (empty($statusid)) { |
|
|
|
|
|
$data['messages'][]['string'] = 'attendance_no_status'; |
|
|
|
|
|
} |
|
|
|
|
|
$take = new \stdClass(); |
|
|
|
|
|
$take->status = $statusid; |
|
|
|
|
|
$take->sessid = $sess->id; |
|
|
|
|
|
$success = $att->take_from_student($take); |
|
|
|
|
|
|
|
|
|
|
|
if ($success) { |
|
|
|
|
|
$html['currentstatus'] = $userdata->statuses[$statusid]->description; |
|
|
|
|
|
$html['sessid'] = null; // Unset sessid as we have recorded session. |
|
|
|
|
|
} |
|
|
|
|
|
} else if (!empty($takenstatus)) { |
|
|
|
|
|
$statuses = $att->get_statuses(); |
|
|
|
|
|
// Check if user has access to all statuses. |
|
|
|
|
|
foreach ($statuses as $status) { |
|
|
|
|
|
if ($status->studentavailability === '0') { |
|
|
|
|
|
unset($statuses[$status->id]); |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
if (!empty($status->studentavailability) && |
|
|
|
|
|
time() > $sess->sessdate + ($status->studentavailability * 60)) { |
|
|
|
|
|
unset($statuses[$status->id]); |
|
|
|
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
if (empty($statuses[$takenstatus])) { |
|
|
|
|
|
// This status has probably expired and is not available - they need to choose a new one. |
|
|
|
|
|
$data['messages'][]['string'] = 'invalidstatus'; |
|
|
|
|
|
} else { |
|
|
|
|
|
$take = new \stdClass(); |
|
|
|
|
|
$take->status = $takenstatus; |
|
|
|
|
|
$take->sessid = $sess->id; |
|
|
|
|
|
$success = $att->take_from_student($take); |
|
|
|
|
|
|
|
|
|
|
|
if ($success) { |
|
|
|
|
|
$html['currentstatus'] = $userdata->statuses[$takenstatus]->description; |
|
|
|
|
|
$html['sessid'] = null; // Unset sessid as we have recorded session. |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
$data['sessions'][] = $html; |
|
|
$data['sessions'][] = $html; |
|
@ -125,6 +176,10 @@ class mobile { |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
$summary = new \mod_attendance_summary($att->id, array($USER->id), $att->pageparams->startdate, |
|
|
|
|
|
$att->pageparams->enddate); |
|
|
|
|
|
$data['summary'] = $summary->get_all_sessions_summary_for($USER->id); |
|
|
|
|
|
|
|
|
return [ |
|
|
return [ |
|
|
'templates' => [ |
|
|
'templates' => [ |
|
|
[ |
|
|
[ |
|
@ -142,7 +197,7 @@ class mobile { |
|
|
* @param array $args Arguments from tool_mobile_get_content WS |
|
|
* @param array $args Arguments from tool_mobile_get_content WS |
|
|
* @return array HTML, javascript and other data |
|
|
* @return array HTML, javascript and other data |
|
|
*/ |
|
|
*/ |
|
|
public static function mobile_take_attendance($args) { |
|
|
public static function mobile_user_form($args) { |
|
|
global $OUTPUT, $DB, $CFG; |
|
|
global $OUTPUT, $DB, $CFG; |
|
|
|
|
|
|
|
|
require_once($CFG->dirroot.'/mod/attendance/locallib.php'); |
|
|
require_once($CFG->dirroot.'/mod/attendance/locallib.php'); |
|
@ -151,7 +206,6 @@ class mobile { |
|
|
$cmid = $args->cmid; |
|
|
$cmid = $args->cmid; |
|
|
$courseid = $args->courseid; |
|
|
$courseid = $args->courseid; |
|
|
$sessid = $args->sessid; |
|
|
$sessid = $args->sessid; |
|
|
$takenstatus = empty($args->status) ? '' : $args->status; |
|
|
|
|
|
|
|
|
|
|
|
// Capabilities check. |
|
|
// Capabilities check. |
|
|
$cm = get_coursemodule_from_id('attendance', $cmid); |
|
|
$cm = get_coursemodule_from_id('attendance', $cmid); |
|
@ -189,21 +243,9 @@ class mobile { |
|
|
$data['messages'][]['string'] = 'subnetwrong'; // Lang string to show as a message. |
|
|
$data['messages'][]['string'] = 'subnetwrong'; // Lang string to show as a message. |
|
|
$data['showstatuses'] = false; // Hide all statuses. |
|
|
$data['showstatuses'] = false; // Hide all statuses. |
|
|
} else if ($attforsession->autoassignstatus && empty($attforsession->studentpassword)) { |
|
|
} else if ($attforsession->autoassignstatus && empty($attforsession->studentpassword)) { |
|
|
$statusid = attendance_session_get_highest_status($att, $attforsession); |
|
|
// This shouldn't happen as the main function should handle this scenario. |
|
|
if (empty($statusid)) { |
|
|
// Hide all status just in case the user manages to hit this page accidentally. |
|
|
$data['messages'][]['string'] = 'attendance_no_status'; |
|
|
|
|
|
} |
|
|
|
|
|
$take = new \stdClass(); |
|
|
|
|
|
$take->status = $statusid; |
|
|
|
|
|
$take->sessid = $attforsession->id; |
|
|
|
|
|
$success = $att->take_from_student($take); |
|
|
|
|
|
|
|
|
|
|
|
if ($success) { |
|
|
|
|
|
$data['messages'][]['string'] = 'attendancesuccess'; // Lang string to show as a message. |
|
|
|
|
|
} else { |
|
|
|
|
|
$data['messages'][]['string'] = 'attendance_already_submitted'; // Lang string to show as a message. |
|
|
|
|
|
$data['showstatuses'] = false; // Hide all statuses. |
|
|
$data['showstatuses'] = false; // Hide all statuses. |
|
|
} |
|
|
|
|
|
} else { |
|
|
} else { |
|
|
// Show user form for submitting a status. |
|
|
// Show user form for submitting a status. |
|
|
$statuses = $att->get_statuses(); |
|
|
$statuses = $att->get_statuses(); |
|
@ -224,26 +266,6 @@ class mobile { |
|
|
if (empty($data['statuses'])) { |
|
|
if (empty($data['statuses'])) { |
|
|
$data['messages'][]['string'] = 'attendance_no_status'; |
|
|
$data['messages'][]['string'] = 'attendance_no_status'; |
|
|
$data['showstatuses'] = false; // Hide all statuses. |
|
|
$data['showstatuses'] = false; // Hide all statuses. |
|
|
} else if (!empty($takenstatus)) { |
|
|
|
|
|
// Check if user has submitted a status. |
|
|
|
|
|
if (empty($statuses[$takenstatus])) { |
|
|
|
|
|
// This status has probably expired and is not available - they need to choose a new one. |
|
|
|
|
|
$data['messages'][]['string'] = 'invalidstatus'; |
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
|
|
|
|
$take = new \stdClass(); |
|
|
|
|
|
$take->status = $takenstatus; |
|
|
|
|
|
$take->sessid = $attforsession->id; |
|
|
|
|
|
$success = $att->take_from_student($take); |
|
|
|
|
|
|
|
|
|
|
|
if ($success) { |
|
|
|
|
|
$data['messages'][]['string'] = 'attendancesuccess'; // Lang string to show as a message. |
|
|
|
|
|
$data['showstatuses'] = false; // Hide all statuses. |
|
|
|
|
|
} else { |
|
|
|
|
|
$data['messages'][]['string'] = 'attendance_already_submitted'; // Lang string to show as a message. |
|
|
|
|
|
$data['showstatuses'] = false; // Hide all statuses. |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
if (!empty($data['messages'])) { |
|
|
if (!empty($data['messages'])) { |
|
@ -254,7 +276,8 @@ class mobile { |
|
|
'templates' => [ |
|
|
'templates' => [ |
|
|
[ |
|
|
[ |
|
|
'id' => 'main', |
|
|
'id' => 'main', |
|
|
'html' => $OUTPUT->render_from_template('mod_attendance/mobile_take_attendance', $data), |
|
|
'html' => $OUTPUT->render_from_template('mod_attendance/mobile_user_form', $data), |
|
|
|
|
|
'cache-view' => false |
|
|
], |
|
|
], |
|
|
], |
|
|
], |
|
|
'javascript' => '', |
|
|
'javascript' => '', |
|
|