示例#1
0
 /**
  * Validate that the sync from course role assignment to class instance enrolment works
  */
 public function test_enrolled_course_user_syncstoclass()
 {
     global $CFG, $DB;
     require_once elispm::lib('lib.php');
     // Set up import data.
     $this->load_csv_data();
     // Make sure the context is set up.
     $crsctx = context_course::instance(100);
     // Set up our test role.
     $roleid = create_role('gradedrole', 'gradedrole', 'gradedrole');
     set_config('gradebookroles', $roleid);
     // Create role assignments.
     role_assign($roleid, 100, $crsctx->id);
     // Attempt the sync.
     $sync = new \local_elisprogram\moodle\synchronize();
     $sync->synchronize_moodle_class_grades();
     // Make sure the student record was created.
     $student = student::find();
     $this->assertTrue($student->valid());
     // Make sure the student has the right class id.
     $student = $student->current();
     $this->assertEquals(100, $student->classid);
 }
示例#2
0
 /**
  * Enrol the students associated with the class into the attached Moodle
  * course.
  *
  * @param none
  * @return bool True on success, False otherwise.
  */
 function data_enrol_students()
 {
     if (empty($this->classid) || empty($this->moodlecourseid) || !empty($this->siteconfig) && !file_exists($this->siteconfig)) {
         return false;
     }
     $students = student::find(new field_filter('classid', $this->classid));
     if ($students->valid()) {
         /// At this point we must switch over the other Moodle site's DB config, if needed
         if (!empty($this->siteconfig)) {
             // TBD: implement this in the future if needed in v2
             //$cfgbak = moodle_load_config($this->siteconfig);
         }
         /// This has to be put here in case we have a site config reload.
         $CFG = $GLOBALS['CFG'];
         if (!($context = context_course::instance($this->moodlecourseid))) {
             return false;
         }
         $plugin = enrol_get_plugin('elis');
         $enrol = $plugin->get_or_create_instance($this->_db->get_record('course', array('id' => $this->moodlecourseid)));
         foreach ($students as $student) {
             /// Make sure that a Moodle account exists for this user already.
             $user = $student->users;
             if (!($muser = $user->get_moodleuser())) {
                 if (!($muserid = $user->synchronize_moodle_user(true, true))) {
                     throw new Exception(get_string('errorsynchronizeuser', self::LANG_FILE));
                 }
             } else {
                 $muserid = $muser->id;
             }
             if (!is_enrolled($context, $muserid)) {
                 $plugin->enrol_user($enrol, $muserid, $enrol->roleid, $student->enrolmenttime, $student->endtime);
             }
         }
         /// Reset $CFG object.
         if (!empty($this->siteconfig)) {
             // TBD: implement this in the future if needed in v2
             //moodle_load_config($cfgbak->dirroot . '/config.php');
         }
     }
     $students->close();
     return true;
 }
示例#3
0
 /**
  * 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);
 }