Dan Marsden
8 years ago
15 changed files with 335 additions and 18 deletions
@ -0,0 +1,155 @@ |
|||||
|
<?php |
||||
|
// This file is part of Moodle - http://moodle.org/ |
||||
|
// |
||||
|
// Moodle is free software: you can redistribute it and/or modify |
||||
|
// it under the terms of the GNU General Public License as published by |
||||
|
// the Free Software Foundation, either version 3 of the License, or |
||||
|
// (at your option) any later version. |
||||
|
// |
||||
|
// Moodle is distributed in the hope that it will be useful, |
||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
// GNU General Public License for more details. |
||||
|
// |
||||
|
// You should have received a copy of the GNU General Public License |
||||
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
||||
|
|
||||
|
/** |
||||
|
* Attendance task - auto mark. |
||||
|
* |
||||
|
* @package mod_attendance |
||||
|
* @copyright 2017 onwards Dan Marsden http://danmarsden.com |
||||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
||||
|
*/ |
||||
|
|
||||
|
namespace mod_attendance\task; |
||||
|
defined('MOODLE_INTERNAL') || die(); |
||||
|
|
||||
|
require_once($CFG->dirroot . '/mod/attendance/locallib.php'); |
||||
|
/** |
||||
|
* get_scores class, used to get scores for submitted files. |
||||
|
* |
||||
|
* @package mod_attendance |
||||
|
* @copyright 2017 onwards Dan Marsden http://danmarsden.com |
||||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
||||
|
*/ |
||||
|
class auto_mark extends \core\task\scheduled_task { |
||||
|
public function get_name() { |
||||
|
// Shown in admin screens. |
||||
|
return get_string('automarktask', 'mod_attendance'); |
||||
|
} |
||||
|
public function execute() { |
||||
|
global $DB; |
||||
|
// Create some cache vars - might be nice to restructure this and make a smaller number of sql calls. |
||||
|
$cachecm = array(); |
||||
|
$cacheatt = array(); |
||||
|
$cachecourse = array(); |
||||
|
$sessions = $DB->get_recordset_select('attendance_sessions', |
||||
|
'automark = 1 AND automarkcompleted = 0 AND sessdate < ? ', array(time())); |
||||
|
|
||||
|
foreach ($sessions as $session) { |
||||
|
// Would be nice to change duration field to a timestamp so we don't need this step. |
||||
|
if ($session->sessdate + $session->duration < time()) { |
||||
|
$donesomething = false; // Only trigger grades/events when an update actually occurs. |
||||
|
|
||||
|
// Store cm/att/course in cachefields so we don't make unnecessary db calls. |
||||
|
// Would probably be nice to grab this stuff outside of the loop. |
||||
|
// Make sure this status set has something to setunmarked. |
||||
|
$setunmarked = $DB->get_field('attendance_statuses', 'id', |
||||
|
array('attendanceid' => $session->attendanceid, 'setnumber' => $session->statusset, |
||||
|
'setunmarked' => 1, 'deleted' => 0)); |
||||
|
if (empty($setunmarked)) { |
||||
|
mtrace("No unmarked status configured for session id: ".$session->id); |
||||
|
continue; |
||||
|
} |
||||
|
if (empty($cacheatt[$session->attendanceid])) { |
||||
|
$cacheatt[$session->attendanceid] = $DB->get_record('attendance', array('id' => $session->attendanceid)); |
||||
|
} |
||||
|
if (empty($cachecm[$session->attendanceid])) { |
||||
|
$cachecm[$session->attendanceid] = get_coursemodule_from_instance('attendance', |
||||
|
$session->attendanceid, $cacheatt[$session->attendanceid]->course); |
||||
|
} |
||||
|
$courseid = $cacheatt[$session->attendanceid]->course; |
||||
|
if (empty($cachecourse[$courseid])) { |
||||
|
$cachecourse[$courseid] = $DB->get_record('course', array('id' => $courseid)); |
||||
|
} |
||||
|
$context = \context_module::instance($cachecm[$session->attendanceid]->id); |
||||
|
|
||||
|
$pageparams = new \mod_attendance_take_page_params(); |
||||
|
$pageparams->group = $session->groupid; |
||||
|
if (empty($session->groupid)) { |
||||
|
$pageparams->grouptype = 0; |
||||
|
} else { |
||||
|
$pageparams->grouptype = 1; |
||||
|
} |
||||
|
$pageparams->sessionid = $session->id; |
||||
|
|
||||
|
// Get all unmarked students. |
||||
|
$att = new \mod_attendance_structure($cacheatt[$session->attendanceid], |
||||
|
$cachecm[$session->attendanceid], $cachecourse[$courseid], $context, $pageparams); |
||||
|
|
||||
|
$users = $att->get_users($session->groupid, 0); |
||||
|
|
||||
|
$existinglog = $DB->get_recordset('attendance_log', array('sessionid' => $session->id)); |
||||
|
$updated = 0; |
||||
|
|
||||
|
foreach ($existinglog as $log) { |
||||
|
if (empty($log->statusid)) { |
||||
|
// Status needs updating. |
||||
|
$existinglog->statusid = $setunmarked; |
||||
|
$existinglog->timetaken = time(); |
||||
|
$existinglog->takenby = 0; |
||||
|
$existinglog->remarks = get_string('autorecorded', 'attendance'); |
||||
|
|
||||
|
$DB->update_record('attendance_log', $existinglog); |
||||
|
$updated++; |
||||
|
$donesomething = true; |
||||
|
} |
||||
|
unset($users[$log->studentid]); |
||||
|
} |
||||
|
$existinglog->close(); |
||||
|
mtrace($updated . " session status updated"); |
||||
|
|
||||
|
$newlog = new \stdClass(); |
||||
|
$newlog->statusid = $setunmarked; |
||||
|
$newlog->timetaken = time(); |
||||
|
$newlog->takenby = 0; |
||||
|
$newlog->sessionid = $session->id; |
||||
|
$newlog->remarks = get_string('autorecorded', 'attendance'); |
||||
|
$newlog->statusset = implode(',', array_keys( (array)$att->get_statuses())); |
||||
|
|
||||
|
$added = 0; |
||||
|
foreach ($users as $user) { |
||||
|
$newlog->studentid = $user->id; |
||||
|
$DB->insert_record('attendance_log', $newlog); |
||||
|
$added++; |
||||
|
$donesomething = true; |
||||
|
} |
||||
|
mtrace($added . " session status inserted"); |
||||
|
|
||||
|
// Update lasttaken time and automarkcompleted for this session. |
||||
|
$session->lasttaken = $newlog->timetaken; |
||||
|
$session->lasttakenby = 0; |
||||
|
$session->automarkcompleted = 1; |
||||
|
$DB->update_record('attendance_sessions', $session); |
||||
|
|
||||
|
if ($donesomething) { |
||||
|
if ($att->grade != 0) { |
||||
|
$att->update_users_grade(array_keys($users)); |
||||
|
} |
||||
|
|
||||
|
$params = array( |
||||
|
'sessionid' => $att->pageparams->sessionid, |
||||
|
'grouptype' => $att->pageparams->grouptype); |
||||
|
$event = \mod_attendance\event\attendance_taken::create(array( |
||||
|
'objectid' => $att->id, |
||||
|
'context' => $att->context, |
||||
|
'other' => $params)); |
||||
|
$event->add_record_snapshot('course_modules', $att->cm); |
||||
|
$event->add_record_snapshot('attendance_sessions', $session); |
||||
|
$event->trigger(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
||||
|
} |
@ -0,0 +1,36 @@ |
|||||
|
<?php |
||||
|
// This file is part of Moodle - http://moodle.org/ |
||||
|
// |
||||
|
// Moodle is free software: you can redistribute it and/or modify |
||||
|
// it under the terms of the GNU General Public License as published by |
||||
|
// the Free Software Foundation, either version 3 of the License, or |
||||
|
// (at your option) any later version. |
||||
|
// |
||||
|
// Moodle is distributed in the hope that it will be useful, |
||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
// GNU General Public License for more details. |
||||
|
// |
||||
|
// You should have received a copy of the GNU General Public License |
||||
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
||||
|
|
||||
|
/** |
||||
|
* Attendance module tasks. |
||||
|
* |
||||
|
* @package mod_attendance |
||||
|
* @copyright 2017 Dan Marsden |
||||
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later |
||||
|
*/ |
||||
|
|
||||
|
defined('MOODLE_INTERNAL') || die(); |
||||
|
|
||||
|
$tasks = array( |
||||
|
array( |
||||
|
'classname' => 'mod_attendance\task\auto_mark', |
||||
|
'blocking' => 0, |
||||
|
'minute' => '8', |
||||
|
'hour' => '*', |
||||
|
'day' => '*', |
||||
|
'dayofweek' => '*', |
||||
|
'month' => '*') |
||||
|
); |
Loading…
Reference in new issue