/**
  * Test student save works when $USER object not set
  */
 public function test_student_save_nouserobject()
 {
     global $DB, $USER;
     // Create Moodle course category.
     $crscat = create_course_category((object) array('name' => 'Test Course category', 'idnumber' => 'MCC-1'));
     // Create Moodle course.
     $crsdata = array('category' => $crscat->id, 'fullname' => 'MC-TEST-ELIS-8484', 'shortname' => 'MC-TEST-ELIS-8484', 'idnumber' => 'MC-TEST-ELIS-8484');
     $mdlcrs = new stdClass();
     $mdlcrs->id = $DB->insert_record('course', (object) $crsdata);
     $cddata = array('name' => 'CD-ELIS-8484', 'code' => 'CD-ELIS-8484', 'idnumber' => 'CD-ELIS-8484', 'syllabus' => 'syllabus');
     $cd = new course($cddata);
     $cd->save();
     $ci = new pmclass(array('idnumber' => 'CI-ELIS-8484', 'courseid' => $cd->id, 'moodlecourseid' => $mdlcrs->id, 'autocreate' => 0));
     $ci->save();
     $testuser = new user(array('idnumber' => 'testuserelis8484', 'username' => 'testuserelis8484', 'firstname' => 'Test', 'lastname' => 'User-ELIS8484', 'email' => '*****@*****.**', 'city' => 'Waterloo', 'country' => 'CA'));
     $testuser->save();
     $USER = null;
     $sturec = new stdClass();
     $sturec->userid = $testuser->id;
     $sturec->classid = $ci->id;
     $sturec->grade = 0;
     $sturec->enrolmenttime = time();
     $student = new student($sturec);
     $student->save();
     $this->assertFalse(empty($student));
     if (!empty($student)) {
         $this->assertFalse(empty($student->id));
     }
 }
 /**
  * Save a set of enrolments and LO grades to the database
  * @param array $enrolments Enrolment data to save
  * @param array $grades LO grade data to save
  */
 protected function save_enrolments($enrolments, $grades = array())
 {
     // Enrolments.
     foreach ($enrolments as $enrolment) {
         $student = new student($enrolment);
         $sink = $this->redirectMessages();
         $student->save();
     }
     // LO grades.
     foreach ($grades as $grade) {
         $studentgrade = new student_grade($grade);
         $studentgrade->save();
     }
 }
 /**
  * Method to create test user class enrolment
  * @param int $userid the user DB id
  * @param int $classid the class DB id
  */
 public function create_class_enrolment($userid, $classid)
 {
     // Initialize version1elis importplugin for utility functions.
     $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis');
     $record = new stdClass();
     $record->userid = $userid;
     $record->classid = $classid;
     $record->completestatusid = 0;
     $record->grade = 50;
     $record->credits = 1;
     $record->locked = 0;
     $record->enrolmenttime = $importplugin->parse_date('Jan/10/2013');
     $stu = new student($record);
     $stu->save();
 }
 protected function savepass()
 {
     $required = array("current" => "Current Password", "new" => "New Password");
     foreach ($required as $key => $value) {
         if (!isset($_POST[$key]) || $_POST[$key] == '' || $_POST[$key] == 'select') {
             echo $value . ' is Required<br/>';
             return;
         }
     }
     global $user;
     global $objPDO;
     $student = new student($objPDO, $user->getuserId());
     if (md5($_POST['current']) == $student->getPassword()) {
         $student->setPassword(md5($_POST['new']));
         $student->save();
     } else {
         echo 'The Current Password is Wrong';
         return;
     }
     echo '<meta http-equiv="Refresh" content="0;url=http://localhost/cloud/profile"/>';
 }
 /**
  * Test successful class enrolment deletion.
  */
 public function test_success()
 {
     global $DB;
     $this->give_permissions(array('local/elisprogram:class_enrol'));
     // Initialize version1elis importplugin for utility functions.
     $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis');
     // Create test course and class.
     $datagen = new elis_program_datagenerator($DB);
     $crs = $datagen->create_course(array('idnumber' => 'TestCourse'));
     $cls = $datagen->create_pmclass(array('idnumber' => 'TestClassEnrolmentCreate', 'courseid' => $crs->id));
     $data = array('class_idnumber' => $cls->idnumber, 'user_username' => 'assigninguser', 'user_email' => '*****@*****.**');
     // Create the class enrolment record to delete.
     $userid = $DB->get_field(user::TABLE, 'id', array('username' => 'assigninguser'));
     $stu = new student(array('classid' => $cls->id, 'userid' => $userid));
     $stu->save();
     $response = local_datahub_elis_class_enrolment_delete::class_enrolment_delete($data);
     $this->assertNotEmpty($response);
     $this->assertInternalType('array', $response);
     $this->assertArrayHasKey('messagecode', $response);
     $this->assertArrayHasKey('message', $response);
     $this->assertEquals(get_string('ws_class_enrolment_delete_success_code', 'local_datahub'), $response['messagecode']);
     $this->assertEquals(get_string('ws_class_enrolment_delete_success_msg', 'local_datahub'), $response['message']);
     $this->assertFalse($DB->record_exists(student::TABLE, array('classid' => $cls->id, 'userid' => $userid)));
 }
 /**
  * Validate that the method respects the locked status when run for a
  * specific user
  */
 public function test_methodonlyupdatesunlockedenrolmentsforspecificuserid()
 {
     global $DB;
     $this->load_csv_data();
     // Set up enrolments.
     $this->make_course_enrollable();
     enrol_try_internal_enrol(2, 100, 1);
     enrol_try_internal_enrol(2, 101, 1);
     // Set required PM course grade.
     $pmcourse = new \course(array('id' => 100, 'completion_grade' => 50));
     $pmcourse->save();
     // Set up course grade item.
     $coursegradeitem = \grade_item::fetch_course_item(2);
     $coursegradeitem->grademax = 100;
     $coursegradeitem->needsupdate = false;
     $coursegradeitem->locked = true;
     $coursegradeitem->update();
     // Assign student grades.
     $coursegradegrade = new \grade_grade(array('itemid' => 1, 'userid' => 100, 'finalgrade' => 100));
     $coursegradegrade->insert();
     $coursegradegrade = new \grade_grade(array('itemid' => 1, 'userid' => 101, 'finalgrade' => 100));
     $coursegradegrade->insert();
     // Enrol the student.
     $student = new \student();
     $student->userid = 103;
     $student->classid = 100;
     $student->grade = 0;
     $student->completestatusid = STUSTATUS_NOTCOMPLETE;
     $student->locked = 1;
     $student->save();
     // Call and validate that locked record is not changed.
     $sync = new \local_elisprogram\moodle\synchronize();
     $sync->synchronize_moodle_class_grades(100);
     $this->assert_student_exists(100, 103, 0, STUSTATUS_NOTCOMPLETE, null, null, 1);
     $DB->execute("UPDATE {" . \student::TABLE . "} SET locked = 0");
     // Call and validate that unlocked record is changed.
     $sync = new \local_elisprogram\moodle\synchronize();
     $sync->synchronize_moodle_class_grades(100);
     // Validate count.
     $count = $DB->count_records(\student::TABLE, array('completestatusid' => STUSTATUS_PASSED));
     $this->assertEquals(1, $count);
     // NOTE: this method does not lock enrolments.
     $this->assert_student_exists(100, 103, 100, STUSTATUS_PASSED, null, null, 0);
 }
 /**
  * Enrol the test user in the provided context
  *
  * @param string $contextlevel The string descriptor of the context level
  * @param string $role The shortname of the import record's role column
  */
 private function create_enrolment($contextlevel, $role)
 {
     global $CFG, $DB;
     require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php';
     switch ($contextlevel) {
         case 'curriculum':
             // Program enrolment.
             require_once elispm::lib('data/curriculumstudent.class.php');
             $data = array('curriculumid' => 1, 'userid' => 1);
             $curriculumstudent = new curriculumstudent($data);
             $curriculumstudent->save();
             break;
         case 'track':
             // Track enrolment.
             require_once elispm::lib('data/usertrack.class.php');
             $data = array('trackid' => 1, 'userid' => 1);
             $usertrack = new usertrack($data);
             $usertrack->save();
             break;
         case 'cluster':
             // User set enrolment.
             require_once elispm::lib('data/clusterassignment.class.php');
             $data = array('clusterid' => 1, 'userid' => 1);
             $clusterassignment = new clusterassignment($data);
             $clusterassignment->save();
             break;
         case 'class':
             if ($role == 'instructor') {
                 // Class instance instructor enrolment.
                 require_once elispm::lib('data/instructor.class.php');
                 $data = array('classid' => 1, 'userid' => 1);
                 $instructor = new instructor($data);
                 $instructor->save();
             } else {
                 // Class instance student enrolment.
                 require_once elispm::lib('data/student.class.php');
                 $data = array('classid' => 1, 'userid' => 1);
                 $student = new student($data);
                 $student->save();
             }
             break;
         case 'user':
             // Moodle user role assignment.
             $roleid = $DB->get_field('role', 'id', array('shortname' => $role));
             $userid = $DB->get_field('user', 'id', array('idnumber' => 'testuseridnumber'));
             $context = context_user::instance($userid);
             role_assign($roleid, $userid, $context->id);
             break;
         default:
             break;
     }
 }
 /**
  * Validate that the check_for_moodle_courses method deletes the correct set of orphaned associations for a specific user.
  * @param array $associations The list of associations and information regarding whether they should be cleaned up or not.
  * @dataProvider dataprovider_checkformoodlecourses
  */
 public function test_checkformoodlecoursesrespectsuseridparameter($associations)
 {
     global $DB;
     // Set up our classes.
     $this->load_csv_data();
     $student = new student(array('userid' => 103, 'classid' => 103));
     $sink = $this->redirectMessages();
     $student->save();
     // Track which associations should remain.
     $remainingassociations = array();
     foreach ($associations as $association) {
         // Persist the record.
         $record = new classmoodlecourse($association);
         $record->save();
         // Test user is enrolled in class 103, so this one should be deleted.
         if ($association['classid'] != 103) {
             // It should persist after the method is called.
             $remainingassociations[] = $association;
         }
     }
     // Delete orphaned records.
     pmclass::check_for_moodle_courses(103);
     // Validate count.
     $this->assertEquals(count($remainingassociations), $DB->count_records(classmoodlecourse::TABLE));
     // Validate records specifically.
     foreach ($remainingassociations as $remainingassociation) {
         $params = array('classid' => $remainingassociation['classid'], 'moodlecourseid' => $remainingassociation['moodlecourseid']);
         $exists = $DB->record_exists(classmoodlecourse::TABLE, $params);
         $this->assertTrue($exists);
     }
 }
 /**
  * Validate that the pm_update_enrolment_status method respects its userid parameter, i.e. it can run only for a specific user.
  * NOTE: this unit test does not test all cases because that should be specifically tested for $pmclass->update_enrolment_status
  *
  * @param array $enrolments A list of class enrolment records we are processing
  * @param array $classgraded A list of learning objective grades we are processing
  * @dataProvider dataprovider_updatedelegation
  */
 public function test_pmupdateenrolmentstatusrespectsuseridparameter($enrolments, $classgraded)
 {
     global $DB;
     // Necessary data.
     $this->load_csv_data();
     foreach ($enrolments as $key => $enrolment) {
         // Create student enrolment.
         $record = new student($enrolment);
         $record->save();
     }
     foreach ($classgraded as $lograde) {
         // Create learning objective grade.
         $record = new student_grade($lograde);
         $record->save();
     }
     // Pass the appropriate student.
     pm_update_enrolment_status(2);
     // We should have one passed student in the PM class instance, and that student should be the second user.
     $enrolments = $DB->get_records(student::TABLE, array('completestatusid' => STUSTATUS_PASSED));
     $this->assertEquals(1, count($enrolments));
     $enrolment = reset($enrolments);
     $this->assertEquals(100, $enrolment->classid);
     $this->assertEquals(2, $enrolment->userid);
     $this->assertEquals(100, $enrolment->grade);
 }
 /**
  * Validate the "succss" case of the method, i.e. failing students for a specific user id, i.e. can only for a specific user.
  *
  * @param array $associations A list of enrolments / associations to validate against.
  * @dataProvider dataprovider_enrolmentfail
  */
 public function test_pmupdatestudentenrolmentfailsstudentwithspecificuserid($associations)
 {
     global $DB;
     // Prevent messaging emails from being sent.
     set_config('noemailever', true);
     // Necessary data.
     $this->load_csv_data();
     // Track the final data state for validation.
     $expectedassociations = array();
     foreach ($associations as $key => $association) {
         // Create student enrolment.
         $record = new student($association);
         $record->save();
         if ($association['userid'] == 1) {
             // Specific student will be set to failed.
             $expectedassociations[] = $association;
             $expectedassociations[$key]['completestatusid'] = STUSTATUS_FAILED;
             // Hard to reliably test timestamps.
             unset($expectedassociations[$key]['completetime']);
         }
     }
     // Fail specific expired students.
     $this->quiet_pm_update_student_enrolment(1);
     // Validate count.
     $this->assertEquals(count($expectedassociations), $DB->count_records(student::TABLE, array('userid' => 1)));
     // Validate data specifically.
     foreach ($expectedassociations as $expectedassociation) {
         $exists = $DB->record_exists(student::TABLE, $expectedassociation);
         $this->assertTrue($exists);
     }
 }
