/** * Install function for this plugin * * @return boolean true Returns true to satisfy install procedure */ function xmldb_elisprogram_usetdisppriority_install() { global $CFG; require_once elispm::lib('setup.php'); // Migrate component. $oldcmp = 'pmplugins_userset_display_priority'; $newcmp = 'elisprogram_usetdisppriority'; $upgradestepfuncname = 'elisprogram_usetdisppriority_pre26upgradesteps'; $migrator = new \local_eliscore\install\migration\migrator($oldcmp, $newcmp, $upgradestepfuncname); if ($migrator->old_component_installed() === true) { $migrator->migrate(); } $field = new field(); $field->shortname = USERSET_DISPLAY_PRIORITY_FIELD; $field->name = get_string('display_priority_field_name', 'elisprogram_usetdisppriority'); $field->datatype = 'int'; $category = new field_category(); $category->name = get_string('display_settings_category_name', 'elisprogram_usetdisppriority'); $field = field::ensure_field_exists_for_context_level($field, CONTEXT_ELIS_USERSET, $category); // make sure 'manual' is an owner if (!isset($field->owners['manual'])) { $owner = new field_owner(); $owner->fieldid = $field->id; $owner->plugin = 'manual'; $owner->param_view_capability = ''; $owner->param_edit_capability = ''; $owner->param_control = 'text'; $owner->param_options_source = 'userset_display_priority'; $owner->param_help_file = 'elisprogram_usetdisppriority/display_priority'; $owner->save(); } return true; }
/** * Validate that course description-moodle template course associations * can be created during a course description update action */ public function test_associate_moodle_course_during_course_update() { global $CFG, $DB; require_once $CFG->dirroot . '/course/lib.php'; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/course.class.php'); require_once elispm::lib('data/coursetemplate.class.php'); $coursecategory = new stdClass(); $coursecategory->name = 'testcoursecategoryname'; $coursecategory->id = $DB->insert_record('course_categories', $coursecategory); $templatecourse = new stdClass(); $templatecourse->category = $coursecategory->id; $templatecourse->shortname = 'testcourseshortname'; $templatecourse->fullname = 'testcoursefullname'; $templatecourse = create_course($templatecourse); // Create the course description. $pmcourse = new course(array('name' => 'testcoursename', 'idnumber' => 'testcourseidnumber', 'syllabus' => '')); $pmcourse->save(); // Run the course description update action. $record = new stdClass(); $record->name = 'testcoursename'; $record->idnumber = 'testcourseidnumber'; $record->link = $templatecourse->shortname; $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis'); $importplugin->fslogger = new silent_fslogger(null); $importplugin->course_update($record, 'bogus'); // Validation. $this->assertTrue($DB->record_exists(coursetemplate::TABLE, array('courseid' => $pmcourse->id, 'location' => $templatecourse->id, 'templateclass' => 'moodlecourseurl'))); }
/** * Install function for this plugin * * @return boolean true Returns true to satisfy install procedure */ function xmldb_elisprogram_usetclassify_install() { global $CFG, $DB; require_once elispm::lib('setup.php'); require_once elis::lib('data/customfield.class.php'); require_once elispm::file('plugins/usetclassify/usersetclassification.class.php'); // Migrate component. $oldcmp = 'pmplugins_userset_classification'; $newcmp = 'elisprogram_usetclassify'; $upgradestepfuncname = 'elisprogram_usetclassify_pre26upgradesteps'; $tablechanges = array('crlm_cluster_classification' => 'elisprogram_usetclassify'); $migrator = new \local_eliscore\install\migration\migrator($oldcmp, $newcmp, $upgradestepfuncname, $tablechanges); if ($migrator->old_component_installed() === true) { $migrator->migrate(); } $field = new field(); $field->shortname = USERSET_CLASSIFICATION_FIELD; $field->name = get_string('classification_field_name', 'elisprogram_usetclassify'); $field->datatype = 'char'; $category = new field_category(); $category->name = get_string('classification_category_name', 'elisprogram_usetclassify'); $field = field::ensure_field_exists_for_context_level($field, CONTEXT_ELIS_USERSET, $category); // make sure we're set as owner if (!isset($field->owners['userset_classifications'])) { $owner = new field_owner(); $owner->fieldid = $field->id; $owner->plugin = 'userset_classifications'; $owner->save(); } // make sure 'manual' is an owner if (!isset($field->owners['manual'])) { $owner = new field_owner(); $owner->fieldid = $field->id; $owner->plugin = 'manual'; $owner->param_view_capability = ''; $owner->param_edit_capability = 'moodle/user:update'; $owner->param_control = 'menu'; $owner->param_options_source = 'userset_classifications'; $owner->param_help_file = 'elisprogram_usetclassify/cluster_classification'; $owner->save(); } // make sure we have a default value set if (!field_data::get_for_context_and_field(NULL, $field)) { field_data::set_for_context_and_field(NULL, $field, 'regular'); } $regclassify = $DB->get_record(usersetclassification::TABLE, array('shortname' => 'regular')); if (empty($regclassify)) { $default = new usersetclassification(); $default->shortname = 'regular'; $default->name = get_string('cluster', 'local_elisprogram'); $default->param_autoenrol_curricula = 1; $default->param_autoenrol_tracks = 1; $default->save(); } return true; }
/** * Install function for this plugin * * @return boolean true Returns true to satisfy install procedure */ function xmldb_elisprogram_preposttest_install() { global $CFG; require_once elispm::lib('setup.php'); require_once elis::lib('data/customfield.class.php'); // Migrate component. $oldcmp = 'pmplugins_pre_post_test'; $newcmp = 'elisprogram_preposttest'; $upgradestepfuncname = 'elisprogram_preposttest_pre26upgradesteps'; $migrator = new \local_eliscore\install\migration\migrator($oldcmp, $newcmp, $upgradestepfuncname); if ($migrator->old_component_installed() === true) { $migrator->migrate(); } // Pre-test field $field = new field(); $field->shortname = PRE_TEST_FIELD; $field->name = get_string('pre_test_field_name', 'elisprogram_preposttest'); $field->datatype = 'char'; $category = new field_category(); $category->name = get_string('pre_post_test_category_name', 'elisprogram_preposttest'); $field = field::ensure_field_exists_for_context_level($field, CONTEXT_ELIS_COURSE, $category); // make sure 'manual' is an owner if (!isset($field->owners['manual'])) { $owner = new field_owner(); $owner->fieldid = $field->id; $owner->plugin = 'manual'; $owner->param_view_capability = ''; $owner->param_edit_capability = ''; $owner->param_control = 'menu'; $owner->param_options_source = 'learning_objectives'; $owner->param_help_file = 'elisprogram_preposttest/pre_test'; $owner->save(); } // Post-test field $field = new field(); $field->shortname = POST_TEST_FIELD; $field->name = get_string('post_test_field_name', 'elisprogram_preposttest'); $field->datatype = 'char'; $category = new field_category(); $category->name = get_string('pre_post_test_category_name', 'elisprogram_preposttest'); $field = field::ensure_field_exists_for_context_level($field, CONTEXT_ELIS_COURSE, $category); // make sure 'manual' is an owner if (!isset($field->owners['manual'])) { $owner = new field_owner(); $owner->fieldid = $field->id; $owner->plugin = 'manual'; $owner->param_view_capability = ''; $owner->param_edit_capability = ''; $owner->param_control = 'menu'; $owner->param_options_source = 'learning_objectives'; $owner->param_help_file = 'elisprogram_preposttest/post_test'; $owner->save(); } return true; }
/** * Require ELIS dependencies if ELIS is installed, otherwise return false. * @return bool Whether ELIS dependencies were successfully required. */ public static function require_elis_dependencies() { global $CFG; if (file_exists($CFG->dirroot . '/local/elisprogram/lib/setup.php')) { require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/userset.class.php'); return true; } else { return false; } }
/** * Perform initialization that should * be done at the beginning of the export * * @param int $targetstarttime The timestamp representing the theoretical * time when this task was meant to be run * @param int $lastruntime The last time the export was run * (required for incremental scheduled export) */ public function init($targetstarttime = 0, $lastruntime = 0) { global $CFG, $DB; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/user.class.php'); require_once elispm::lib('data/student.class.php'); require_once elispm::lib('data/pmclass.class.php'); require_once elispm::lib('data/course.class.php'); require_once elispm::lib('data/classmoodlecourse.class.php'); // Columns that are always displayed. $columns = array(get_string('header_firstname', 'dhexport_version1'), get_string('header_lastname', 'dhexport_version1'), get_string('header_username', 'dhexport_version1'), get_string('header_useridnumber', 'dhexport_version1'), get_string('header_courseidnumber', 'dhexport_version1'), get_string('header_startdate', 'dhexport_version1'), get_string('header_enddate', 'dhexport_version1'), get_string('header_status', 'dhexport_version1elis'), get_string('header_grade', 'dhexport_version1'), get_string('header_letter', 'dhexport_version1')); // Query parameters. $params = array(); // Track extra SQL and parameters needed for custom fields. $extra_joins = implode(" \n ", rlipexport_version1elis_extrafields::get_extra_joins()); $extra_select = implode(', ', rlipexport_version1elis_extrafields::get_extra_select()); if (!empty($extra_select)) { $extra_select = ', ' . $extra_select; } // Get columns. $columns = array_merge($columns, rlipexport_version1elis_extrafields::get_extra_columns()); // Add passed as completion status requirement. $params[] = student::STUSTATUS_PASSED; // Sql time condition. $time_condition = ''; // Determine if we're in incremental or non-incremental mode. $nonincremental = get_config('dhexport_version1elis', 'nonincremental'); if (empty($nonincremental)) { if ($this->manual) { // Manual export incremental mode. // Get string delta. $incrementaldelta = get_config('dhexport_version1elis', 'incrementaldelta'); // Convert to number of seconds. $numsecs = rlip_time_string_to_offset($incrementaldelta); // Add to query parameters. $params[] = time() - $numsecs; // Add query fragment. $time_condition = 'AND stu.completetime >= ?'; } else { // Scheduled export incremental mode. // Set up the query fragment and parameters. $params[] = $lastruntime; $time_condition = 'AND stu.completetime >= ?'; } } // Initialize our recordset to the core data. $sql = "SELECT u.id AS userid,\n u.firstname,\n u.lastname,\n u.username,\n u.idnumber,\n crs.idnumber AS crsidnumber,\n stu.enrolmenttime,\n stu.completetime,\n stu.grade,\n mdlcrs.id AS mdlcrsid\n {$extra_select}\n FROM {" . user::TABLE . "} u\n JOIN {" . student::TABLE . "} stu\n ON u.id = stu.userid\n JOIN {" . pmclass::TABLE . "} cls\n ON stu.classid = cls.id\n JOIN {" . course::TABLE . "} crs\n ON cls.courseid = crs.id\n LEFT JOIN {" . classmoodlecourse::TABLE . "} clsmdl\n ON cls.id = clsmdl.classid\n LEFT JOIN {course} mdlcrs\n ON clsmdl.moodlecourseid = mdlcrs.id\n {$extra_joins}\n WHERE stu.completestatusid = ?\n {$time_condition}\n ORDER BY u.idnumber ASC,\n crs.idnumber ASC,\n stu.completetime ASC,\n stu.grade DESC,\n cls.idnumber ASC,\n u.username ASC"; $this->recordset = $DB->get_recordset_sql($sql, $params); // Write out header. $this->fileplugin->write($columns); // Load string to prevent calling get_string for every record. $this->completestatusstring = get_string('completestatusstring', 'dhexport_version1elis'); }
/** * Require ELIS dependencies if ELIS is installed, otherwise return false. * @return bool Whether ELIS dependencies were successfully required. */ public static function require_elis_dependencies() { global $CFG; if (file_exists($CFG->dirroot . '/local/elisprogram/lib/setup.php')) { require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/user.class.php'); require_once dirname(__FILE__) . '/../../importplugins/version1elis/version1elis.class.php'; return true; } else { return false; } }
/** * Set up permissions that allow the current user to enrol users in tracks */ protected function assign_track_enrol_permissions() { global $CFG, $USER, $DB; require_once elispm::lib('data/user.class.php'); // Set up a test role that allows users to enrol users in tracks. $roleid = create_role('trackenrol', 'trackenrol', 'trackenrol'); $syscontext = context_system::instance(); assign_capability('local/elisprogram:track_enrol', CAP_ALLOW, $roleid, $syscontext->id); // Set up our current user. $activeuser = new user(array('idnumber' => 'activeuser', 'username' => 'activeuser', 'firstname' => 'Activeuser', 'lastname' => 'Activeuser', 'email' => '*****@*****.**', 'country' => 'CA')); $activeuser->save(); $USER = $DB->get_record('user', array('username' => 'activeuser')); // Assign the role to the current user. role_assign($roleid, $USER->id, $syscontext->id); }
/** * Validate that appropriate fields are synched over to Moodle when PM user is enrolled in a class instance during an import. */ public function test_user_sync_on_pm_user_create() { global $CFG, $DB; require_once $CFG->dirroot . '/course/lib.php'; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/classmoodlecourse.class.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'); // Configure the elis enrolment plugin. $roleid = $DB->get_field('role', 'id', array(), IGNORE_MULTIPLE); set_config('roleid', $roleid, 'enrol_elis'); $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(); $category = new stdClass(); $category->name = 'testcategoryname'; $category->id = $DB->insert_record('course_categories', $category); // Create the associated context. context_coursecat::instance($category->id); $mdlcourse = new stdClass(); $mdlcourse->category = $category->id; $mdlcourse->fullname = 'testcoursefullname'; $mdlcourse = create_course($mdlcourse); // Associate class instance to Moodle course. $classmoodlecourse = new classmoodlecourse(array('classid' => $class->id, 'moodlecourseid' => $mdlcourse->id)); $classmoodlecourse->save(); // Run the enrolment create action. $record = new stdClass(); $record->context = 'class_testclassidnumber'; $record->user_username = '******'; $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis'); $importplugin->fslogger = new silent_fslogger(null); $importplugin->class_enrolment_create($record, 'bogus', 'testclassidnumber'); // Validate the enrolment. $enrolid = $DB->get_field('enrol', 'id', array('enrol' => 'elis', 'courseid' => $mdlcourse->id)); $this->assertNotEquals(false, $enrolid); $mdluserid = $DB->get_field('user', 'id', array('username' => 'testuserusername')); $this->assertNotEquals(false, $mdluserid); $this->assertTrue($DB->record_exists('user_enrolments', array('enrolid' => $enrolid, 'userid' => $mdluserid))); // Validate the role assignment. $mdlcoursecontext = context_course::instance($mdlcourse->id); $this->assertTrue($DB->record_exists('role_assignments', array('roleid' => $roleid, 'contextid' => $mdlcoursecontext->id, 'userid' => $mdluserid))); }
/** * Set up necessary data * * @param int $numfields The number of custom fields used in auto-association */ private function init_required_data($numfields = 1) { global $CFG, $DB; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elis::file('eliscore/fields/moodleprofile/custom_fields.php'); require_once elis::lib('data/customfield.class.php'); require_once elispm::file('accesslib.php'); require_once elispm::lib('data/userset.class.php'); require_once $CFG->dirroot . '/user/profile/definelib.php'; require_once $CFG->dirroot . '/user/profile/field/checkbox/define.class.php'; // Set up the category only once. $fieldcategory = new field_category(array('name' => 'testcategoryname')); $fieldcategory->save(); // Ste up the target userset only once. $userset = new userset(array('name' => 'testusersetname')); $userset->save(); for ($i = 1; $i <= $numfields; $i++) { // Custom field. $field = new field(array('categoryid' => $fieldcategory->id, 'shortname' => 'testfieldshortname' . $i, 'name' => 'testfieldname' . $i, 'datatype' => 'bool')); $field->save(); // Ensure manual field owner exists for syncing. field_owner::ensure_field_owner_exists($field, 'manual'); $ownerid = $DB->get_field(field_owner::TABLE, 'id', array('fieldid' => $field->id, 'plugin' => 'manual')); $owner = new field_owner($ownerid); $owner->param_control = 'checkbox'; $owner->save(); // Ensure moodle profile field owner exists. field_owner::ensure_field_owner_exists($field, 'moodle_profile'); $DB->execute("UPDATE {" . field_owner::TABLE . "} SET exclude = ?", array(pm_moodle_profile::sync_to_moodle)); // Field context level assocation. $fieldcontextlevel = new field_contextlevel(array('fieldid' => $field->id, 'contextlevel' => CONTEXT_ELIS_USER)); $fieldcontextlevel->save(); // The associated Moodle user profile field. $profiledefinecheckbox = new profile_define_checkbox(); $data = new stdClass(); $data->datatype = 'checkbox'; $data->categoryid = 99999; $data->shortname = 'testfieldshortname' . $i; $data->name = 'testfieldname' . $i; $profiledefinecheckbox->define_save($data); $mfield = $DB->get_record('user_info_field', array('shortname' => 'testfieldshortname' . $i)); // The "cluster-profile" association. $usersetprofile = new userset_profile(array('clusterid' => $userset->id, 'fieldid' => $mfield->id, 'value' => 1)); $usersetprofile->save(); } }
/** * Validate that the enrolment count excludes inactive users when the site is not configured to show inactive users */ public function test_usercountexcludesinactivewhenexcludinginactive() { require_once elispm::lib('lib.php'); // Set up all the data needed for the listing. $this->load_csv_data(); // Disable showing of inactive users. pm_set_config('legacy_show_inactive_users', 0); elis::$config = new elis_config(); // Obtain the listing. $listing = track_assignment_get_listing(1); // Validate the number of rows. $count = 0; foreach ($listing as $entity) { $count++; // Validate the aggregated count in the first row. $this->assertEquals(1, $entity->enrolments); } unset($listing); $this->assertEquals(1, $count); }
/** * Install function for this plugin * * @return boolean true Returns true to satisfy install procedure */ function xmldb_elisprogram_archive_install() { global $CFG; require_once elispm::lib('setup.php'); require_once elis::lib('data/customfield.class.php'); // Migrate component. $oldcmp = 'pmplugins_archive'; $newcmp = 'elisprogram_archive'; $upgradestepfuncname = 'elisprogram_archive_pre26upgradesteps'; $migrator = new \local_eliscore\install\migration\migrator($oldcmp, $newcmp, $upgradestepfuncname); if ($migrator->old_component_installed() === true) { $migrator->migrate(); } // Archive field $field = new field(); $field->shortname = ARCHIVE_FIELD; $field->name = get_string('archive_field_name', 'elisprogram_archive'); $field->datatype = 'bool'; $category = new field_category(); $category->name = get_string('archive_category_name', 'elisprogram_archive'); $field = field::ensure_field_exists_for_context_level($field, CONTEXT_ELIS_PROGRAM, $category); // make sure 'manual' is an owner if (!isset($field->owners['manual'])) { $owner = new field_owner(); $owner->fieldid = $field->id; $owner->plugin = 'manual'; $owner->param_required = 0; $owner->param_view_capability = ''; $owner->param_edit_capability = ''; $owner->param_control = 'checkbox'; $owner->param_options_source = ''; $owner->param_help_file = 'elisprogram_archive/archive_program'; $owner->save(); } $owner_options = array('required' => 0, 'edit_capability' => '', 'view_capability' => '', 'control' => 'checkbox', 'columns' => 30, 'rows' => 10, 'maxlength' => 2048, 'help_file' => 'elisprogram_archive/archive_program'); field_owner::ensure_field_owner_exists($field, 'manual', $owner_options); return true; }
/** * 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); }
/** * Test enrolment functions using an invalid class ID. */ public function test_enrolment_with_invalid_classid() { global $CFG, $DB; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('lib.php'); $this->load_csv_data(); $enrolment = new stdClass(); $enrolment->classid = 1000; // Invalid class ID. $enrolment->userid = 103; $enrolment->enrolmenttime = time(); $enrolment->completetime = 0; $enrolment->endtime = 0; $enrolment->completestatusid = 0; $enrolment->grade = 0; $enrolment->credits = 0.0; $enrolment->locked = 0; // Directly insert the record to bypass 'student' class validation on the classid. $this->assertGreaterThan(0, $DB->insert_record(student::TABLE, $enrolment)); // Attempt to update status before the required learning objective is satisfied. // ELIS-4955 -- This should ignore the bad data and proceed without error. pm_update_enrolment_status(); // Validate that the enrolment is still in progress. $sturecord = new student(100); $this->assertEquals(STUSTATUS_NOTCOMPLETE, $sturecord->completestatusid); $this->assertEquals(0, $sturecord->locked); // Satisfy the required learning objective. $graderecord = new student_grade(1); $graderecord->grade = 80; $graderecord->save(); // Attempt to update status now that the required learning objective is satisfied. pm_update_enrolment_status(); // Validate that the enrolment is passed. $sturecord = new student(100); $this->assertEquals(STUSTATUS_PASSED, $sturecord->completestatusid); $this->assertEquals(1, $sturecord->locked); }
/** * This function looks for course descriptions that issue certificates and students who have met the criteria to receive a * certificate * @return bool This function will always return true as to not interfere with the rest of the cron process. */ function pm_issue_course_certificates() { require_once elispm::lib('certificate.php'); require_once elispm::lib('data/certificateissued.class.php'); global $DB; $status = true; $certuser = null; $certusers = array(); // Find all courses having certificate settings and are enabled. $params = array('entity_type' => CERTIFICATE_ENTITY_TYPE_COURSE, 'disable' => 0); $certcourses = $DB->get_recordset('local_elisprogram_certcfg', $params, '', 'id, entity_id'); if (empty($certcourses)) { return $status; } foreach ($certcourses as $certcoursesetting) { /* Find all users who completed classes and have not already recieved * certificates for those classes */ $subselect = "SELECT * "; $subfrom = "FROM {local_elisprogram_certissued} certissued "; $subwhere = "WHERE certissued.cert_setting_id = :certsettingid AND " . "certissued.cm_userid = clsenrol.userid AND clsenrol.completetime = certissued.timeissued "; $params = array('completestatus' => STUSTATUS_PASSED, 'locked' => 1, 'courseid' => $certcoursesetting->entity_id, 'certsettingid' => $certcoursesetting->id); $select = "SELECT clsenrol.userid, clsenrol.completetime "; $from = "FROM {local_elisprogram_cls} cmclass " . "INNER JOIN {local_elisprogram_cls_enrol} clsenrol ON clsenrol.classid = cmclass.id "; $where = "WHERE clsenrol.completestatusid = :completestatus AND clsenrol.locked = :locked AND " . "cmclass.courseid = :courseid AND " . "NOT EXISTS ({$subselect} {$subfrom} {$subwhere}) ORDER BY clsenrol.userid "; $certusers = $DB->get_recordset_sql($select . $from . $where, $params); $certissueddata = new certificateissued(0); $result = pm_issue_user_certificate($certcoursesetting->id, $certusers, $certissueddata); $certusers->close(); } return $status; }
/** * Validate the various behaviours of the parent field during userset creation * * @param string $inputvalue The parent value specified * @param int $dbvalue The expected parent value stored in the database * @param int $depth The expected userset depth * @dataProvider parent_provider */ public function test_create_elis_userset_respects_parent_field($inputvalue, $dbvalue, $depth) { global $CFG, $DB; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/userset.class.php'); // Set up a parent userset. $parent = new userset(array('name' => 'testparentusersetname')); $parent->save(); // Run the import. $data = array('parent' => $inputvalue); $this->run_core_userset_import($data, true); // Validation. $data['name'] = 'testusersetname'; $data['parent'] = $dbvalue; $data['depth'] = $depth; $this->assertTrue($DB->record_exists(userset::TABLE, $data)); }
/** * Validate that track-class associations can be created during a class instance * update action * * @param mixed $autoenrol The appropriate autoenrol value specified * @param int $dbautoenrol The value expected to be set in the db for autoenrol * @dataProvider autoenrol_provider */ public function test_associate_track_during_class_update($autoenrol, $dbautoenrol) { 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/curriculum.class.php'); require_once elispm::lib('data/curriculumcourse.class.php'); require_once elispm::lib('data/pmclass.class.php'); require_once elispm::lib('data/track.class.php'); // Create the course description. $course = new course(array('name' => 'testcoursename', 'idnumber' => 'testcourseidnumber', 'syllabus' => '')); $course->save(); // Create the class instance. $pmclass = new pmclass(array('courseid' => $course->id, 'idnumber' => 'testclassidnumber')); $pmclass->save(); // Create the curriculum / program. $curriculum = new curriculum(array('idnumber' => 'testcurriculumidnumber')); $curriculum->save(); // Associate the course description to the program. $curriculumcourse = new curriculumcourse(array('curriculumid' => $curriculum->id, 'courseid' => $course->id)); $curriculumcourse->save(); // Create the track. $track = new track(array('curid' => $curriculum->id, 'idnumber' => 'testtrackidnumber')); $track->save(); // Run the class instance update action. $record = new stdClass(); $record->assignment = 'testcourseidnumber'; $record->idnumber = 'testclassidnumber'; $record->track = 'testtrackidnumber'; if ($autoenrol !== null) { $record->autoenrol = $autoenrol; } $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis'); $importplugin->fslogger = new silent_fslogger(null); $importplugin->class_update($record, 'bogus'); // Validation. $classid = $DB->get_field(pmclass::TABLE, 'id', array('idnumber' => 'testclassidnumber')); $this->assertTrue($DB->record_exists(trackassignment::TABLE, array('trackid' => $track->id, 'classid' => $classid, 'autoenrol' => $dbautoenrol))); }
* @copyright (C) 2008-2013 Remote Learner.net Inc http://www.remote-learner.net * */ /** * Generates a PDF certificate corresponding to a particular curriculum assignment. */ require_once dirname(__FILE__) . '/../../config.php'; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('deprecatedlib.php'); // cm_get_crlmuserid() require_once elispm::lib('data/user.class.php'); require_once elispm::lib('data/course.class.php'); require_once elispm::lib('data/certificatesettings.class.php'); require_once elispm::lib('data/certificateissued.class.php'); require_once elispm::lib('data/student.class.php'); require_once elispm::lib('data/instructor.class.php'); $ciid = required_param('id', PARAM_INT); // Issued certificate id $csid = required_param('csid', PARAM_INT); // certificate setting id global $USER; $cmuserid = cm_get_crlmuserid($USER->id); $student = new user($cmuserid); $student->load(); if (empty($student->id)) { return get_string('studentnotfound', 'local_elisprogram'); } // Retrieve the certificate settings record $certsettingrec = new certificatesettings($csid); $certsettingrec->load(); // Check if the record exists or if the certificate is disabled
* @author James McQuillan <*****@*****.**> * */ require_once dirname(__FILE__) . '/../../eliscore/test_config.php'; global $CFG; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once dirname(__FILE__) . '/other/deepsight_testlib.php'; require_once elispm::lib('deepsightpage.class.php'); require_once elispm::lib('selectionpage.class.php'); require_once elispm::lib('data/clusterassignment.class.php'); require_once elispm::lib('data/clustercurriculum.class.php'); require_once elispm::lib('data/curriculum.class.php'); require_once elispm::lib('data/curriculumstudent.class.php'); require_once elispm::lib('data/user.class.php'); require_once elispm::lib('data/userset.class.php'); require_once elispm::lib('data/usermoodle.class.php'); /** * Mock userprogram_assigned datatable class to expose protected methods and properties. */ class deepsight_datatable_userprogram_assigned_mock extends deepsight_datatable_userprogram_assigned { /** * Magic function to expose protected properties. * @param string $name The name of the property * @return string|int|bool The value of the property */ public function __get($name) { return isset($this->{$name}) ? $this->{$name} : false; } /**
/** * Validate that export does not respect completion time * * @param int $completiontimeindex The index of the time to use. * @param int $numrows The total number of rows to expect, including the header * @dataProvider completion_time_provider */ public function test_export_respects_completiontime($completiontimeindex, $numrows) { global $CFG, $DB; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/student.class.php'); // The times are provided in the test rather than in the dataprovider as the dataprovider is run at the start // of all tests when tests are run as a group, and the time value can become irrelevant. $times = array(0, 1000000000, time() - 25 * HOURSECS, time() - 23 * HOURSECS, time()); if (!isset($times[$completiontimeindex])) { // Fail the test if someone has added an invalid dataprovider value. $this->assertTrue(false); } else { $completiontime = $times[$completiontimeindex]; } // Data setup. $this->load_csv_data(); $sql = "UPDATE {" . student::TABLE . "} SET completetime = ?"; $params = array($completiontime); $DB->execute($sql, $params); // Validation. $data = $this->get_export_data(); $this->assertEquals($numrows, count($data)); }
* GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @package local_elisprogram * @author Remote-Learner.net Inc * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @copyright (C) 2008-2013 Remote Learner.net Inc http://www.remote-learner.net * */ require_once dirname(__FILE__) . '/../../eliscore/test_config.php'; global $CFG; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; // Data objects. require_once elispm::lib('data/curriculumcourse.class.php'); /** * Test courseprerequisite data object. * Since class isdefined within curriculumcourse.class.php testDataObjectsFieldsAndAssociations.php will not auto test this class. * @group local_elisprogram */ class courseprerequisite_testcase extends elis_database_test { /** * Load initial data from CSVs. */ protected function load_csv_data() { $dataset = $this->createCsvDataSet(array(courseprerequisite::TABLE => elispm::file('tests/fixtures/course_prerequisite.csv'))); $this->loadDataSet($dataset); }
* This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @package local_elisprogram * @author Remote-Learner.net Inc * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @copyright (C) 2013 Remote Learner.net Inc http://www.remote-learner.net * @author James McQuillan <*****@*****.**> * */ require_once elispm::lib('data/clusterassignment.class.php'); /** * An action to assign a user to a program. */ class deepsight_action_programuser_assign extends deepsight_action_confirm { public $label = 'Assign User'; public $icon = 'elisicon-assoc'; /** * Constructor. * @param moodle_database $DB The active database connection. * @param string $name The unique name of the action to use. * @param string $descsingle The description when the confirmation is for a single element. * @param string $descmultiple The description when the confirmation is for the bulk list. */ public function __construct(moodle_database &$DB, $name, $descsingle = '', $descmultiple = '')
/** * Get Curriculum user id for a given Moodle user id. * * @param int $userid the Moodle userid * @uses $DB */ function cm_get_crlmuserid($userid) { global $DB; require_once elispm::lib('data/user.class.php'); $select = 'SELECT cu.id '; $from = 'FROM {user} mu '; $join = 'INNER JOIN {' . user::TABLE . '} cu ON cu.idnumber = mu.idnumber '; $where = 'WHERE mu.id = ? '; return $DB->get_field_sql($select . $from . $join . $where, array($userid)); }
* GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @package local_elisprogram * @author Remote-Learner.net Inc * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @copyright (C) 2008-2013 Remote Learner.net Inc http://www.remote-learner.net * */ defined('MOODLE_INTERNAL') || die; require_once elispm::lib('data/curriculum.class.php'); require_once elispm::lib('managementpage.class.php'); require_once elispm::lib('contexts.php'); require_once elispm::lib('datedelta.class.php'); require_once elispm::file('form/curriculumform.class.php'); require_once elispm::file('curriculumcoursepage.class.php'); require_once elispm::file('curriculumstudentpage.class.php'); require_once elispm::file('clustercurriculumpage.class.php'); require_once elispm::file('rolepage.class.php'); /// The main management page. class curriculumpage extends managementpage { var $pagename = 'cur'; var $section = 'curr'; var $data_class = 'curriculum'; var $form_class = 'cmCurriculaForm'; var $view_columns = array('name', 'description'); static $contexts = array(); static function get_contexts($capability)
/** * Test that a record can be modified, and that the corresponding Moodle * user is modified. */ public function test_canupdaterecordandsynctomoodle() { global $DB; require_once elispm::lib('lib.php'); $this->load_csv_data(); // Read a record. $src = new user(103, null, array(), false, array()); $src->reset_custom_field_list(); // Modify the data. $src->firstname = 'Testuser'; $src->lastname = 'One'; $src->field_sometext = 'boo'; $src->field_sometextfrompm = 'bla'; $src->save(); // Read it back. $retr = new user($src->id, null, array(), false, array()); $this->assertEquals($src->firstname, $retr->firstname); $this->assertEquals($src->lastname, $retr->lastname); // Check the Moodle user. $retr = $DB->get_record('user', array('id' => 100)); profile_load_data($retr); fix_moodle_profile_fields($retr); $this->assertEquals($src->firstname, $retr->firstname); $this->assertEquals($src->lastname, $retr->lastname); // Check custom fields. $result = new moodle_recordset_phpunit_datatable('user_info_data', $DB->get_records('user_info_data', null, '', 'id, userid, fieldid, data')); $dataset = new PHPUnit_Extensions_Database_DataSet_CsvDataSet(); $dataset->addTable('user_info_data', elispm::file('tests/fixtures/user_info_data.csv')); $dataset = new PHPUnit_Extensions_Database_DataSet_ReplacementDataSet($dataset); // Only the second text field should be changed; everything else should be the same. $dataset->addFullReplacement('Second text entry field', 'bla'); $this->assertTablesEqual($dataset->getTable('user_info_data'), $result); }
function do_delete() { // action_delete() require_once elispm::lib('data/user.class.php'); $this->session_selection_deletion(); $users = explode(',', $this->required_param('selectedusers', PARAM_TEXT)); // make sure everything is an int foreach ($users as $key => $val) { $users[$key] = (int) $val; if (empty($users[$key])) { unset($users[$key]); } } foreach ($users as $userid) { $userobj = new user($userid); $userobj->delete(); // TBD: try {} catch () {} ??? } $tmppage = new bulkuserpage(); redirect($tmppage->url, get_string('success_bulk_delete', 'local_elisprogram')); }
* but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @package local_elisprogram * @author Remote-Learner.net Inc * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @copyright (C) 2008-2013 Remote Learner.net Inc http://www.remote-learner.net * */ defined('MOODLE_INTERNAL') || die; require_once elispm::file('form/cmform.class.php'); require_once elispm::lib('lib.php'); /** * the form element for curriculum */ class cmCurriculaForm extends cmform { /** * defines items in the form */ public function definition() { $configData = array('title'); if ($this->_customdata['obj']) { // FIXME: This is probably not be the right place for set_data. Move it. $this->set_data($this->_customdata['obj']); }
/** * Set up data that is needed for testing * * @param boolean $setcustomfielddata Specify whether the userset's custom fields should be set * @param boolean $assignuser Specify whether the user should be directly assigned to the user set * @param boolean $setautoassociatefields Specity whether we should set up fields that allow userset autoassociation */ private function set_up_required_data($setcustomfielddata = true, $assignuser = true, $setautoassociatefields = false) { global $CFG, $DB; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elis::lib('data/customfield.class.php'); require_once elispm::file('accesslib.php'); require_once elispm::file('enrol/userset/moodleprofile/userset_profile.class.php'); require_once elispm::lib('data/clusterassignment.class.php'); require_once elispm::lib('data/user.class.php'); require_once elispm::lib('data/usermoodle.class.php'); require_once elispm::lib('data/userset.class.php'); $fieldcategoryid = $DB->get_field(field_category::TABLE, 'id', array('name' => 'Associated Group')); $this->assertNotEquals(false, $fieldcategoryid); $fieldcategory = new field_category($fieldcategoryid); $fieldcategory->load(); // Set up the test user. $user = new user(array('idnumber' => 'testuseridnumber', 'username' => 'testuserusername', 'firstname' => 'testuserfirstname', 'lastname' => 'testuserlastname', 'email' => '*****@*****.**', 'country' => 'CA')); $user->save(); $user->synchronize_moodle_user(); // We need a system-level role assignment. $roleid = create_role('systemrole', 'systemrole', 'systemrole'); $userid = $DB->get_field('user', 'id', array('username' => 'testuserusername')); $context = context_system::instance(); role_assign($roleid, $userid, $context->id); // Set up the userset. $userset = new userset(); $usersetdata = array('name' => 'testusersetname'); if ($setcustomfielddata) { $usersetdata['field_userset_group'] = 1; $usersetdata['field_userset_groupings'] = 1; } $userset->set_from_data((object) $usersetdata); $userset->save(); if ($setautoassociatefields) { // Set up a file we can use to auto-associate users to a userset. $field = new field(array('categoryid' => $fieldcategory->id, 'shortname' => 'autoassociate', 'name' => 'autoassociate', 'datatype' => 'bool')); $field->save(); // Ensure manual field owner exists for syncing. field_owner::ensure_field_owner_exists($field, 'manual'); $ownerid = $DB->get_field(field_owner::TABLE, 'id', array('fieldid' => $field->id, 'plugin' => 'manual')); $owner = new field_owner($ownerid); $owner->param_control = 'checkbox'; $owner->save(); field_owner::ensure_field_owner_exists($field, 'moodle_profile'); $DB->execute("UPDATE {" . field_owner::TABLE . "} SET exclude = ?", array(pm_moodle_profile::sync_to_moodle)); $fieldcontextlevel = new field_contextlevel(array('fieldid' => $field->id, 'contextlevel' => CONTEXT_ELIS_USER)); $fieldcontextlevel->save(); // The associated Moodle user profile field. require_once $CFG->dirroot . '/user/profile/definelib.php'; require_once $CFG->dirroot . '/user/profile/field/checkbox/define.class.php'; $profiledefinecheckbox = new profile_define_checkbox(); $data = new stdClass(); $data->datatype = 'checkbox'; $data->categoryid = 99999; $data->shortname = 'autoassociate'; $data->name = 'autoassociate'; $profiledefinecheckbox->define_save($data); $mfield = $DB->get_record('user_info_field', array('shortname' => 'autoassociate')); // The "cluster-profile" association. $usersetprofile = new userset_profile(array('clusterid' => $userset->id, 'fieldid' => $mfield->id, 'value' => 1)); $usersetprofile->save(); } if ($assignuser) { // Assign the user to the user set. $clusterassignment = new clusterassignment(array('clusterid' => $userset->id, 'userid' => $user->id, 'plugin' => 'manual')); $clusterassignment->save(); } }
/** * Validate that class instance-moodle course associations can be created during a class instance update action. * * @param string $link The link attribute to use in the import, or 'auto' to auto-create from template. * @dataProvider link_course_provider */ public function test_associate_moodle_course_during_class_update($link) { global $CFG, $DB, $USER; require_once $CFG->dirroot . '/course/lib.php'; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; require_once elispm::lib('data/classmoodlecourse.class.php'); require_once elispm::lib('data/coursetemplate.class.php'); require_once elispm::lib('data/course.class.php'); require_once elispm::lib('data/pmclass.class.php'); // Make sure $USER is set up for backup/restore. $USER->id = $DB->get_field_select('user', 'id', "username != 'guest' AND deleted = 0", array(), IGNORE_MULTIPLE); // Need the moodle/backup:backupcourse capability. $guestroleid = create_role('guestrole', 'guestrole', 'guestrole'); set_config('guestroleid', $guestroleid); set_config('siteguest', ''); $systemcontext = context_system::instance(); $roleid = create_role('testrole', 'testrole', 'testrole'); assign_capability('moodle/backup:backupcourse', CAP_ALLOW, $roleid, $systemcontext->id); role_assign($roleid, $USER->id, $systemcontext->id); $coursecategory = new stdClass(); $coursecategory->name = 'testcoursecategoryname'; $coursecategory->id = $DB->insert_record('course_categories', $coursecategory); $moodlecourse = new stdClass(); $moodlecourse->category = $coursecategory->id; $moodlecourse->shortname = 'testcourseshortname'; $moodlecourse->fullname = 'testcoursefullname'; $moodlecourse = create_course($moodlecourse); $course = new course(array('name' => 'testcoursename', 'idnumber' => 'testcourseidnumber', 'syllabus' => '')); $course->save(); $class = new pmclass(array('courseid' => $course->id, 'idnumber' => 'testclassidnumber')); $class->save(); // Need this for the 'auto' case, at the very least. $coursetemplate = new coursetemplate(array('courseid' => $course->id, 'location' => $moodlecourse->id, 'templateclass' => 'moodlecourseurl')); $coursetemplate->save(); // Run the class instance create action. $record = new stdClass(); $record->idnumber = 'testclassidnumber'; $record->assignment = 'testcourseidnumber'; $record->link = $link; $importplugin = rlip_dataplugin_factory::factory('dhimport_version1elis'); $importplugin->fslogger = new silent_fslogger(null); $importplugin->class_update($record, 'bogus'); // Validation. if ($record->link == 'auto') { $moodlecourseid = $moodlecourse->id + 1; } else { $moodlecourseid = $moodlecourse->id; } $dbautocreated = $record->link == 'auto' ? 1 : 0; $this->assertTrue($DB->record_exists(classmoodlecourse::TABLE, array('classid' => $class->id, 'moodlecourseid' => $moodlecourseid, 'enroltype' => 0, 'enrolplugin' => 'crlm', 'autocreated' => $dbautocreated))); ini_set('max_execution_time', '0'); }
* GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * @package local_elisprogram * @author Remote-Learner.net Inc * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later * @copyright (C) 2013 Remote Learner.net Inc http://www.remote-learner.net * */ require_once dirname(__FILE__) . '/../../eliscore/test_config.php'; global $CFG; require_once $CFG->dirroot . '/local/elisprogram/lib/setup.php'; // Libs. require_once elispm::lib('data/certificatesettings.class.php'); require_once elispm::file('tests/other/datagenerator.php'); /** * PHPUnit test to retrieve a certificate settings record by entity id and type * @group local_elisprogram */ class get_certificate_settings_by_entity_testcase extends elis_database_test { /** * Load PHPUnit test data */ protected function load_csv_data() { $dataset = $this->createCsvDataSet(array(certificatesettings::TABLE => elispm::file('tests/fixtures/certificate_settings.csv'))); $this->loadDataSet($dataset); }