public function delete() { global $CFG; $result = false; $muser = cm_get_moodleuserid($this->id); if (empty($muser) || !is_primary_admin($muser)) { $level = context_level_base::get_custom_context_level('user', 'block_curr_admin'); $result = attendance::delete_for_user($this->id); $result = $result && curriculumstudent::delete_for_user($this->id); $result = $result && instructor::delete_for_user($this->id); $result = $result && student::delete_for_user($this->id); $result = $result && student_grade::delete_for_user($this->id); $result = $result && usertrack::delete_for_user($this->id); $result = $result && usercluster::delete_for_user($this->id); $result = $result && clusterassignment::delete_for_user($this->id); $result = $result && waitlist::delete_for_user($this->id); $result = $result && delete_context($level, $this->id); // Delete Moodle user. if ($muser = get_record('user', 'idnumber', $this->idnumber, 'mnethostid', $CFG->mnet_localhost_id, 'deleted', 0)) { $result = $result && delete_user($muser); } $result = $result && parent::delete(); } return $result; }
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); }
/** * Perform all necessary tasks to remove a student enrolment from the system. */ function delete() { /// Remove any grade records for this enrolment. $result = student_grade::delete_for_user_and_class($this->userid, $this->classid); /// Unenrol them from the Moodle class. if (!empty($this->classid) && !empty($this->userid) && ($moodlecourseid = get_field('crlm_class_moodle', 'moodlecourseid', 'classid', $this->classid)) && ($muserid = cm_get_moodleuserid($this->userid))) { $context = get_context_instance(CONTEXT_COURSE, $moodlecourseid); if ($context && $context->id) { role_unassign(0, $muserid, 0, $context->id); } } $result = $result && $this->data_delete_record(); if ($this->completestatusid == STUSTATUS_NOTCOMPLETE) { $cmclass = new cmclass($this->classid); if (empty($cmclass->maxstudents) || $cmclass->maxstudents > student::count_enroled($cmclass->id)) { $wlst = waitlist::get_next($this->classid); if (!empty($wlst)) { $wlst->enrol(); } } } return $result; }
public function delete() { global $CFG; $muser = $this->get_moodleuser(); if (empty($muser) || !is_primary_admin($muser->id)) { // delete associated data require_once elis::lib('data/data_filter.class.php'); $filter = new field_filter('userid', $this->id); curriculumstudent::delete_records($filter, $this->_db); student::delete_records($filter, $this->_db); student_grade::delete_records($filter, $this->_db); waitlist::delete_records($filter, $this->_db); instructor::delete_records($filter, $this->_db); usertrack::delete_records($filter, $this->_db); clusterassignment::delete_records($filter, $this->_db); //delete association to Moodle user, if applicable require_once elispm::lib('data/usermoodle.class.php'); $filter = new field_filter('cuserid', $this->id); usermoodle::delete_records($filter, $this->_db); // Delete Moodle user. if (!empty($muser)) { delete_user($muser); } parent::delete(); $context = \local_elisprogram\context\user::instance($this->id); $context->delete(); } }
function get_item_display_waitlistsize($column, $class) { require_once CURMAN_DIRLOCATION . '/lib/waitlist.class.php'; return waitlist::count_records($class->id); }
/** * 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; }
function get_item_display_waitlistsize($column, $class) { require_once elispm::lib('data/waitlist.class.php'); return waitlist::count_records($class->id); }
function action_overenrol() { global $CURMAN; $id = $this->required_param('id', PARAM_INT); $recs = explode(',', $this->required_param('selected', PARAM_TEXT)); // make sure everything is an int foreach ($recs as $key => $val) { $recs[$key] = (int) $val; if (empty($recs[$key])) { unset($recs[$key]); } } $result = true; foreach ($recs as $recid) { $waitlistobj = new waitlist($recid); $waitlistobj->enrol(); } $tmppage = new waitlistpage(array('id' => $id)); if ($result) { redirect($tmppage->get_url(), get_string('success_waitlist_overenrol', 'block_curr_admin')); } else { print_error('error_waitlist_overenrol', 'block_curr_admin', $tmppage->get_url()); } }
public function check_autoenrol_after_course_completion($enrolment) { if ($enrolment->completestatusid != STUSTATUS_NOTCOMPLETE) { $cmclass = new cmclass($enrolment->classid); if ((empty($cmclass->maxstudents) || $cmclass->maxstudents > student::count_enroled($cmclass->id)) && !empty($cmclass->enrol_from_waitlist)) { $wlst = waitlist::get_next($enrolment->classid); if (!empty($wlst)) { $wlst->enrol(); } } } return true; }
public static function check_autoenrol_after_course_completion($enrolment) { if ($enrolment->completestatusid != STUSTATUS_NOTCOMPLETE) { $pmclass = new pmclass($enrolment->classid); $pmclass->load(); if ((empty($pmclass->maxstudents) || $pmclass->maxstudents > student::count_enroled($pmclass->id)) && !empty($pmclass->enrol_from_waitlist)) { $wlst = waitlist::get_next($enrolment->classid); if (!empty($wlst)) { $crsid = $pmclass->course->id; foreach ($pmclass->course->curriculumcourse as $curcrs) { if ($curcrs->courseid == $crsid && $curcrs->prerequisites_satisfied($wlst->userid)) { $wlst->enrol(); } } } } } return true; }
/** * Handle a request to resolve the enrolment limit for a class. * * Over-enrols, adds to waitlist, or skips enrolment based on user selection. * * @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 $rawuseractions The JSON string containing the actions we want to perform. This will be an array, indexed by * element ID, with values being "waitlist" for add to waitlist, "overenrol" for overenrol, or * anything else being skip enrolment. If we are performing a bulk enrolment, a "bulk_enrol" key * will be present, which will take precendence. * @param string $enroldata A JSON string containing enrolment data for the users we want to overenrol. * @return array An array consisting of 'result' and 'num_affected', indicating success, and the number of users either enroled, * or added to waitlist, respectively. */ protected function waitlistconfirm($elements, $classid, $rawuseractions, $enroldata) { set_time_limit(0); // Unpack and process incoming desired user actions. // $rawuseractions comes from jQuery's serializeArray function, which gives us an array of arrays, each containing a "name" // and "value" member. after processing here, we will get an array indexed by user ID, with the value being the desired // waitlist action (waitlist, overenrol, skip). if (is_string($rawuseractions)) { $rawuseractions = @json_decode($rawuseractions, true); } if (empty($rawuseractions) || !is_array($rawuseractions)) { $rawuseractions = array(); } $useractions = array(); foreach ($rawuseractions as $param) { if (is_numeric($param['name']) || $param['name'] == 'bulk_action') { $useractions[$param['name']] = $param['value']; } } if (empty($useractions)) { throw new Exception('Did not receive any valid user ids.'); } // Original enrolment data. $enroldata = $this->process_enrolment_data($classid, @json_decode($enroldata)); if (empty($enroldata)) { throw new Exception('Did not receive valid enrolment data.'); } $now = time(); $numaffected = 0; foreach ($elements as $userid) { // Skip invalid userids or users which we dont have permission to modify. if (!is_numeric($userid) || !student::can_manage_assoc($userid, $classid)) { continue; } // Get action. if (isset($useractions['bulk_action'])) { $action = $useractions['bulk_action']; } else { if (isset($useractions[$userid])) { $action = $useractions[$userid]; } else { continue; } } // Perform actions. try { if ($action === 'waitlist') { $waitrecord = new object(); $waitrecord->userid = $userid; $waitrecord->classid = $classid; $waitrecord->timecreated = $now; $waitrecord->timemodified = $now; $waitrecord->position = 0; $waitlist = new waitlist($waitrecord); $status = $waitlist->save(); $numaffected++; } else { if ($action === 'overenrol') { $sturecord = $enroldata; $sturecord['userid'] = $userid; $newstu = new student($sturecord); $newstu->validation_overrides[] = 'prerequisites'; $newstu->validation_overrides[] = 'enrolment_limit'; $status = $newstu->save(); $numaffected++; } } } catch (Exception $e) { $param = array('message' => $e->getMessage()); throw new Exception(get_string('record_not_created_reason', 'local_elisprogram', $param)); } } return array('result' => 'success', 'num_affected' => $numaffected); }
function do_overenrol() { $id = $this->required_param('id', PARAM_INT); $recs = explode(',', $this->required_param('selected', PARAM_TEXT)); $this->session_selection_deletion(); // make sure everything is an int foreach ($recs as $key => $val) { $recs[$key] = (int) $val; if (empty($recs[$key])) { unset($recs[$key]); } } $result = !empty($recs); foreach ($recs as $recid) { $waitlistobj = new waitlist($recid); $waitlistobj->enrol(); } $tmppage = new waitlistpage(array('id' => $id)); if ($result) { redirect($tmppage->url, get_string('success_waitlist_overenrol', self::LANG_FILE)); } else { print_error('error_waitlist_overenrol', self::LANG_FILE, $tmppage->url); } }
/** * 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)); } }
/** * Perform all necessary tasks to remove a student enrolment from the system. */ function delete() { /// Remove any grade records for this enrolment. $result = student_grade::delete_for_user_and_class($this->userid, $this->classid); /// Unenrol them from the Moodle class. if ($moodlecourseid = moodle_get_course($this->classid)) { if (($mcourse = $this->_db->get_record('course', array('id' => $moodlecourseid))) && ($muser = $this->users->get_moodleuser())) { $sql = 'SELECT enrol.* FROM {user_enrolments} enrolments JOIN {enrol} enrol ON enrol.id = enrolments.enrolid WHERE enrol.courseid = ? AND enrolments.userid = ?'; $enrolments = $this->_db->get_recordset_sql($sql, array($moodlecourseid, $muser->id)); foreach ($enrolments as $enrolment) { $plugin = enrol_get_plugin($enrolment->enrol); $plugin->unenrol_user($enrolment, $muser->id); } unset($enrolments); } } parent::delete(); if ($this->completestatusid == STUSTATUS_NOTCOMPLETE) { $pmclass = $this->pmclass; if (empty($pmclass->maxstudents) || $pmclass->maxstudents > static::count_enroled($pmclass->id)) { $wlst = waitlist::get_next($this->classid); if (!empty($wlst)) { $wlst->enrol(); } } } return $result; }
function delete() { $status = true; if (!empty($this->id)) { instructor::delete_for_class($this->id); student::delete_for_class($this->id); trackassignmentclass::delete_for_class($this->id); classmoodlecourse::delete_for_class($this->id); student_grade::delete_for_class($this->id); attendance::delete_for_class($this->id); taginstance::delete_for_class($this->id); waitlist::delete_for_class($this->id); classmoodlecourse::delete_for_class($this->id); $level = context_level_base::get_custom_context_level('class', 'block_curr_admin'); $result = delete_context($level, $this->id); $status = $this->data_delete_record(); } return $status; }
/** * */ public function action_waitlistconfirm() { $id = required_param('userid', PARAM_INT); $form_url = new moodle_url(null, array('s' => $this->pagename, 'section' => $this->section, 'action' => 'waitlistconfirm')); $waitlistform = new waitlistaddform($form_url, array('student_ids' => $id)); if ($data = $waitlistform->get_data()) { $now = time(); foreach ($data->userid as $uid) { if (isset($data->enrol[$uid]) && isset($data->classid[$uid]) && isset($data->enrolmenttime[$uid])) { if ($data->enrol[$uid] == 1) { $wait_record = new object(); $wait_record->userid = $uid; $wait_record->classid = $data->classid[$uid]; $wait_record->enrolmenttime = $data->enrolmenttime[$uid]; $wait_record->timecreated = $now; $wait_record->position = 0; $wait_list = new waitlist($wait_record); $wait_list->add(); } else { if ($data->enrol[$uid] == 2) { $user = new user($uid); $student_data = array(); $student_data['classid'] = $data->classid[$uid]; $student_data['userid'] = $uid; $student_data['enrolmenttime'] = $data->enrolmenttime[$uid]; $student_data['timecreated'] = $now; $student_data['completestatusid'] = STUSTATUS_NOTCOMPLETE; $newstu = new student($student_data); $status = $newstu->add(); if ($status !== true) { if (!empty($status->message)) { echo cm_error(get_string('record_not_created_reason', 'block_curr_admin', $status->message)); } else { echo cm_error(get_string('record_not_created', 'block_curr_admin')); } } } } } } } $this->action_default(); }
/** * 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); }
function pm_course_complete($enrolment) { track::check_autoenrol_after_course_completion($enrolment); waitlist::check_autoenrol_after_course_completion($enrolment); return true; }
public function save() { $isnew = empty($this->id); parent::save(); if (isset($this->track) && is_array($this->track)) { $param['classid'] = $this->id; $param['courseid'] = $this->courseid; foreach ($this->track as $t) { if (trackassignment::exists(array(new field_filter('classid', $this->id), new field_filter('trackid', $t)))) { continue; } $param['trackid'] = $t; $trackassignobj = new trackassignment($param); $trackassignobj->save(); } } if (isset($this->unlink_attached_course) && isset($this->moodlecourseid)) { // process unlink moodle course id request $return = moodle_detach_class($this->id, $this->moodlecourseid); $this->moodlecourseid = 0; } if ($this->moodlecourseid || $this->autocreate) { moodle_attach_class($this->id, $this->moodlecourseid, '', true, true, $this->autocreate); } if (!$isnew) { if (!empty($this->oldmax) && (!$this->maxstudents || $this->oldmax < $this->maxstudents) && ($waiting = waitlist::count_records($this->id)) > 0) { $start = student_count_records($this->id); $max = $this->maxstudents ? $this->maxstudents : $start + $waiting + 1; //error_log("pmclass.class.php::save() oldmax = {$this->oldmax}, start = {$start}, newmax = {$this->maxstudents}, waiting = {$waiting} ... max = {$max}"); for ($i = $start; $i < $max; $i++) { $next_student = waitlist::get_next($this->id); if (empty($next_student)) { break; } $next_student->enrol(); } } } field_data::set_for_context_from_datarecord(CONTEXT_ELIS_CLASS, $this); }