コード例 #1
0
 /**
  *
  */
 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();
 }
コード例 #2
0
 /**
  * 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();
                 }
             }
         }
     }
 }
コード例 #3
0
ファイル: version1elis.class.php プロジェクト: jamesmcq/elis
 /**
  * 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;
 }
コード例 #4
0
ファイル: enroledit.action.php プロジェクト: jamesmcq/elis
 /**
  * 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();
     }
 }
コード例 #5
0
ファイル: pmclass.class.php プロジェクト: jamesmcq/elis
 /**
  * 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);
 }