示例#11
0
 /**
  * Updates resulting enrolments that are auto-created after users are
  * assigned to user sets (specifically user-track assignments, user-program
  * assignments, and class enrolments in a track's default class)
  *
  * Note: This is essentially equivalent to cluster_assigned_handler but
  * runs a fixed number of queries for scalability reasons
  *
  * @param  int  $userid     A specific PM user id to filter on for
  *                          consideration, or all users if zero
  * @param  int  $clusterid  A specific cluster / user set id to filter
  *                          on for consideration, or all users if zero
  */
 static function update_enrolments($userid = 0, $clusterid = 0)
 {
     global $DB;
     require_once elispm::lib('data/usermoodle.class.php');
     // error_log("/local/elisprogram/lib/data/clusterassignment.class.php::update_enrolments({$userid}, {$clusterid})");
     // ELIS-7582
     @set_time_limit(0);
     // convert provided parameters to SQL conditions
     $extraconditions = array();
     $extraparams = array();
     if (!empty($userid)) {
         $users = array($userid);
         $extraconditions[] = 'u.id = ?';
         $extraparams[] = $userid;
     } else {
         $users = clusterassignment::find(new field_filter('clusterid', $clusterid));
     }
     if (!empty($clusterid)) {
         $extraconditions[] = 'clu.clusterid = ?';
         $extraparams[] = $clusterid;
     }
     $extrawhere = '';
     if (!empty($extraconditions)) {
         $extrawhere = ' AND ' . implode(' AND ', $extraconditions);
     }
     //use the current time as the time created and modified for curriculum
     //assignments
     $timenow = time();
     //assign to curricula based on user-cluster and cluster-curriculum
     //associations
     $sql = "INSERT INTO {" . curriculumstudent::TABLE . "}\n                    (userid, curriculumid, timecreated, timemodified)\n                SELECT DISTINCT u.id, clucur.curriculumid, {$timenow}, {$timenow}\n                  FROM {" . clusterassignment::TABLE . "} clu\n                  JOIN {" . user::TABLE . "} u ON u.id = clu.userid\n                  JOIN {" . clustercurriculum::TABLE . "} clucur\n                    ON clucur.clusterid = clu.clusterid\n             LEFT JOIN {" . curriculumstudent::TABLE . "} ca\n                    ON ca.userid = u.id\n                   AND ca.curriculumid = clucur.curriculumid\n                 WHERE ca.curriculumid IS NULL\n                   AND clucur.autoenrol = 1\n                   {$extrawhere}";
     $DB->execute($sql, $extraparams);
     //assign to curricula based on user-cluster and cluster-track
     //associations (assigning a user to a track auto-assigns them to
     //the track's curriculum, track assignment happens below)
     $sql = "INSERT INTO {" . curriculumstudent::TABLE . "}\n                    (userid, curriculumid, timecreated, timemodified)\n                SELECT DISTINCT u.id, trk.curid, {$timenow}, {$timenow}\n                  FROM {" . clusterassignment::TABLE . "} clu\n                  JOIN {" . user::TABLE . "} u\n                    ON u.id = clu.userid\n                  JOIN {" . clustertrack::TABLE . "} clutrk\n                    ON clutrk.clusterid = clu.clusterid\n                  JOIN {" . track::TABLE . "} trk\n                    ON clutrk.trackid = trk.id\n             LEFT JOIN {" . curriculumstudent::TABLE . "} ca\n                    ON ca.userid = u.id\n                   AND ca.curriculumid = trk.curid\n                 WHERE ca.curriculumid IS NULL\n                   AND clutrk.autoenrol = 1\n                   {$extrawhere}";
     $DB->execute($sql, $extraparams);
     //this represents the tracks that users will be assigned to
     //based on user-cluster and cluster-track associations
     //(actual assignment happens below)
     $exists = "EXISTS (SELECT DISTINCT u.id, clutrk.trackid\n                             FROM {" . clusterassignment::TABLE . "} clu\n                             JOIN {" . user::TABLE . "} u\n                               ON u.id = clu.userid\n                             JOIN {" . clustertrack::TABLE . "} clutrk\n                               ON clutrk.clusterid = clu.clusterid\n                        LEFT JOIN {" . usertrack::TABLE . "} ta\n                               ON ta.userid = u.id\n                              AND ta.trackid = clutrk.trackid\n                            WHERE ta.trackid IS NULL\n                              AND clutrk.autoenrol = 1\n                              AND outerta.trackid = clutrk.trackid\n\t                      {$extrawhere})";
     /**
      * Get autoenrollable classes in the track.  Classes are autoenrollable
      * if:
      * - the autoenrol flag is set
      * - it is the only class in that course slot for the track
      */
     // group the classes from the same course together
     // only select the ones that are the only class for that course in
     // the given track, and if the autoenrol flag is set
     $sql = "SELECT outerta.classid, outerta.courseid, trk.curid\n                  FROM {" . trackassignment::TABLE . "} outerta\n                  JOIN {" . track::TABLE . "} trk ON trk.id = outerta.trackid\n                 WHERE {$exists}\n              GROUP BY courseid\n                HAVING COUNT(*) = 1 AND MAX(autoenrol) = 1";
     //go through and assign user(s) to the autoenollable classes
     $classes = $DB->get_records_sql($sql, $extraparams);
     if (!empty($classes)) {
         foreach ($users as $user) {
             $userid = is_object($user) ? $user->userid : $user;
             foreach ($classes as $class) {
                 // check pre-requisites
                 $curcrs = new curriculumcourse(array('courseid' => $class->courseid, 'curriculumid' => $class->curid));
                 if (!$curcrs->prerequisites_satisfied($userid)) {
                     continue;
                 }
                 $now = time();
                 // enrol user in each autoenrolable class
                 $stu_record = new object();
                 $stu_record->userid = $userid;
                 $stu_record->classid = $class->classid;
                 $stu_record->enrolmenttime = $now;
                 $enrolment = new student($stu_record);
                 // catch enrolment limits
                 try {
                     $enrolment->save();
                 } catch (pmclass_enrolment_limit_validation_exception $e) {
                     // autoenrol into waitlist
                     $wait_record = new object();
                     $wait_record->userid = $userid;
                     $wait_record->classid = $class->classid;
                     $wait_record->enrolmenttime = $now;
                     $wait_record->timecreated = $now;
                     $wait_record->position = 0;
                     $wait_list = new waitlist($wait_record);
                     $wait_list->save();
                 } catch (Exception $e) {
                     $param = array('message' => $e->getMessage());
                     if (in_cron()) {
                         mtrace(get_string('record_not_created_reason', 'local_elisprogram', $param));
                     } else {
                         echo cm_error(get_string('record_not_created_reason', 'local_elisprogram', $param));
                     }
                 }
             }
         }
     }
     //assign to tracks based on user-cluster and cluster-track
     //associations
     $sql = "INSERT INTO {" . usertrack::TABLE . "}\n                       (userid, trackid)\n                SELECT DISTINCT u.id, clutrk.trackid\n                  FROM {" . clusterassignment::TABLE . "} clu\n                  JOIN {" . user::TABLE . "} u\n                    ON u.id = clu.userid\n                  JOIN {" . clustertrack::TABLE . "} clutrk\n                    ON clutrk.clusterid = clu.clusterid\n             LEFT JOIN {" . usertrack::TABLE . "} ta\n                    ON ta.userid = u.id\n                   AND ta.trackid = clutrk.trackid\n                 WHERE ta.trackid IS NULL\n                   AND clutrk.autoenrol = 1\n                   {$extrawhere}";
     $DB->execute($sql, $extraparams);
     //update site-level "cluster groups"
     //TODO: make sure all "cluster groups" scenarios are handled here, and look at
     //performance in more detal
     if (!empty($userid) && file_exists(elispm::file('plugins/usetgroups/lib.php'))) {
         require_once elispm::file('plugins/usetgroups/lib.php');
         //need the Moodle user id
         $mdluserid = $DB->get_field(usermoodle::TABLE, 'muserid', array('cuserid' => $userid));
         if ($mdluserid) {
             //find all assignments for this user
             $assignments = $DB->get_recordset(clusterassignment::TABLE, array('userid' => $userid));
             foreach ($assignments as $assignment) {
                 //update site-level group assignments
                 userset_groups_update_site_course($assignment->clusterid, true, $mdluserid);
             }
         }
         //update course-level group assignment
         userset_groups_update_groups(array('mdlusr.cuserid' => $userid));
     }
 }
 $student->semester = '0';
 $student->verband = 'I';
 $student->gruppe = ' ';
 $student->insertamum = date('Y-m-d H:i:s');
 $student->insertvon = $user;
 $lvb = new lehrverband();
 if (!$lvb->exists($student->studiengang_kz, $student->semester, $student->verband, $student->gruppe)) {
     $lvb->studiengang_kz = $student->studiengang_kz;
     $lvb->semester = $student->semester;
     $lvb->verband = $student->verband;
     $lvb->gruppe = $student->gruppe;
     $lvb->bezeichnung = 'Incoming';
     $lvb->aktiv = true;
     $lvb->save(true);
 }
 if ($student->save(true, false)) {
     //StudentLehrverband anlegen
     $studentlehrverband = new student();
     $studentlehrverband->uid = $uid;
     $studentlehrverband->studiensemester_kurzbz = $studiensemester_kurzbz;
     $studentlehrverband->studiengang_kz = $studiengang_kz;
     $studentlehrverband->semester = '0';
     $studentlehrverband->verband = 'I';
     $studentlehrverband->gruppe = ' ';
     $studentlehrverband->insertamum = date('Y-m-d H:i:s');
     $studentlehrverband->insertvon = $user;
     if (!$studentlehrverband->save_studentlehrverband(true)) {
         $error = true;
         $errormsg = 'StudentLehrverband konnte nicht angelegt werden';
     }
 } else {
示例#13
0
 /**
  * Test the autoenrol after course completion function.
  */
 public function test_check_autoenrol_after_course_completion()
 {
     $dataset = $this->createCsvDataSet(array(course::TABLE => elispm::file('tests/fixtures/pmcourse.csv'), pmclass::TABLE => elispm::file('tests/fixtures/pmclass.csv'), user::TABLE => elispm::file('tests/fixtures/pmuser.csv'), student::TABLE => elispm::file('tests/fixtures/student.csv'), waitlist::TABLE => elispm::file('tests/fixtures/waitlist2.csv')));
     $this->loadDataSet($dataset);
     $class = new pmclass(100);
     $class->load();
     $class->maxstudents = 2;
     $class->enrol_from_waitlist = 1;
     $class->save();
     $student = new student(array('userid' => 103, 'classid' => 100));
     $student->completestatusid = STUSTATUS_PASSED;
     $student->save();
     $return = waitlist::check_autoenrol_after_course_completion($student);
     $this->assertTrue($return);
 }
示例#14
0
 /**
  * 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();
     }
 }
示例#15
0
 /**
  * Attempt initial enrolment.
  *
  * This performs an initial attempt at enroling the selected users. This has not yet taken into account the enrolment limit
  * or permissions.
  *
  * @param array $elements An array of elements to perform the action on.
  * @param int $classid The ID of the class we're enrolling into.
  * @param string $enroldata A JSON string containing enrolment data for the users we want to overenrol.
  * @param bool $bulkaction Whether this attempt is a bulk action or not.
  * @return array An array consisting of "result", and optionally "users" and "total", explained below:
  *                   result: Will be "success" if all users were enrolled successfully, or "waitlist", if we have users that
  *                           need to be waitlisted.
  *                   users:  If some users need enrolment limit resolution, this will be present.
  *                           This will either contain an array of arrays like array('userid' => $userid, 'name' => $label),
  *                           or the string 'bulklist', if we're performing a bulk action.
  *                   total:  If we're performing a bulk action, and some users need enrolment limit resolution, this will be
  *                           included, indicating the number of users needed resolution.
  */
 protected function attempt_enrolment($elements, $classid, $enroldata, $bulkaction)
 {
     set_time_limit(0);
     // Enrolment data.
     $enroldata = $this->process_enrolment_data($classid, @json_decode($enroldata));
     if (empty($enroldata)) {
         throw new Exception('Did not receive valid enrolment data.');
     }
     // Attempt enrolment.
     $waitlist = array();
     foreach ($elements as $userid => $label) {
         // Skip invalid userids or users which we dont have permission to modify.
         if (!is_numeric($userid) || !student::can_manage_assoc($userid, $classid)) {
             continue;
         }
         // Build student.
         $sturecord = $enroldata;
         $sturecord['userid'] = $userid;
         $newstu = new student($sturecord);
         $newstu->validation_overrides[] = 'prerequisites';
         if ($newstu->completestatusid != STUSTATUS_NOTCOMPLETE) {
             // User is set to completed, so don't worry about enrolment limit.
             $newstu->validation_overrides[] = 'enrolment_limit';
         }
         // Attempt enrolment.
         try {
             $newstu->save();
             unset($elements[$userid]);
             $this->datatable->bulklist_modify(array(), array($userid));
         } catch (pmclass_enrolment_limit_validation_exception $e) {
             $waitlist[] = array('userid' => $userid, 'name' => $label);
         } catch (Exception $e) {
             $param = array('message' => $e->getMessage());
             throw new Exception(get_string('record_not_created_reason', 'local_elisprogram', $param));
         }
     }
     if ($bulkaction === true) {
         if (!empty($waitlist)) {
             list($bulklistdisplay, $totalusers) = $this->datatable->bulklist_get_display(1);
             return array('result' => 'waitlist', 'users' => 'bulklist', 'total' => $totalusers);
         } else {
             return array('result' => 'success');
         }
     } else {
         return !empty($waitlist) ? array('result' => 'waitlist', 'users' => $waitlist) : array('result' => 'success');
     }
 }
 /**
  * Performs class_enrolment creation
  * @throws moodle_exception If there was an error in passed parameters.
  * @throws data_object_exception If there was an error creating the entity.
  * @param array $data The incoming data parameter.
  * @return array An array of parameters, if successful.
  */
 public static function class_enrolment_create(array $data)
 {
     global $USER, $DB;
     if (static::require_elis_dependencies() !== true) {
         throw new moodle_exception('ws_function_requires_elis', 'local_datahub');
     }
     static $completestatuses = array('not completed' => STUSTATUS_NOTCOMPLETE, 'not_completed' => STUSTATUS_NOTCOMPLETE, 'notcompleted' => STUSTATUS_NOTCOMPLETE, 'failed' => 'STUSTATUS_FAILED', 'passed' => STUSTATUS_PASSED);
     // Parameter validation.
     $params = self::validate_parameters(self::class_enrolment_create_parameters(), array('data' => $data));
     // Context validation.
     $context = context_user::instance($USER->id);
     self::validate_context($context);
     $data = (object) $data;
     // Parse class
     if (empty($data->class_idnumber) || !($classid = $DB->get_field(pmclass::TABLE, 'id', array('idnumber' => $data->class_idnumber)))) {
         throw new data_object_exception('ws_class_enrolment_create_fail_invalid_class', 'local_datahub', '', $data);
     }
     // Capability checking.
     require_capability('local/elisprogram:class_enrol', \local_elisprogram\context\pmclass::instance($classid));
     // Initialize version1elis importplugin for utility functions.
     $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis');
     $userparams = array();
     $userid = $importplugin->get_userid_from_record($data, '', $userparams);
     if ($userid == false) {
         $a = new stdClass();
         if (empty($userparams)) {
             $a->userparams = '{empty}';
         } else {
             $a->userparams = '';
             foreach ($userparams as $userfield => $uservalue) {
                 $subfield = strpos($userfield, '_');
                 $userfield = substr($userfield, $subfield === false ? 0 : $subfield + 1);
                 if (!empty($a->userparams)) {
                     $a->userparams .= ', ';
                 }
                 $a->userparams .= "{$userfield}: '{$uservalue}'";
             }
         }
         throw new data_object_exception('ws_class_enrolment_create_fail_invalid_user', 'local_datahub', '', $a);
     }
     $record = new stdClass();
     $record->userid = $userid;
     $record->classid = $classid;
     $record->completestatusid = STUSTATUS_NOTCOMPLETE;
     if (isset($data->completestatus)) {
         $completestatus = strtolower($data->completestatus);
         if (isset($completestatuses[$completestatus])) {
             $record->completestatusid = $completestatuses[$completestatus];
         } else {
             throw new data_object_exception('ws_class_enrolment_create_fail_invalid_completestatus', 'local_datahub', '', $data);
         }
     }
     $record->grade = isset($data->grade) && is_numeric($data->grade) ? $data->grade : 0;
     $record->credits = isset($data->credits) && is_numeric($data->credits) ? $data->credits : 0;
     $record->locked = !empty($data->locked) ? 1 : 0;
     if (isset($data->enrolmenttime)) {
         $enrolmenttime = $importplugin->parse_date($data->enrolmenttime);
         if (empty($enrolmenttime)) {
             throw new data_object_exception('ws_class_enrolment_create_fail_invalid_enrolmenttime', 'local_datahub', '', $data);
         } else {
             $record->enrolmenttime = $enrolmenttime;
         }
     } else {
         $record->enrolmenttime = rlip_timestamp();
     }
     $record->completetime = 0;
     if (isset($data->completetime)) {
         $completetime = $importplugin->parse_date($data->completetime);
         if (empty($completetime)) {
             throw new data_object_exception('ws_class_enrolment_create_fail_invalid_completetime', 'local_datahub', '', $data);
         } else {
             $record->completetime = $completetime;
         }
     } else {
         if (!empty($record->completestatusid)) {
             $record->completetime = rlip_timestamp();
         }
     }
     $stu = new student($record);
     $stu->save();
     // Respond.
     if (!empty($stu->id)) {
         return array('messagecode' => get_string('ws_class_enrolment_create_success_code', 'local_datahub'), 'message' => get_string('ws_class_enrolment_create_success_msg', 'local_datahub'), 'record' => $stu->to_array());
     } else {
         throw new data_object_exception('ws_class_enrolment_create_fail', 'local_datahub');
     }
 }
 /**
  * Validate that a success message is logged on enrolment delete
  */
 public function testenrolmentdeletelogssuccessmessage()
 {
     global $CFG, $DB;
     require_once $CFG->dirroot . '/local/elisprogram/lib/data/course.class.php';
     require_once $CFG->dirroot . '/local/elisprogram/lib/data/pmclass.class.php';
     require_once $CFG->dirroot . '/local/elisprogram/lib/data/student.class.php';
     require_once $CFG->dirroot . '/local/elisprogram/lib/data/user.class.php';
     $course = new course(array('name' => 'testcoursename', 'idnumber' => 'testcourseidnumber', 'syllabus' => ''));
     $course->save();
     $pmclass = new pmclass(array('courseid' => $course->id, 'idnumber' => 'testclassidnumber'));
     $pmclass->save();
     $user = new user(array('idnumber' => 'testuseridnumber', 'username' => 'testuserusername', 'firstname' => 'testuserfirstname', 'lastname' => 'testuserlastname', 'email' => '*****@*****.**', 'country' => 'CA'));
     $user->save();
     $student = new student(array('classid' => $pmclass->id, 'userid' => $user->id));
     $student->save();
     $record = new stdClass();
     // TODO: consider using fewer fields.
     $record->context = 'class_testclassidnumber';
     $record->user_idnumber = 'testuseridnumber';
     $record->user_username = '******';
     $record->user_email = '*****@*****.**';
     $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis');
     $importplugin->dblogger = new rlip_dblogger_import(false);
     $importplugin->fslogger = new silent_fslogger(null);
     $importplugin->class_enrolment_delete_student($record, 'bogus', 'testclassidnumber');
     $importplugin->dblogger->flush('bogus');
     $expectedmessage = 'All lines from import file bogus were successfully processed.';
     $where = 'statusmessage = ?';
     $exists = $DB->record_exists_select(RLIP_LOG_TABLE, $where, array($expectedmessage));
     $this->assertTrue($exists);
 }
 /**
  * Validate that users can be enrolled from class instances (when assigned as a student)
  *
  * @param string $username A sample user's username, or null if not used in the import
  * @param string $email A sample user's email, or null if not used in the import
  * @param string $idnumber A sample user's idnumber, or null if not used in the import
  * @dataProvider user_identifier_provider
  */
 public function test_elis_user_student_unenrolment_import($actioncreate, $actiondelete, $username, $email, $idnumber)
 {
     global $CFG, $DB;
     require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php';
     require_once elispm::lib('data/course.class.php');
     require_once elispm::lib('data/pmclass.class.php');
     require_once elispm::lib('data/student.class.php');
     require_once elispm::lib('data/user.class.php');
     set_config('noemailever', true);
     $user = new user(array('idnumber' => 'testuseridnumber', 'username' => 'testuserusername', 'firstname' => 'testuserfirstname', 'lastname' => 'testuserlastname', 'email' => '*****@*****.**', 'country' => 'CA'));
     $user->save();
     $course = new course(array('name' => 'testcoursename', 'idnumber' => 'testcourseidnumber', 'syllabus' => ''));
     $course->save();
     $class = new pmclass(array('courseid' => $course->id, 'idnumber' => 'testclassidnumber'));
     $class->save();
     $student = new student(array('userid' => $user->id, 'classid' => $class->id, 'enrolmenttime' => 0));
     $student->save();
     // Validate setup.
     $this->assertTrue($DB->record_exists(student::TABLE, array('userid' => $user->id, 'classid' => $class->id)));
     // Run the student enrolment delete action.
     $record = new stdClass();
     $record->action = $actiondelete;
     $record->context = 'class_testclassidnumber';
     if ($username != null) {
         $record->user_username = $user->username;
     }
     if ($email != null) {
         $record->user_email = $user->email;
     }
     if ($idnumber != null) {
         $record->user_idnumber = $user->idnumber;
     }
     $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis');
     $importplugin->fslogger = new silent_fslogger(null);
     $importplugin->process_record('enrolment', (object) $record, 'bogus');
     // Validation.
     $this->assertEquals(0, $DB->count_records(student::TABLE));
 }
示例#19
0
文件: lib.php 项目: jamesmcq/elis
 /**
  * When a role is selected from the sync configuration, create class
  * enrolments for the specified role assignments.
  */
 static function student_sync_role_set()
 {
     global $DB;
     $roleid = get_config('elisprogram_enrolrolesync', 'student_role');
     if (empty($roleid)) {
         //not configured
         return;
     }
     //include dependencies
     require_once elispm::lib('data/student.class.php');
     // find all class role assignments
     $sql = "SELECT ra.id, cu.id AS userid, ctx.instanceid AS classid\n                  FROM {role_assignments} ra\n                  JOIN {user} mu ON ra.userid = mu.id\n                  JOIN {" . user::TABLE . "} cu ON mu.idnumber = cu.idnumber\n                  JOIN {context} ctx ON ctx.id = ra.contextid\n                  LEFT JOIN {" . student::TABLE . "} stu\n                    ON cu.id = stu.userid\n                    AND ctx.instanceid = stu.classid\n                 WHERE ctx.contextlevel = :contextlevel\n                   AND ra.roleid = :roleid\n                   AND stu.id IS NULL";
     $params = array('contextlevel' => CONTEXT_ELIS_CLASS, 'roleid' => $roleid);
     $studentswanted = $DB->get_recordset_sql($sql, $params);
     $studentswanted = $studentswanted ? $studentswanted : array();
     //iterate and add where needed
     foreach ($studentswanted as $student) {
         unset($student->id);
         $student = new student($student);
         $student->enrolmenttime = time();
         try {
             $student->save();
         } catch (Exception $e) {
             //validation failed
         }
     }
     return true;
 }
示例#20
0
 /**
  * Validate that createorupdate still works when the class idnumber contains
  * an underscore
  */
 public function testeliscreateorupdatesupportsunderscores()
 {
     global $CFG, $DB;
     require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php';
     require_once elispm::lib('data/course.class.php');
     require_once elispm::lib('data/pmclass.class.php');
     require_once elispm::lib('data/student.class.php');
     require_once elispm::lib('data/user.class.php');
     // Set up initial conditions.
     set_config('createorupdate', 1, 'dhimport_version1elis');
     // Create the test course.
     $course = new course(array('name' => 'testcoursename', 'idnumber' => 'testcourseidnumber', 'syllabus' => ''));
     $course->save();
     // Create the test class.
     $class = new pmclass(array('courseid' => $course->id, 'idnumber' => 'testclass_idnumber'));
     $class->save();
     // Create the test user.
     $user = new user(array('username' => 'testuserusername', 'email' => '*****@*****.**', 'idnumber' => 'testuseridnumber', 'firstname' => 'testuserfirstname', 'lastname' => 'testuserlastname', 'country' => 'CA'));
     $user->save();
     // Set up an existing enrolment.
     $student = new student(array('userid' => $user->id, 'classid' => $class->id, 'completestatusid' => student::STUSTATUS_FAILED));
     $student->save();
     // Import the record, with create acting as an update.
     $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis');
     $importplugin->fslogger = new silent_fslogger(null);
     $record = new stdClass();
     $record->action = 'create';
     $record->context = 'class_testclass_idnumber';
     $record->user_idnumber = 'testuseridnumber';
     $record->completestatusid = student::STUSTATUS_PASSED;
     $importplugin->process_record('enrolment', $record, 'bogus');
     // Validation.
     $this->assertEquals(1, $DB->count_records(student::TABLE));
     $params = array('userid' => $user->id, 'classid' => $class->id, 'completestatusid' => student::STUSTATUS_PASSED);
     $exists = $DB->record_exists(student::TABLE, $params);
     $this->assertTrue($exists);
 }
    }
    $studiengang = new studiengang();
    if (!$studiengang->load($student->studiengang_kz)) {
        die('Fehler beim Laden des Studienganges');
    }
    if (!$rechte->isBerechtigt('student/stammdaten', $studiengang->oe_kurzbz, 'su')) {
        die('Sie haben keine Berechtigung fuer diese Aktion');
    }
    $student->matrikelnr = $matrikelnummer;
    $student->semester = $semester;
    $student->verband = $verband;
    $student->gruppe = $gruppe;
    $student->updateamum = date('Y-m-d H:i:s');
    $student->updatevon = $user;
    $student->new = false;
    if ($student->save(null, false)) {
        $msg = '<h3>Daten wurden erfolgreich gespeichert</h3>';
    } else {
        $msg = "<h3>Fehler beim Speichern der Daten: {$student->errormsg}</h3>";
        $error_student_save = true;
    }
}
$person = new person();
if (!$person->load($person_id)) {
    die('Person wurde nicht gefunden');
}
echo "<h2>Details von {$person->vorname} {$person->nachname}</h2>";
echo $msg;
if (!$error_person_save) {
    $anrede = $person->anrede;
    $titelpre = $person->titelpre;
示例#22
0
 /**
  * Test sync_coursegrade method.
  *
  * @dataProvider dataprovider_sync_coursegrade
  * @param array $sturec Array of parameters to create student record.
  * @param array $coursegradeitem Array of parameters to create course grade_item.
  * @param array $coursegradegrade Array of parameters to create course grade_grade.
  * @param array $compelements Array of completion elements for the linked ELIS course/class.
  * @param array $completiongrade The grade a student must exceed to be marked as passed.
  * @param array $credits The number of credits a successful student will receive.
  * @param array $timenow The current timestamp, to enable testing with time.
  * @param array $expectedsyncedstudent Array of parameters we expect on the student grade record.
  */
 public function test_sync_coursegrade($sturec, $coursegradeitem, $coursegradegrade, array $compelements = array(), $completiongrade, $credits, $timenow, $expectedsyncedstudent)
 {
     global $DB;
     $crs = new \course(array('idnumber' => 'CRS1', 'name' => 'Course 1', 'syllabus' => ''));
     $crs->save();
     $cls = new \pmclass(array('courseid' => $crs->id, 'idnumber' => 'CLS1'));
     $cls->save();
     $usr = new \user(array('username' => 'test1', 'idnumber' => 'test2', 'firstname' => 'test', 'lastname' => 'user', 'email' => '*****@*****.**', 'country' => 'CA'));
     $usr->save();
     $sturec['classid'] = $cls->id;
     $sturec['userid'] = $usr->id;
     $sturec = new \student($sturec);
     $sturec->save();
     $sturec = new \student($sturec->id);
     $sturec->load();
     $sturec = $sturec->to_object();
     $musr = $this->getDataGenerator()->create_user();
     $coursegradeitem = new \grade_item($coursegradeitem, false);
     $coursegradeitem->insert();
     $coursegradegrade['userid'] = $musr->id;
     $coursegradegrade['itemid'] = $coursegradeitem->id;
     $coursegradegrade = new \grade_grade($coursegradegrade, false);
     $coursegradegrade->insert();
     foreach ($compelements as $i => $compelement) {
         $compelement['courseid'] = $crs->id;
         $compelements[$i] = new \coursecompletion($compelement);
         $compelements[$i]->save();
     }
     $sync = new \local_elisprogram\moodle\synchronize();
     $sync->sync_coursegrade($sturec, $coursegradeitem, $coursegradegrade, $compelements, $completiongrade, $credits, $timenow);
     $syncedsturec = $DB->get_record(\student::TABLE, array('id' => $sturec->id));
     $expectedrec = array('id' => $sturec->id, 'classid' => (string) $cls->id, 'userid' => (string) $usr->id, 'enrolmenttime' => '0', 'completetime' => 0, 'endtime' => '0', 'completestatusid' => (string) STUSTATUS_NOTCOMPLETE, 'grade' => '0.00000', 'credits' => '0.00', 'locked' => '0');
     $expectedrec = (object) array_merge($expectedrec, $expectedsyncedstudent);
     $this->assertEquals($expectedrec, $syncedsturec);
 }
示例#23
0
 /**
  * Validating that updating a user's enrolment in a class instance triggers the enrolment
  * notification if the status is set to passed
  *
  * @param int $oldcompletestatus The completion status to enrol the user with initially
  * @param int $newcompletestatus The completion status to set during enrolment update
  * @param boolean $expectmessage Whether we expect the notification message to be sent
  * @dataProvider enrolment_completion_on_update_provider
  */
 public function test_class_completion_sends_class_completed_notification_on_enrolment_update($oldcompletestatus, $newcompletestatus, $expectmessage)
 {
     global $CFG, $DB;
     require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php';
     require_once elispm::lib('data/course.class.php');
     require_once elispm::lib('data/pmclass.class.php');
     require_once elispm::lib('data/user.class.php');
     // Force refreshing of configuration.
     elis::$config = new elis_config();
     // Configuration.
     set_config('popup_provider_elis_program_notify_pm_permitted', 1, 'message');
     set_config('email_provider_elis_program_notify_pm_permitted', 1, 'message');
     set_config('notify_classcompleted_user', 1, 'local_elisprogram');
     $message = '%%userenrolname%% has completed the class instance %%classname%%.';
     set_config('notify_classcompleted_message', $message, 'local_elisprogram');
     $this->setAdminUser();
     unset_config('noemailever');
     // Setup.
     $user = new user(array('idnumber' => 'testuseridnumber', 'username' => 'testuserusername', 'firstname' => 'testuserfirstname', 'lastname' => 'testuserlastname', 'email' => '*****@*****.**', 'country' => 'CA'));
     $user->save();
     $course = new course(array('name' => 'testcoursename', 'idnumber' => 'testcourseidnumber', 'syllabus' => ''));
     $course->save();
     $class = new pmclass(array('courseid' => $course->id, 'idnumber' => 'testclassidnumber'));
     $class->save();
     // We need an "existing" enrolment record set up.
     $student = new student(array('userid' => $user->id, 'classid' => $class->id, 'completestatusid' => $oldcompletestatus));
     $sink = $this->redirectEmails();
     $student->save();
     if ($oldcompletestatus !== student::STUSTATUS_PASSED) {
         $this->assertEquals(0, count($sink->get_messages()));
     } else {
         $this->assertEquals(1, count($sink->get_messages()));
     }
     $sink->close();
     $DB->delete_records('message');
     // Run the enrolment update action.
     $record = new stdClass();
     $record->context = 'class_testclassidnumber';
     $record->user_username = '******';
     $record->completestatusid = $newcompletestatus;
     $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis');
     $importplugin->fslogger = new silent_fslogger(null);
     $sink = $this->redirectEmails();
     $importplugin->class_enrolment_update($record, 'bogus', 'testclassidnumber');
     if ($oldcompletestatus !== $newcompletestatus) {
         $this->assertEquals(1, count($sink->get_messages()));
     } else {
         $this->assertEquals(0, count($sink->get_messages()));
     }
     $sink->close();
     // Validation.
     $mdluserid = $DB->get_field('user', 'id', array('username' => 'testuserusername'));
     $expectedmessage = "{$user->firstname} {$user->lastname} has completed the class instance {$course->name}.";
     $like = $DB->sql_like('fullmessagehtml', ':message');
     $select = "useridto = :userid\n                   AND {$like}";
     if ($expectmessage) {
         $this->assertTrue($DB->record_exists_select('message', $select, array('userid' => $mdluserid, 'message' => "{$expectedmessage}%")));
     } else {
         $this->assertFalse($DB->record_exists_select('message', $select, array('userid' => $mdluserid, 'message' => "{$expectedmessage}%")));
     }
 }
 /**
  * Test table doesn't show assigned students or instructors
  * @dataProvider dataprovider_available_doesnt_show_students_instructors
  * @param array $associations An array of arrays of parameters to construct student associations.
  * @param int $tableclassid The ID of the class we're managing.
  * @param array $expectedresults The expected page of results.
  */
 public function test_available_doesnt_show_students_instructors($students, $instructors, $tableclassid, $expectedresults)
 {
     global $USER, $DB, $CFG;
     $userbackup = $USER;
     // Set up permissions.
     $USER = $this->setup_permissions_test();
     $this->give_permission_for_context($USER->id, 'local/elisprogram:assign_class_instructor', context_system::instance());
     // Create associations.
     foreach ($students as $student) {
         $student = new student($student);
         $student->save();
     }
     foreach ($instructors as $instructor) {
         $instructor = new instructor($instructor);
         $instructor->save();
     }
     $table = new deepsight_datatable_instructor_available_mock($DB, 'test', 'http://localhost', 'testuniqid');
     $table->set_classid($tableclassid);
     $actualresults = $table->get_search_results(array(), array(), 0, 20);
     $this->assert_search_results($expectedresults, count($expectedresults), $actualresults);
     // Restore user.
     $USER = $userbackup;
 }
示例#25
0
 /**
  * Enrols a user in a track.
  *
  * @param int $userid The user id
  * @param int $trackid The track id
  */
 public static function enrol($userid, $trackid)
 {
     global $DB;
     // make sure we don't double-enrol
     if ($DB->record_exists(self::TABLE, array('userid' => $userid, 'trackid' => $trackid))) {
         return false;
     }
     $record = new usertrack();
     $record->userid = $userid;
     $record->trackid = $trackid;
     $record->save();
     $user = new user($userid);
     $track = new track($trackid);
     if (!$DB->record_exists(curriculumstudent::TABLE, array('userid' => $userid, 'curriculumid' => $track->curid))) {
         $curstu = new curriculumstudent();
         $curstu->userid = $userid;
         $curstu->curriculumid = $track->curid;
         $curstu->completed = 0;
         $curstu->credits = 0;
         $curstu->locked = 0;
         $curstu->save();
     }
     events_trigger('track_assigned', $record);
     /**
      * Get autoenrollable classes in the track.  Classes are autoenrollable
      * if:
      * - the autoenrol flag is set
      * - it is the only class in that course slot for the track
      */
     $sql = 'SELECT classid, courseid ' . 'FROM {' . trackassignment::TABLE . '} ' . 'WHERE trackid = ? ' . 'GROUP BY courseid ' . 'HAVING COUNT(*) = 1 AND MAX(autoenrol) = 1';
     $params = array($trackid);
     $classes = $DB->get_recordset_sql($sql, $params);
     foreach ($classes as $class) {
         // ELIS-3460: check pre-requisites ...
         $curcrs = new curriculumcourse(array('courseid' => $class->courseid, 'curriculumid' => $track->curid));
         if (!$curcrs->prerequisites_satisfied($userid)) {
             //error_log("/local/elisprogram/lib/data/usertrack.class.php::enrol({$userid}); pre-requisites NOT satisfied for course: {$class->courseid}, curriculum: {$track->curid}");
             continue;
         }
         $now = time();
         // enrol user in each autoenrolable class
         $stu_record = new object();
         $stu_record->userid = $userid;
         $stu_record->classid = $class->classid;
         $stu_record->enrolmenttime = $now;
         $enrolment = new student($stu_record);
         // catch enrolment limits
         try {
             $status = $enrolment->save();
         } catch (pmclass_enrolment_limit_validation_exception $e) {
             // autoenrol into waitlist
             $wait_record = new object();
             $wait_record->userid = $userid;
             $wait_record->classid = $class->classid;
             $wait_record->enrolmenttime = $now;
             $wait_record->timecreated = $now;
             $wait_record->position = 0;
             $wait_list = new waitlist($wait_record);
             $wait_list->save();
             $status = true;
         } catch (Exception $e) {
             $param = array('message' => $e->getMessage());
             echo cm_error(get_string('record_not_created_reason', 'local_elisprogram', $param));
         }
     }
     unset($classes);
     return true;
 }
示例#26
0
 /**
  * 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;
 }
示例#27
0
 function enrol_all_track_users_in_class()
 {
     // find all users who are not enrolled in the class
     // TODO: validate this...
     $sql = "NOT EXISTS (SELECT 'x'\n                                FROM {" . student::TABLE . "} s\n                                WHERE s.classid = ? AND s.userid = {" . usertrack::TABLE . "}.userid)\n                  AND trackid = ?";
     $params = array($this->classid, $this->trackid);
     $users = $this->_db->get_recordset_select(usertrack::TABLE, $sql, $params, 'userid');
     if ($users->valid() === true) {
         // ELIS-7582
         @set_time_limit(0);
         $timenow = time();
         $count = 0;
         $waitlisted = 0;
         $prereq = 0;
         foreach ($users as $user) {
             // enrol user in track
             $enrol = new student();
             $enrol->classid = $this->classid;
             $enrol->userid = $user->userid;
             $enrol->enrolmenttime = $timenow;
             try {
                 $enrol->save();
                 $count++;
             } catch (unsatisfied_prerequisites_exception $ex) {
                 $prereq++;
             } catch (pmclass_enrolment_limit_validation_exception $ex) {
                 // autoenrol into waitlist
                 $wait_record = new stdClass();
                 $wait_record->userid = $user->userid;
                 $wait_record->classid = $this->classid;
                 //$wait_record->enrolmenttime = $timenow;
                 $wait_record->timecreated = $timenow;
                 $wait_record->position = 0;
                 $wait_list = new waitlist($wait_record);
                 $wait_list->save();
                 $waitlisted++;
             }
         }
         print_string('n_users_enrolled', 'local_elisprogram', $count);
         if ($waitlisted) {
             print_string('n_users_waitlisted', 'local_elisprogram', $waitlisted);
         }
         if ($prereq) {
             print_string('n_users_unsatisfied_prereq', 'local_elisprogram', $prereq);
         }
     } else {
         print_string('all_users_already_enrolled', 'local_elisprogram');
     }
     unset($users);
 }
示例#28
0
 /**
  *
  * @global object $CFG
  * @uses $CFG
  * @uses $OUTPUT
  */
 public function enrol()
 {
     global $CFG;
     $class = new pmclass($this->classid);
     // enrol directly in the course
     $student = new student();
     // TBD: new student($this); didn't work!!!
     $student->userid = $this->userid;
     $student->classid = $this->classid;
     $student->enrolmenttime = max(time(), $class->startdate);
     // Disable validation rules for prerequisites and enrolment_limits
     $student->validation_overrides[] = 'prerequisites';
     $student->validation_overrides[] = 'enrolment_limit';
     $courseid = $class->get_moodle_course_id();
     if ($courseid) {
         $course = $this->_db->get_record('course', array('id' => $courseid));
         // check that the elis plugin allows for enrolments from the course
         // catalog -- if not, see if there are other plugins that allow
         // self-enrolment.
         $plugin = enrol_get_plugin('elis');
         $enrol = $plugin->get_or_create_instance($course);
         if (!$enrol->{enrol_elis_plugin::ENROL_FROM_COURSE_CATALOG_DB}) {
             // get course enrolment plugins, and see if any of them allow self-enrolment
             $enrols = enrol_get_plugins(true);
             $enrolinstances = enrol_get_instances($course->id, true);
             foreach ($enrolinstances as $instance) {
                 if (!isset($enrols[$instance->enrol])) {
                     continue;
                 }
                 $form = $enrols[$instance->enrol]->enrol_page_hook($instance);
                 if ($form) {
                     // at least one plugin allows self-enrolment -- send
                     // the user to the course enrolment page, and prevent
                     // automatic enrolment
                     $a = new stdClass();
                     $a->id = $course->id;
                     $a->idnumber = $class->idnumber;
                     $a->wwwroot = $CFG->wwwroot;
                     $subject = get_string('moodleenrol_subj', self::LANG_FILE, $a);
                     $message = get_string('moodleenrol', self::LANG_FILE, $a);
                     $student->no_moodle_enrol = true;
                     break;
                 }
             }
         }
     }
     $student->save();
     // Send notification, if enabled.
     $sendnotification = !empty(elis::$config->local_elisprogram->notify_enroledfromwaitlist_user) ? true : false;
     if ($sendnotification === true) {
         if (!isset($message)) {
             $a = new stdClass();
             $a->idnum = $class->idnumber;
             $subject = get_string('nowenroled', self::LANG_FILE, $a);
             $message = get_string('nowenroled', self::LANG_FILE, $a);
         }
         $cuser = new user($this->userid);
         $cuser->load();
         $from = get_admin();
         notification::notify($message, $cuser, $from);
     }
     $this->delete();
 }
 /**
  * Validate that mappings are applied during the student enrolment delete action
  */
 public function test_mapping_applied_during_student_enrolment_delete()
 {
     global $CFG, $DB;
     require_once $CFG->dirroot . '/local/elisprogram/lib/data/course.class.php';
     require_once $CFG->dirroot . '/local/elisprogram/lib/data/pmclass.class.php';
     require_once $CFG->dirroot . '/local/elisprogram/lib/data/student.class.php';
     $this->init_mapping();
     $userid = $this->create_test_user();
     $course = new course(array('name' => 'testcoursename', 'idnumber' => 'testcourseidnumber', 'syllabus' => ''));
     $course->save();
     $pmclass = new pmclass(array('courseid' => $course->id, 'idnumber' => 'testclassidnumber'));
     $pmclass->save();
     $student = new student(array('classid' => $pmclass->id, 'userid' => $userid));
     $student->save();
     // Run the student enrolment delete action.
     $record = new stdClass();
     $record->customaction = 'delete';
     $record->customcontext = 'class_testclassidnumber';
     $record->customuser_username = '******';
     $record->customuser_email = '*****@*****.**';
     $record->customuser_idnumber = 'testuseridnumber';
     $record->customrole = 'student';
     $this->run_enrolment_import((array) $record);
     // Validation.
     $this->assertEquals(0, $DB->count_records(student::TABLE));
 }
示例#30
0
 function display_savenew()
 {
     // action_savenew()
     global $USER, $CFG, $DB;
     $clsid = cm_get_param('clsid', 0);
     $class = new pmclass($clsid);
     $now = time();
     if (!$class->is_enrollable()) {
         print_error('notenrollable', 'enrol');
         // TBD
     }
     // check if class is full
     if (!empty($class->maxstudents) && student::count_enroled($class->id) >= $class->maxstudents) {
         $form = $this->create_waitlistform($classid);
         $form->display();
         return;
     }
     // call the Moodle enrolment plugin if attached to a Moodle course, and
     // it's not the elis plugin
     //todo: check Moodle enrolment plugins here
     $cuserid = cm_get_crlmuserid($USER->id);
     $sturecord = array();
     $sturecord['classid'] = $class->id;
     $sturecord['userid'] = $cuserid;
     // Set the enrolment time from class startdate if it's in the future or just set
     // current time if class has an associated Moodle course that has already started
     $enrolmenttime = $class->startdate;
     if ($moodlecourseid = moodle_get_course($clsid)) {
         if ($startdate = $DB->get_field('course', 'startdate', array('id' => $moodlecourseid))) {
             $enrolmenttime = $startdate < $now ? $now : $class->startdate;
         }
     }
     $sturecord['enrolmenttime'] = max($now, $enrolmenttime);
     $sturecord['completetime'] = 0;
     $newstu = new student($sturecord);
     $courseid = $class->get_moodle_course_id();
     if ($courseid) {
         $course = $DB->get_record('course', array('id' => $courseid));
         // check that the elis plugin allows for enrolments from the course
         // catalog -- if not, see if there are other plugins that allow
         // self-enrolment.
         $plugin = enrol_get_plugin('elis');
         $enrol = $plugin->get_or_create_instance($course);
         if (!$enrol->{enrol_elis_plugin::ENROL_FROM_COURSE_CATALOG_DB}) {
             // get course enrolment plugins, and see if any of them allow self-enrolment
             $enrols = enrol_get_plugins(true);
             $enrolinstances = enrol_get_instances($course->id, true);
             foreach ($enrolinstances as $instance) {
                 if (!isset($enrols[$instance->enrol])) {
                     continue;
                 }
                 $form = $enrols[$instance->enrol]->enrol_page_hook($instance);
                 if ($form) {
                     // at least one plugin allows self-enrolment -- send
                     // the user to the course enrolment page, and prevent
                     // automatic enrolment
                     $newstu->no_moodle_enrol = true;
                     $newstu->save();
                     redirect("{$CFG->wwwroot}/course/enrol.php?id={$courseid}");
                     return;
                 }
             }
         }
     }
     $newstu->save();
     $tmppage = new coursecatalogpage(array('action' => 'default'));
     redirect($tmppage->url);
 }