/** * */ function action_updatemultiple() { global $CURMAN; $clsid = $this->required_param('id', PARAM_INT); $users = $this->optional_param('users', array()); foreach ($users as $uid => $user) { $sturecord = array(); $sturecord['id'] = $user['association_id']; $sturecord['classid'] = $clsid; $sturecord['userid'] = $uid; $startyear = $user['startyear']; $startmonth = $user['startmonth']; $startday = $user['startday']; $sturecord['enrolmenttime'] = mktime(0, 0, 0, $startmonth, $startday, $startyear); $endyear = $user['endyear']; $endmonth = $user['endmonth']; $endday = $user['endday']; $sturecord['completetime'] = mktime(0, 0, 0, $endmonth, $endday, $endyear); $sturecord['completestatusid'] = $user['completestatusid']; $sturecord['grade'] = $user['grade']; $sturecord['credits'] = $user['credits']; $sturecord['locked'] = !empty($user['locked']) ? 1 : 0; $stu = new student($sturecord); if ($stu->completestatusid == STUSTATUS_PASSED && $CURMAN->db->get_field(STUTABLE, 'completestatusid', 'id', $stu->id) != STUSTATUS_PASSED) { $stu->complete(); } else { if (($status = $stu->update()) !== true) { echo cm_error('Record not updated. Reason: ' . $status->message); } } // Now once we've done all this, delete the student if we've been asked to if (isset($user['unenrol']) && cmclasspage::can_enrol_into_class($clsid)) { $stu_delete = new student($user['association_id']); if (!$stu_delete->delete()) { echo cm_error('Student "name: ' . cm_fullname($stu->user) . '" not unenrolled.'); } } } $this->action_default(); }
public function get_navigation_default() { $id = $this->required_param('id', PARAM_INT); $classpage = new cmclasspage(array('id' => $id, 'action' => 'view')); return $classpage->get_navigation_view(); }
function can_do_default() { $id = $this->required_param('id', PARAM_INT); $cmclasspage = new cmclasspage(array('id' => $id)); return $cmclasspage->can_do('edit'); }
function can_do_default() { global $USER; $id = $this->required_param('id', PARAM_INT); return cmclasspage::_has_capability('block/curr_admin:viewreports', $id) || instructor::user_is_instructor_of_class(cm_get_crlmuserid($USER->id), $id); }
function action_copycurr() { global $CFG; // TODO: replace print_object messages with notice messages $sesskey = required_param('sesskey', PARAM_TEXT); if (!confirm_sesskey($sesskey)) { print_error('invalidsesskey', 'error', 'index.php'); } $data = (array) data_submitted(); $clusterid = $this->required_param('id', PARAM_INT); if (empty($data)) { notify(get_string('nodatasubmit', 'block_curr_admin'), 'red'); } $targetcluster = new cluster($clusterid); // Retrieve all of the curriculums that need to be copied and assigned $prefixlen = strlen(self::CPY_CURR_PREFIX); foreach ($data as $datakey => $datavalue) { if (0 === strncmp($datakey, self::CPY_CURR_PREFIX, $prefixlen)) { $currid = (int) substr($datakey, $prefixlen); if (!$currid) { continue; } $curr = new curriculum($currid); $options = array('targetcluster' => $targetcluster); if ($this->optional_param(self::CPY_CURR_TRK_PREFIX . $currid, 0, PARAM_INT)) { $options['tracks'] = true; } if ($this->optional_param(self::CPY_CURR_CRS_PREFIX . $currid, 0, PARAM_INT)) { $options['courses'] = true; } if ($this->optional_param(self::CPY_CURR_CLS_PREFIX . $currid, 0, PARAM_INT)) { $options['classes'] = true; } if ($this->optional_param(self::CPY_CURR_TRK_PREFIX . $currid, 0, PARAM_INT)) { $options['tracks'] = true; } $options['moodlecourses'] = $this->optional_param(self::CPY_CURR_MDLCRS_PREFIX . $currid, 'copyalways', PARAM_ALPHA); $rv = $curr->duplicate($options); if (!empty($rv['errors'])) { foreach ($rv['errors'] as $error) { notify($error); } } /** * The following block of code performs any necessary post-processing, * primarily used for copying role assignments */ //we need to handle curricula first in case role assignments //at lower levels become redundant if (!empty($rv['curricula'])) { $curriculum = new stdClass(); $curriculum->id = $rv['curricula'][$curr->id]; curriculumpage::after_cm_entity_add($curriculum); } if (!empty($rv['tracks'])) { foreach ($rv['tracks'] as $trackid) { $track = new stdClass(); $track->id = $trackid; trackpage::after_cm_entity_add($track); } } if (!empty($rv['courses'])) { foreach ($rv['courses'] as $courseid) { $course = new stdClass(); $course->id = $courseid; coursepage::after_cm_entity_add($course); } } if (!empty($rv['classes'])) { foreach ($rv['classes'] as $classid) { $class = new stdClass(); $class->id = $classid; cmclasspage::after_cm_entity_add($class); } } if (!empty($rv['curricula'])) { $newcurr = new curriculum($rv['curricula'][$curr->id]); $curr->newname = $newcurr->name; notify(get_string('clustcpycurr', 'block_curr_admin', $curr), 'notifysuccess'); } } } redirect($CFG->wwwroot . '/curriculum/index.php?id=' . $data['id'] . '&s=clstcur', '', 2); }
/** * Determines whether the current user is allowed to create, edit, and delete associations * between a user and a class * * @param int $userid The id of the user being associated to the class * @param int $classid The id of the class we are associating the user to * * @return boolean True if the current user has the required permissions, otherwise false */ public static function can_manage_assoc($userid, $classid) { global $USER; if (!cmclasspage::can_enrol_into_class($classid)) { //the users who satisfty this condition are a superset of those who can manage associations return false; } else { if (cmclasspage::_has_capability('block/curr_admin:track:enrol', $classid)) { //current user has the direct capability return true; } } //get the context for the "indirect" capability $context = cm_context_set::for_user_with_capability('cluster', 'block/curr_admin:class:enrol_cluster_user', $USER->id); $allowed_clusters = array(); $allowed_clusters = cmclass::get_allowed_clusters($classid); //query to get users associated to at least one enabling cluster $cluster_select = ''; if (empty($allowed_clusters)) { $cluster_select = '0=1'; } else { $cluster_select = 'clusterid IN (' . implode(',', $allowed_clusters) . ')'; } $select = "userid = {$userid} AND {$cluster_select}"; //user just needs to be in one of the possible clusters if (record_exists_select(CLSTUSERTABLE, $select)) { return true; } return false; }
/** * Returns an array of cluster ids that are associated to the supplied class through tracks and * the current user has access to enrol users into * * @param int $clsid The class whose association ids we care about * @return int array The array of accessible cluster ids */ public static function get_allowed_clusters($clsid) { global $USER; $context = cm_context_set::for_user_with_capability('cluster', 'block/curr_admin:class:enrol_cluster_user', $USER->id); $allowed_clusters = array(); if (cmclasspage::_has_capability('block/curr_admin:class:enrol_cluster_user', $clsid)) { global $CURMAN; require_once CURMAN_DIRLOCATION . '/lib/usercluster.class.php'; $cmuserid = cm_get_crlmuserid($USER->id); $userclusters = $CURMAN->db->get_records(CLSTUSERTABLE, 'userid', $cmuserid); foreach ($userclusters as $usercluster) { $allowed_clusters[] = $usercluster->clusterid; } } //we first need to go through tracks to get to clusters $track_listing = new trackassignmentclass(array('classid' => $clsid)); $tracks = $track_listing->get_assigned_tracks(); //iterate over the track ides, which are the keys of the array if (!empty($tracks)) { foreach (array_keys($tracks) as $track) { //get the clusters and check the context against them $clusters = clustertrack::get_clusters($track); $allowed_track_clusters = $context->get_allowed_instances($clusters, 'cluster', 'clusterid'); //append all clusters that are allowed by the available clusters contexts foreach ($allowed_track_clusters as $allowed_track_cluster) { $allowed_clusters[] = $allowed_track_cluster; } } } return $allowed_clusters; }
/** * Takes a record and transforms it into an appropriate format * This method is set up as a hook to be implented by actual report class * * @param stdClass $record The current report record * @param string $export_format The format being used to render the report * @uses $CFG * @return stdClass The reformatted record */ function transform_record($record, $export_format) { //add entity links if ($export_format == table_report::$EXPORT_FORMAT_HTML) { //link curriculum name to its "view" page if the the current record has a curriculum if (!empty($record->curid) && isset($record->curriculumname)) { $page = new curriculumpage(array('id' => $record->curid, 'action' => 'view')); if ($page->can_do()) { $url = $page->get_url(); $record->curriculumname = '<a href="' . $url . '" target="_blank">' . $record->curriculumname . '</a>'; } } else { //non-curriculum course, so use status string with no link $record->curriculumname = get_string('noncurriculumcourse', $this->languagefile); } //link course name to its "view" page $page = new coursepage(array('id' => $record->courseid, 'action' => 'view')); if ($page->can_do()) { $url = $page->get_url(); $record->coursename = '<a href="' . $url . '" target="_blank">' . $record->coursename . '</a>'; } //link class name to its "view" page $page = new cmclasspage(array('id' => $record->classid, 'action' => 'view')); if ($page->can_do()) { $url = $page->get_url(); $record->classidnumber = '<a href="' . $url . '" target="_blank">' . $record->classidnumber . '</a>'; } } //show environment as N/A if not set if (empty($record->envname)) { $record->envname = get_string('na', $this->languagefile); } //format the start date $record->startdate = $this->format_date($record->startdate); //show number of passed and total number of completion elements $record->elementsdisplayed = get_string('compelements_passed', $this->languagefile, $record); //convert status id to a display string if ($record->completestatusid == STUSTATUS_PASSED) { $record->completionstatus = get_string('status_passed', $this->languagefile); } else { if ($record->completestatusid == STUSTATUS_FAILED) { $record->completionstatus = get_string('status_failed', $this->languagefile); } else { if ($record->completestatusid == STUSTATUS_NOTCOMPLETE) { $record->completionstatus = get_string('status_notcomplete', $this->languagefile); } else { $record->completionstatus = get_string('status_notstarted', $this->languagefile); } } } //if not passed, shouldn't have any credits if ($record->completestatusid != STUSTATUS_PASSED) { $record->credits = 0; } //copy result of complex sub-query into simple field $record->creditsdisplayed = $this->format_credits($record->credits); //format the completion time if ($record->completestatusid == STUSTATUS_NOTCOMPLETE) { //not complete, so don't show a completion time $record->completetime = '0'; } //only show a completion time if passed if ($record->completestatusid == STUSTATUS_PASSED || $record->completestatusid == STUSTATUS_FAILED) { $record->completetime = $this->format_date($record->completetime); } else { $record->completetime = get_string('na', $this->languagefile); } //display whether the current record is a student or an instructor assignment if ($record->isinstructor) { $record->classrole = get_string('instructor', $this->languagefile); } else { $record->classrole = get_string('student', $this->languagefile); } //handle custom field default values and display logic $this->transform_custom_field_data($record); return $record; }
function action_default() { global $CURMAN; $id = required_param('id', PARAM_INT); $sort = optional_param('sort', 'clsname', PARAM_ALPHA); $dir = optional_param('dir', 'ASC', PARAM_ALPHA); $page = optional_param('page', 0, PARAM_INT); $perpage = optional_param('perpage', 30, PARAM_INT); // how many per page $namesearch = trim(cm_get_param('search', '')); $alpha = cm_get_param('alpha', ''); $columns = array('clsname' => get_string('class_id_number', 'block_curr_admin'), 'autoenrol' => get_string('auto_enrol', 'block_curr_admin'), 'enrolments' => get_string('enrolments', 'block_curr_admin'), 'buttons' => ''); $items = track_assignment_get_listing($id, $sort, $dir, $page * $perpage, $perpage, $namesearch, $alpha); $numitems = track_assignment_count_records($id, $namesearch, $alpha); $this->print_alpha(); $this->print_search(); if ($numitems > 0) { $this->print_num_items($numitems); $formatters = $this->create_link_formatters(array('clsname'), 'cmclasspage', 'clsid'); $this->print_list_view($items, $columns, $formatters, 'track_classes'); } else { print_string('no_items_matching', 'block_curr_admin'); } if (empty($items) && empty($namesearch) && empty($alpha)) { echo '<div align="center">'; $tmppage = new trackassignmentpage(array('action' => 'autocreate', 'id' => $id)); print_single_button(null, $tmppage->get_moodle_url()->params, get_string('track_autocreate_button', 'block_curr_admin')); echo '</div>'; } $contexts = cmclasspage::get_contexts('block/curr_admin:associate'); // find the classes that are part of a course that is part of a // curriculum that the track belongs to $sql = "SELECT cls.*\n FROM {$CURMAN->db->prefix_table('crlm_track')} trk\n JOIN {$CURMAN->db->prefix_table('crlm_curriculum')} cur ON cur.id = trk.curid\n JOIN {$CURMAN->db->prefix_table('crlm_curriculum_course')} curcrs ON curcrs.curriculumid = cur.id\n JOIN {$CURMAN->db->prefix_table('crlm_class')} cls ON cls.courseid = curcrs.courseid\n WHERE trk.id = {$id} AND " . $contexts->sql_filter_for_context_level('cls.id', 'class'); $classes = $CURMAN->db->get_records_sql($sql); if (empty($classes)) { $sql = "SELECT COUNT(*)\n FROM {$CURMAN->db->prefix_table('crlm_track')} trk\n JOIN {$CURMAN->db->prefix_table('crlm_curriculum')} cur ON cur.id = trk.curid\n JOIN {$CURMAN->db->prefix_table('crlm_curriculum_course')} curcrs ON curcrs.curriculumid = cur.id\n JOIN {$CURMAN->db->prefix_table('crlm_class')} cls ON cls.courseid = curcrs.courseid\n WHERE trk.id = {$id}"; $num_classes = $CURMAN->db->count_records_sql($sql); if (!empty($num_classes)) { // some classes exist, but don't have associate capability on // any of them echo '<div align="center"><br />'; print_string('no_associate_caps_class', 'block_curr_admin'); echo '</div>'; } else { // no curricula at all echo '<div align="center"><br />'; print_string('all_items_assigned', 'block_curr_admin'); echo '</div>'; } } else { $this->print_dropdown($classes, $items, 'trackid', 'clsid', 'add', 'idnumber'); } }
/** * Dynamically loads child menu items for a course entity * * @param int $id The entity id * @param int $parent_cluster_id The last cluster passed going down the curr_admin tree, or 0 if none * @param int $parent_curriculum_id The last curriculum passed going down the curr_admin tree, or 0 if none * @param int $num_block_icons Max number of entries to display * @param string $parent_path Path of parent curriculum elements in the tree * @return menuitem array The appropriate child items */ function block_curr_admin_load_menu_children_course($id, $parent_cluster_id, $parent_curriculum_id, $num_block_icons, $parent_path = '') { global $CFG; // page dependencies require_once $CFG->dirroot . '/curriculum/cmclasspage.class.php'; $result_items = array(); /***************************************** * Course - Class Associations *****************************************/ $class_css_class = block_curr_admin_get_item_css_class('class_instance'); // permissions filter $class_contexts = cmclasspage::get_contexts('block/curr_admin:class:view'); $listing = cmclass_get_listing('crsname', 'asc', 0, $num_block_icons, '', '', $id, false, $class_contexts, $parent_cluster_id); if (!empty($listing)) { foreach ($listing as $item) { $item->clsname = $item->idnumber; $params = array('id' => $item->id, 'action' => 'view'); $result_items[] = block_curr_admin_get_menu_item('cmclass', $item, 'root', $class_css_class, $parent_cluster_id, $parent_curriculum_id, $params, false, $parent_path); } } //summary item $num_records = cmclass_count_records('', '', $id, false, $class_contexts, $parent_cluster_id); if ($num_block_icons < $num_records) { $params = array('action' => 'default', 'id' => $id); //add extra param if appropriate if (!empty($parent_cluster_id)) { $params['parent_clusterid'] = $parent_cluster_id; } $result_items[] = block_curr_admin_get_menu_summary_item('cmclass', $class_css_class, $num_records - $num_block_icons, $params, '', $parent_path); } return $result_items; }
function action_default() { // Get parameters $sort = optional_param('sort', 'crsname', PARAM_ALPHA); $dir = optional_param('dir', 'ASC', PARAM_ALPHA); $page = optional_param('page', 0, PARAM_INT); $perpage = optional_param('perpage', 30, PARAM_INT); // how many per page $namesearch = trim(optional_param('search', '', PARAM_TEXT)); $alpha = optional_param('alpha', '', PARAM_ALPHA); $id = $this->get_cm_id(); //this parameter signifies a required relationship between a class and a track //through a cluster $parent_clusterid = $this->optional_param('parent_clusterid', 0, PARAM_INT); // Define columns $columns = array('crsname' => get_string('class_course', 'block_curr_admin'), 'idnumber' => get_string('class_idnumber', 'block_curr_admin'), 'moodlecourse' => get_string('class_moodle_course', 'block_curr_admin'), 'startdate' => get_string('class_startdate', 'block_curr_admin'), 'enddate' => get_string('class_enddate', 'block_curr_admin'), 'starttime' => get_string('class_starttime', 'block_curr_admin'), 'endtime' => get_string('class_endtime', 'block_curr_admin'), 'maxstudents' => get_string('class_maxstudents', 'block_curr_admin'), 'envname' => get_string('environment', 'block_curr_admin')); $items = cmclass_get_listing($sort, $dir, $page * $perpage, $perpage, $namesearch, $alpha, $id, false, cmclasspage::get_contexts('block/curr_admin:class:view'), $parent_clusterid); $numitems = cmclass_count_records($namesearch, $alpha, $id, false, cmclasspage::get_contexts('block/curr_admin:class:view'), $parent_clusterid); cmclasspage::get_contexts('block/curr_admin:class:edit'); cmclasspage::get_contexts('block/curr_admin:class:delete'); if (!empty($id)) { $coursepage = new coursepage(array('id' => $id)); $coursepage->print_tabs('cmclasspage', array('id' => $id)); } $this->print_list_view($items, $numitems, $columns, $filter = null, $alphaflag = true, $searchflag = true); }