/** * */ function action_updatemultiple() { global $CURMAN; $clsid = $this->required_param('id', PARAM_INT); $users = $this->optional_param('users', array()); foreach ($users as $uid => $user) { $sturecord = array(); $sturecord['id'] = $user['association_id']; $sturecord['classid'] = $clsid; $sturecord['userid'] = $uid; $startyear = $user['startyear']; $startmonth = $user['startmonth']; $startday = $user['startday']; $sturecord['enrolmenttime'] = mktime(0, 0, 0, $startmonth, $startday, $startyear); $endyear = $user['endyear']; $endmonth = $user['endmonth']; $endday = $user['endday']; $sturecord['completetime'] = mktime(0, 0, 0, $endmonth, $endday, $endyear); $sturecord['completestatusid'] = $user['completestatusid']; $sturecord['grade'] = $user['grade']; $sturecord['credits'] = $user['credits']; $sturecord['locked'] = !empty($user['locked']) ? 1 : 0; $stu = new student($sturecord); if ($stu->completestatusid == STUSTATUS_PASSED && $CURMAN->db->get_field(STUTABLE, 'completestatusid', 'id', $stu->id) != STUSTATUS_PASSED) { $stu->complete(); } else { if (($status = $stu->update()) !== true) { echo cm_error('Record not updated. Reason: ' . $status->message); } } // Now once we've done all this, delete the student if we've been asked to if (isset($user['unenrol']) && cmclasspage::can_enrol_into_class($clsid)) { $stu_delete = new student($user['association_id']); if (!$stu_delete->delete()) { echo cm_error('Student "name: ' . cm_fullname($stu->user) . '" not unenrolled.'); } } } $this->action_default(); }
/** * Update grades for this class * * @param array The class grades */ function update_all_class_grades($classgrades = array()) { global $CURMAN; if (isset($this->course) && get_class($this->course) == 'course') { $elements = $this->course->get_completion_elements(); } else { $elements = false; } $timenow = time(); if (!empty($elements)) { // for each student, find out how many required completion elements are // incomplete, and when the last completion element was graded $sql = "SELECT s.*, grades.incomplete, grades.maxtime\n FROM {$CURMAN->db->prefix_table(STUTABLE)} s\n JOIN (SELECT s.userid, COUNT(CASE WHEN grades.id IS NULL AND cc.required = 1 THEN 1\n ELSE NULL END) AS incomplete,\n MAX(timegraded) AS maxtime\n FROM {$CURMAN->db->prefix_table(STUTABLE)} s\n JOIN {$CURMAN->db->prefix_table(CRSCOMPTABLE)} cc\n ON cc.courseid = {$this->courseid}\n LEFT JOIN {$CURMAN->db->prefix_table(CLSGRTABLE)} grades\n ON grades.userid = s.userid\n AND grades.completionid = cc.id\n AND grades.classid = {$this->id}\n AND grades.grade >= cc.completion_grade\n WHERE s.classid = {$this->id} AND s.locked = 0\n GROUP BY s.userid\n ) grades ON grades.userid = s.userid\n WHERE s.classid = {$this->id} AND s.locked = 0"; $rs = get_recordset_sql($sql); if ($rs) { while ($rec = rs_fetch_next_record($rs)) { if ($rec->incomplete == 0 && $rec->grade > 0 && $rec->grade >= $this->course->completion_grade) { $student = new student($rec, $this, null); $student->completestatusid = STUSTATUS_PASSED; $student->completetime = $rec->maxtime; $student->credits = $this->course->credits; $student->locked = 1; $student->complete(); } } } } else { /// We have no completion elements so just make sure the user's grade is at least the /// minimum value required for the course. /// Get all unlocked enrolments $select = "classid = {$this->id} AND locked = 0"; $rs = get_recordset_select(STUTABLE, $select, 'userid'); if ($rs) { while ($rec = rs_fetch_next_record($rs)) { if ($rec->grade > 0 && $rec->grade >= $this->course->completion_grade) { $student = new student($rec, $this, null); $student->completestatusid = STUSTATUS_PASSED; $student->completetime = $timenow; $student->credits = $this->course->credits; $student->locked = 1; $student->complete(); } } } } }
/** * Update a student class instance enrolment * * @param object $record One record of import data * @param string $filename The import file name, used for logging * @param string $idnumber The idnumber of the class instance * * @return boolean true on success, otherwise false */ public function class_enrolment_update_student($record, $filename, $idnumber) { global $CFG, $DB; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/pmclass.class.php'); require_once elispm::lib('data/student.class.php'); if (!($crsid = $DB->get_field(pmclass::TABLE, 'id', array('idnumber' => $idnumber)))) { $this->fslogger->log_failure("instance value of \"{$idnumber}\" does not refer to a valid instance of a class context.", 0, $filename, $this->linenumber, $record, "enrolment"); return false; } if (!$this->validate_class_enrolment_data('update', $record, $filename)) { return false; } //obtain the class id $classid = $DB->get_field(pmclass::TABLE, 'id', array('idnumber' => $idnumber)); //obtain the user id $userid = $this->get_userid_from_record($record, $filename); //update the record $id = $DB->get_field(student::TABLE, 'id', array('classid' => $classid, 'userid' => $userid)); $student = new student($id); //need to call load because saving a student needs the full object for events //and dynamic loading will blow away changes otherwise $student->load(); $student->userid = $userid; //enrolment and completion times if (isset($record->enrolmenttime)) { $student->enrolmenttime = $this->parse_date($record->enrolmenttime); } if (isset($record->completetime)) { $student->completetime = $this->parse_date($record->completetime); } $completestatusid = $this->get_completestatusid($record); //set up a completion status, if set if ($completestatusid !== NULL) { $student->completestatusid = $completestatusid; } if (isset($record->grade)) { $student->grade = $record->grade; } if (isset($record->credits)) { $student->credits = $record->credits; } if (isset($record->locked)) { $student->locked = $record->locked; } //TODO: consider refactoring once ELIS-6546 is resolved if (isset($student->completestatusid) && $student->completestatusid == STUSTATUS_PASSED && $DB->get_field(student::TABLE, 'completestatusid', array('id' => $student->id)) != STUSTATUS_PASSED) { $student->complete(); } else { try { $student->save(); } catch (Exception $e) { // Student save may attempt to sync ELIS user to Moodle. $useridnumber = $student->users->idnumber; $this->fslogger->log_failure("Error creating associated Moodle user for idnumber \"{$useridnumber}\": " . $e->getMessage(), 0, $filename, $this->linenumber, $record, "enrolment"); return false; } } //string to describe the user $user_descriptor = $this->get_user_descriptor($record, false, 'user_'); //log success $success_message = "Student enrolment for user with {$user_descriptor} in class instance \"{$idnumber}\" successfully updated."; $this->fslogger->log_success($success_message, 0, $filename, $this->linenumber); return true; }
/** * Perform an update for a single user/class pair. * * @param int $userid The user ID we're updating. * @param int $classid The class ID we're updating information for. * @param array $enroldata The updated enrolment data. * @param array $learningobjectives The updated learning objective data. */ protected function do_update($userid, $classid, array $enroldata, array $learningobjectives) { global $DB; if (student::can_manage_assoc($userid, $classid) !== true) { throw new Exception('Unauthorized'); } if (!isset($enroldata['id'])) { $associationid = $DB->get_field(student::TABLE, 'id', array('classid' => $classid, 'userid' => $userid)); if (empty($associationid)) { return false; } else { $enroldata['id'] = $associationid; } } $enroldata['userid'] = $userid; $stu = new student($enroldata); if ($stu->completestatusid == STUSTATUS_PASSED && $DB->get_field(student::TABLE, 'completestatusid', array('id' => $stu->id)) != STUSTATUS_PASSED) { $stu->complete(); } else { $status = $stu->save(); } foreach ($learningobjectives as $id => $data) { $graderec = array('userid' => $userid, 'classid' => $classid, 'completionid' => $id); $existingrec = $DB->get_record(student_grade::TABLE, $graderec); if (!empty($existingrec)) { $graderec = (array) $existingrec; } $graderec['timegraded'] = $data['timegraded']; $graderec['grade'] = $data['grade']; $graderec['locked'] = $data['locked']; $sgrade = new student_grade($graderec); $sgrade->save(); } }
/** * Update enrolment status of users enroled in the current class, completing and locking * records where applicable based on class grade and required completion elements * * @param int $pmuserid optional userid to update, default(0) updates all users */ function update_enrolment_status($pmuserid = 0) { //information about which course this belongs to may not have been //loaded due to lazy-loading $this->load(); // if (isset($this->course) && (get_class($this->course) == 'course')) { if (isset($this->courseid)) { $course = new course($this->courseid); $elements = $course->get_completion_elements(); } else { $elements = false; } $timenow = time(); if (!empty($elements) && $elements->valid() === true) { // for each student, find out how many required completion elements are // incomplete, and when the last completion element was graded $sql = 'SELECT s.*, grades.incomplete, grades.maxtime FROM {' . student::TABLE . '} s JOIN (SELECT s.userid, COUNT(CASE WHEN grades.id IS NULL AND cc.required = 1 THEN 1 ELSE NULL END) AS incomplete, MAX(timegraded) AS maxtime FROM {' . student::TABLE . '} s JOIN {' . coursecompletion::TABLE . '} cc ON cc.courseid = :courseid LEFT JOIN {' . student_grade::TABLE . '} grades ON grades.userid = s.userid AND grades.completionid = cc.id AND grades.classid = :joinclassid AND grades.grade >= cc.completion_grade WHERE s.classid = :innerclassid AND s.locked = 0 GROUP BY s.userid ) grades ON grades.userid = s.userid WHERE s.classid = :outerclassid AND s.locked = 0'; $params = array('courseid' => $this->courseid, 'joinclassid' => $this->id, 'innerclassid' => $this->id, 'outerclassid' => $this->id); if ($pmuserid) { $sql .= ' AND s.userid = :userid'; $params['userid'] = $pmuserid; } $rs = $this->_db->get_recordset_sql($sql, $params); foreach ($rs as $rec) { if ($rec->incomplete == 0 && $rec->grade > 0 && $rec->grade >= $this->course->completion_grade) { $student = new student($rec); $student->completestatusid = STUSTATUS_PASSED; $student->completetime = $rec->maxtime; $student->credits = $this->course->credits; $student->locked = 1; $student->complete(); } } } else { /// We have no completion elements so just make sure the user's grade is at least the /// minimum value required for the course. /// Get all unlocked enrolments $stufilters = array(new field_filter('classid', $this->id), new field_filter('locked', 0)); if ($pmuserid) { $stufilters[] = new field_filter('userid', $pmuserid); } $rs = student::find($stufilters); foreach ($rs as $rec) { if ($rec->grade > 0 && $rec->grade >= $this->course->completion_grade) { $rec->completestatusid = STUSTATUS_PASSED; $rec->completetime = $timenow; $rec->credits = $this->course->credits; $rec->locked = 1; $rec->complete(); } } } unset($elements); }