/**
  *
  */
 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);
 }
示例#6
0
 /**
  * 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;
 }
示例#7
0
 /**
  * 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');
     }
 }
示例#10
0
/**
 * 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;
}
示例#11
0
 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);
 }