Merge branch 'wip-mdl-31969' of git://github.com/rajeshtaneja/moodle
authorDamyon Wiese <damyon@moodle.com>
Tue, 9 Apr 2013 06:09:14 +0000 (14:09 +0800)
committerDamyon Wiese <damyon@moodle.com>
Tue, 9 Apr 2013 06:09:14 +0000 (14:09 +0800)
Conflicts:
version.php

21 files changed:
grade/export/grade_export_form.php
grade/export/lib.php
grade/export/ods/grade_export_ods.php
grade/export/ods/index.php
grade/export/txt/grade_export_txt.php
grade/export/txt/index.php
grade/export/xls/grade_export_xls.php
grade/export/xls/index.php
grade/export/xml/index.php
grade/lib.php
grade/report/grader/lib.php
grade/report/grader/preferences_form.php
grade/report/grader/settings.php
grade/report/outcomes/index.php
grade/report/user/index.php
lang/en/grades.php
lang/en/moodle.php
lang/en/role.php
lib/accesslib.php
lib/db/access.php
lib/upgrade.txt

index b21c3f8..282a8d8 100644 (file)
@@ -36,10 +36,17 @@ class grade_export_form extends moodleform {
 
         $mform->addElement('advcheckbox', 'export_feedback', get_string('exportfeedback', 'grades'));
         $mform->setDefault('export_feedback', 0);
-
-        $mform->addElement('advcheckbox', 'export_onlyactive', get_string('exportonlyactive', 'grades'));
-        $mform->setDefault('export_onlyactive', 0);
-        $mform->addHelpButton('export_onlyactive', 'exportonlyactive', 'grades');
+        $coursecontext = context_course::instance($COURSE->id);
+        if (has_capability('moodle/course:viewsuspendedusers', $coursecontext)) {
+            $mform->addElement('advcheckbox', 'export_onlyactive', get_string('exportonlyactive', 'grades'));
+            $mform->setType('export_onlyactive', PARAM_BOOL);
+            $mform->setDefault('export_onlyactive', 1);
+            $mform->addHelpButton('export_onlyactive', 'exportonlyactive', 'grades');
+        } else {
+            $mform->addElement('hidden', 'export_onlyactive', 1);
+            $mform->setType('export_onlyactive', PARAM_BOOL);
+            $mform->setConstant('export_onlyactive', 1);
+        }
 
         $options = array('10'=>10, '20'=>20, '100'=>100, '1000'=>1000, '100000'=>100000);
         $mform->addElement('select', 'previewrows', get_string('previewrows', 'grades'), $options);
index c736b23..0798b37 100644 (file)
@@ -224,6 +224,9 @@ abstract class grade_export {
         foreach ($userprofilefields as $field) {
             echo '<th>' . $field->fullname . '</th>';
         }
+        if (!$this->onlyactive) {
+            echo '<th>'.get_string("suspended")."</th>";
+        }
         foreach ($this->columns as $grade_item) {
             echo '<th>'.$this->format_column_name($grade_item).'</th>';
 
@@ -283,6 +286,10 @@ abstract class grade_export {
                 // @see profile_field_base::display_data().
                 echo '<td>' . format_text($fieldvalue, FORMAT_MOODLE, $formatoptions) . '</td>';
             }
+            if (!$this->onlyactive) {
+                $issuspended = ($user->suspendedenrolment) ? get_string('yes') : '';
+                echo "<td>$issuspended</td>";
+            }
             echo $rowstr;
             echo "</tr>";
 
index d281e6f..1dd953f 100644 (file)
@@ -50,6 +50,9 @@ class grade_export_ods extends grade_export {
             $myxls->write_string(0, $id, $field->fullname);
         }
         $pos = count($profilefields);
+        if (!$this->onlyactive) {
+            $myxls->write_string(0, $pos++, get_string("suspended"));
+        }
         foreach ($this->columns as $grade_item) {
             $myxls->write_string(0, $pos++, $this->format_column_name($grade_item));
 
@@ -76,6 +79,10 @@ class grade_export_ods extends grade_export {
             }
             $j = count($profilefields);
 
+            if (!$this->onlyactive) {
+                $issuspended = ($user->suspendedenrolment) ? get_string('yes') : '';
+                $myxls->write_string($i, $j++, $issuspended);
+            }
             foreach ($userdata->grades as $itemid => $grade) {
                 if ($export_tracking) {
                     $status = $geub->track($grade);
index 5b1c33c..8ddf1eb 100644 (file)
@@ -51,7 +51,8 @@ if ($groupmode == SEPARATEGROUPS and !$currentgroup and !has_capability('moodle/
 
 // process post information
 if ($data = $mform->get_data()) {
-    $export = new grade_export_ods($course, $currentgroup, '', false, false, $data->display, $data->decimals, $data->export_onlyactive, true);
+    $onlyactive = $data->export_onlyactive || !has_capability('moodle/course:viewsuspendedusers', $context);
+    $export = new grade_export_ods($course, $currentgroup, '', false, false, $data->display, $data->decimals, $onlyactive, true);
 
     // print the grades on screen for feedbacks
     $export->process_form($data);
index 0f76af6..08863a7 100644 (file)
@@ -66,6 +66,10 @@ class grade_export_txt extends grade_export {
             $exporttitle[] = $field->fullname;
         }
 
+        if (!$this->onlyactive) {
+            $exporttitle[] = get_string("suspended");
+        }
+
         // Add a feedback column.
         foreach ($this->columns as $grade_item) {
             $exporttitle[] = $this->format_column_name($grade_item);
@@ -90,6 +94,10 @@ class grade_export_txt extends grade_export {
                 $fieldvalue = grade_helper::get_user_field_value($user, $field);
                 $exportdata[] = $fieldvalue;
             }
+            if (!$this->onlyactive) {
+                $issuspended = ($user->suspendedenrolment) ? get_string('yes') : '';
+                $exportdata[] = $issuspended;
+            }
             foreach ($userdata->grades as $itemid => $grade) {
                 if ($export_tracking) {
                     $status = $geub->track($grade);
index 68370fc..77fd941 100644 (file)
@@ -51,7 +51,8 @@ if ($groupmode == SEPARATEGROUPS and !$currentgroup and !has_capability('moodle/
 
 // process post information
 if ($data = $mform->get_data()) {
-    $export = new grade_export_txt($course, $currentgroup, '', false, false, $data->display, $data->decimals, $data->separator, $data->export_onlyactive, true);
+    $onlyactive = $data->export_onlyactive || !has_capability('moodle/course:viewsuspendedusers', $context);
+    $export = new grade_export_txt($course, $currentgroup, '', false, false, $data->display, $data->decimals, $data->separator, $onlyactive, true);
 
     // print the grades on screen for feedback
 
index 5b2c0e9..f3fa6f6 100644 (file)
@@ -48,7 +48,9 @@ class grade_export_xls extends grade_export {
             $myxls->write_string(0, $id, $field->fullname);
         }
         $pos = count($profilefields);
-
+        if (!$this->onlyactive) {
+            $myxls->write_string(0, $pos++, get_string("suspended"));
+        }
         foreach ($this->columns as $grade_item) {
             $myxls->write_string(0, $pos++, $this->format_column_name($grade_item));
 
@@ -74,7 +76,10 @@ class grade_export_xls extends grade_export {
                 $myxls->write_string($i, $id, $fieldvalue);
             }
             $j = count($profilefields);
-
+            if (!$this->onlyactive) {
+                $issuspended = ($user->suspendedenrolment) ? get_string('yes') : '';
+                $myxls->write_string($i, $j++, $issuspended);
+            }
             foreach ($userdata->grades as $itemid => $grade) {
                 if ($export_tracking) {
                     $status = $geub->track($grade);
index 41230a2..16772c9 100644 (file)
@@ -51,7 +51,8 @@ if ($groupmode == SEPARATEGROUPS and !$currentgroup and !has_capability('moodle/
 
 // process post information
 if ($data = $mform->get_data()) {
-    $export = new grade_export_xls($course, $currentgroup, '', false, false, $data->display, $data->decimals, $data->export_onlyactive, true);
+    $onlyactive = $data->export_onlyactive || !has_capability('moodle/course:viewsuspendedusers', $context);
+    $export = new grade_export_xls($course, $currentgroup, '', false, false, $data->display, $data->decimals, $onlyactive, true);
 
     // print the grades on screen for feedbacks
     $export->process_form($data);
index d968489..29270c8 100644 (file)
@@ -52,7 +52,8 @@ if ($groupmode == SEPARATEGROUPS and !$currentgroup and !has_capability('moodle/
 
 // process post information
 if ($data = $mform->get_data()) {
-    $export = new grade_export_xml($course, $currentgroup, '', false, $data->updatedgradesonly, $data->display, $data->decimals, $data->export_onlyactive);
+    $onlyactive = $data->export_onlyactive || !has_capability('moodle/course:viewsuspendedusers', $context);
+    $export = new grade_export_xml($course, $currentgroup, '', false, $data->updatedgradesonly, $data->display, $data->decimals, $onlyactive);
 
     // print the grades on screen for feedbacks
     $export->process_form($data);
index 6dd6748..5fe1d31 100644 (file)
@@ -93,6 +93,12 @@ class graded_users_iterator {
      */
     protected $allowusercustomfields = false;
 
+    /**
+     * List of suspended users in course. This includes users whose enrolment status is suspended
+     * or enrolment has expired or not started.
+     */
+    protected $suspendedusers = array();
+
     /**
      * Constructor
      *
@@ -208,6 +214,13 @@ class graded_users_iterator {
                     ORDER BY $order";
         $this->users_rs = $DB->get_recordset_sql($users_sql, $params);
 
+        if (!$this->onlyactive) {
+            $context = context_course::instance($this->course->id);
+            $this->suspendedusers = get_suspended_userids($context);
+        } else {
+            $this->suspendedusers = array();
+        }
+
         if (!empty($this->grade_items)) {
             $itemids = array_keys($this->grade_items);
             list($itemidsql, $grades_params) = $DB->get_in_or_equal($itemids, SQL_PARAMS_NAMED, 'items');
@@ -300,6 +313,8 @@ class graded_users_iterator {
             }
         }
 
+        // Set user suspended status.
+        $user->suspendedenrolment = isset($this->suspendedusers[$user->id]);
         $result = new stdClass();
         $result->user      = $user;
         $result->grades    = $grades;
@@ -407,9 +422,14 @@ function grade_get_graded_users_select($report, $course, $userid, $groupid, $inc
     if (is_null($userid)) {
         $userid = $USER->id;
     }
-
+    $coursecontext = context_course::instance($course->id);
+    $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
+    $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
+    $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $coursecontext);
     $menu = array(); // Will be a list of userid => user name
+    $menususpendedusers = array(); // Suspended users go to a separate optgroup.
     $gui = new graded_users_iterator($course, null, $groupid);
+    $gui->require_active_enrolment($showonlyactiveenrol);
     $gui->init();
     $label = get_string('selectauser', 'grades');
     if ($includeall) {
@@ -418,12 +438,21 @@ function grade_get_graded_users_select($report, $course, $userid, $groupid, $inc
     }
     while ($userdata = $gui->next_user()) {
         $user = $userdata->user;
-        $menu[$user->id] = fullname($user);
+        $userfullname = fullname($user);
+        if ($user->suspendedenrolment) {
+            $menususpendedusers[$user->id] = $userfullname;
+        } else {
+            $menu[$user->id] = $userfullname;
+        }
     }
     $gui->close();
 
     if ($includeall) {
-        $menu[0] .= " (" . (count($menu) - 1) . ")";
+        $menu[0] .= " (" . (count($menu) + count($menususpendedusers) - 1) . ")";
+    }
+
+    if (!empty($menususpendedusers)) {
+        $menu[] = array(get_string('suspendedusers') => $menususpendedusers);
     }
     $select = new single_select(new moodle_url('/grade/report/'.$report.'/index.php', array('id'=>$course->id)), 'userid', $menu, $userid);
     $select->label = $label;
index 067453c..0734134 100644 (file)
@@ -453,7 +453,7 @@ class grade_report_grader extends grade_report {
             $this->userselect = "AND g.userid $usql";
             $this->userselect_params = $uparams;
 
-            //add a flag to each user indicating whether their enrolment is active
+            // Add a flag to each user indicating whether their enrolment is active.
             $sql = "SELECT ue.userid
                       FROM {user_enrolments} ue
                       JOIN {enrol} e ON e.id = ue.enrolid
@@ -466,8 +466,16 @@ class grade_report_grader extends grade_report {
             $params = array_merge($uparams, array('estatus'=>ENROL_INSTANCE_ENABLED, 'uestatus'=>ENROL_USER_ACTIVE, 'courseid'=>$coursecontext->instanceid));
             $useractiveenrolments = $DB->get_records_sql($sql, $params);
 
+            $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
+            $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
+            $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $coursecontext);
             foreach ($this->users as $user) {
-                $this->users[$user->id]->suspendedenrolment = !array_key_exists($user->id, $useractiveenrolments);
+                // If we are showing only active enrolments, then remove suspended users from list.
+                if ($showonlyactiveenrol && !array_key_exists($user->id, $useractiveenrolments)) {
+                    unset($this->users[$user->id]);
+                } else {
+                    $this->users[$user->id]->suspendedenrolment = !array_key_exists($user->id, $useractiveenrolments);
+                }
             }
         }
 
index f548eaf..ba2cb24 100644 (file)
@@ -99,6 +99,9 @@ class grader_report_preferences_form extends moodleform {
         // View capability is the lowest permission. Users with grade:manage or grade:edit must also have grader:view
         if (has_capability('gradereport/grader:view', $context)) {
             $preferences['prefgeneral']['studentsperpage'] = 'text';
+            if (has_capability('moodle/course:viewsuspendedusers', $context)) {
+                $preferences['prefgeneral']['showonlyactiveenrol'] = $checkbox_default;
+            }
             $preferences['prefgeneral']['aggregationposition'] = array(GRADE_REPORT_PREFERENCE_DEFAULT => '*default*',
                                                                        GRADE_REPORT_AGGREGATION_POSITION_FIRST => get_string('positionfirst', 'grades'),
                                                                        GRADE_REPORT_AGGREGATION_POSITION_LAST => get_string('positionlast', 'grades'));
index 7220870..d1b02af 100644 (file)
@@ -35,6 +35,9 @@ if ($ADMIN->fulltree) {
     $settings->add(new admin_setting_configtext('grade_report_studentsperpage', get_string('studentsperpage', 'grades'),
                                             get_string('studentsperpage_help', 'grades'), 100));
 
+    $settings->add(new admin_setting_configcheckbox('grade_report_showonlyactiveenrol', get_string('showonlyactiveenrol', 'grades'),
+                                                get_string('showonlyactiveenrol_help', 'grades'), 1));
+
     $settings->add(new admin_setting_configcheckbox('grade_report_quickgrading', get_string('quickgrading', 'grades'),
                                                 get_string('quickgrading_help', 'grades'), 1));
 
index 06e4fa5..73729d8 100644 (file)
@@ -39,26 +39,43 @@ $context = context_course::instance($course->id);
 
 require_capability('gradereport/outcomes:view', $context);
 
-//first make sure we have proper final grades
+// First make sure we have proper final grades.
 grade_regrade_final_grades($courseid);
 
-// Grab all outcomes used in course
+// Grab all outcomes used in course.
 $report_info = array();
 $outcomes = grade_outcome::fetch_all_available($courseid);
 
-// Get grade_items that use each outcome
+// Will exclude grades of suspended users if required.
+$defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
+$showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
+$showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context);
+if ($showonlyactiveenrol) {
+    $suspendedusers = get_suspended_userids($context);
+}
+
+// Get grade_items that use each outcome.
 foreach ($outcomes as $outcomeid => $outcome) {
     $report_info[$outcomeid]['items'] = $DB->get_records_select('grade_items', "outcomeid = ? AND courseid = ?", array($outcomeid, $courseid));
     $report_info[$outcomeid]['outcome'] = $outcome;
 
-    // Get average grades for each item
+    // Get average grades for each item.
     if (is_array($report_info[$outcomeid]['items'])) {
         foreach ($report_info[$outcomeid]['items'] as $itemid => $item) {
+            $params = array();
+            $hidesuspendedsql = '';
+            if ($showonlyactiveenrol && !empty($suspendedusers)) {
+                list($notinusers, $params) = $DB->get_in_or_equal($suspendedusers, SQL_PARAMS_QM, null, false);
+                $hidesuspendedsql = ' AND userid ' . $notinusers;
+            }
+            $params = array_merge(array($itemid), $params);
+
             $sql = "SELECT itemid, AVG(finalgrade) AS avg, COUNT(finalgrade) AS count
                       FROM {grade_grades}
-                     WHERE itemid = ?
-                  GROUP BY itemid";
-            $info = $DB->get_records_sql($sql, array($itemid));
+                     WHERE itemid = ?".
+                     $hidesuspendedsql.
+                  "GROUP BY itemid";
+            $info = $DB->get_records_sql($sql, $params);
 
             if (!$info) {
                 unset($report_info[$outcomeid]['items'][$itemid]);
@@ -86,7 +103,7 @@ $html .= '<th class="header c5" scope="col">' . get_string('numberofgrades', 'gr
 $row = 0;
 foreach ($report_info as $outcomeid => $outcomedata) {
     $rowspan = count($outcomedata['items']);
-    // If there are no items for this outcome, rowspan will equal 0, which is not good
+    // If there are no items for this outcome, rowspan will equal 0, which is not good.
     if ($rowspan == 0) {
         $rowspan = 1;
     }
@@ -134,7 +151,7 @@ foreach ($report_info as $outcomeid => $outcomedata) {
         $items_html .= "<td class=\"cell c3\"> - </td><td class=\"cell c4\"> - </td><td class=\"cell c5\"> 0 </td></tr>\n";
     }
 
-    // Calculate outcome average
+    // Calculate outcome average.
     if (is_array($outcomedata['items'])) {
         $count = count($outcomedata['items']);
         if ($count > 0) {
index a509ca5..587233b 100644 (file)
@@ -101,8 +101,12 @@ if (has_capability('moodle/grade:viewall', $context)) { //Teachers will see all
         $user_selector = true;
     }
 
+    $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
+    $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
+    $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context);
     if (empty($userid)) {
         $gui = new graded_users_iterator($course, null, $currentgroup);
+        $gui->require_active_enrolment($showonlyactiveenrol);
         $gui->init();
         // Add tabs
         print_grade_page_head($courseid, 'report', 'user');
index a9fb4d4..6af26b5 100644 (file)
@@ -192,8 +192,8 @@ $string['exportalloutcomes'] = 'Export all outcomes';
 $string['exportfeedback'] = 'Include feedback in export';
 $string['exportplugins'] = 'Export plugins';
 $string['exportsettings'] = 'Export settings';
-$string['exportonlyactive'] = 'Require active enrolment';
-$string['exportonlyactive_help'] = 'Only include students in the export whose enrolment has not been suspended';
+$string['exportonlyactive'] = 'Exclude suspended users';
+$string['exportonlyactive_help'] = 'Only include students in the export whose enrolment is active and has not been suspended';
 $string['exportto'] = 'Export to';
 $string['extracreditvalue'] = 'Extra credit value for {$a}';
 $string['extracreditwarning'] = 'Note: Setting all items for a category to extra credit will effectively remove them from the grade calculation. Since there will be no point total';
@@ -589,6 +589,8 @@ $string['shownohidden'] = 'Do not show';
 $string['shownooutcomes'] = 'Hide outcomes';
 $string['shownumberofgrades'] = 'Show number of grades in averages';
 $string['shownumberofgrades_help'] = 'If enabled, the number of grades used when calculating the average (mean) is displayed in brackets after each average.';
+$string['showonlyactiveenrol'] = 'Show only active enrolments';
+$string['showonlyactiveenrol_help'] = 'This setting determines, if only active enrolled users will be visible in gradebook report. If enabled suspended users will not be shown in gradebook.';
 $string['showpercentage'] = 'Show percentage';
 $string['showpercentage_help'] = 'Show the percentage value of each grade item?';
 $string['showquickfeedback'] = 'Show quick feedback';
index f7c58c0..262140e 100644 (file)
@@ -1640,6 +1640,8 @@ $string['summary'] = 'Summary';
 $string['summary_help'] = 'The idea of a summary is a short text to prepare students for the activities within the topic or week. The text is shown on the course page under the section name.';
 $string['summaryof'] = 'Summary of {$a}';
 $string['supplyinfo'] = 'More details';
+$string['suspended'] = 'Suspended';
+$string['suspendedusers'] = 'Suspended users';
 $string['switchdevicedefault'] = 'Switch to the standard theme';
 $string['switchdevicerecommended'] = 'Switch to the recommended theme for your device';
 $string['switchrolereturn'] = 'Return to my normal role';
index ffa7d82..3cf42ca 100644 (file)
@@ -125,6 +125,7 @@ $string['course:activityvisibility'] = 'Hide/show activities';
 $string['course:bulkmessaging'] = 'Send a message to many people';
 $string['course:create'] = 'Create courses';
 $string['course:delete'] = 'Delete courses';
+$string['course:viewsuspendedusers'] = 'Can view suspended users.';
 $string['course:changecategory'] = 'Change course category';
 $string['course:changefullname'] = 'Change course full name';
 $string['course:changeidnumber'] = 'Change course ID number';
index 6d21365..aef2601 100644 (file)
@@ -2315,12 +2315,14 @@ function get_enrolled_sql(context $context, $withcapability = '', $groupid = 0,
  * @param string $orderby
  * @param int $limitfrom return a subset of records, starting at this point (optional, required if $limitnum is set).
  * @param int $limitnum return a subset comprising this many records (optional, required if $limitfrom is set).
+ * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions
  * @return array of user records
  */
-function get_enrolled_users(context $context, $withcapability = '', $groupid = 0, $userfields = 'u.*', $orderby = null, $limitfrom = 0, $limitnum = 0) {
+function get_enrolled_users(context $context, $withcapability = '', $groupid = 0, $userfields = 'u.*', $orderby = null,
+        $limitfrom = 0, $limitnum = 0, $onlyactive = false) {
     global $DB;
 
-    list($esql, $params) = get_enrolled_sql($context, $withcapability, $groupid);
+    list($esql, $params) = get_enrolled_sql($context, $withcapability, $groupid, $onlyactive);
     $sql = "SELECT $userfields
               FROM {user} u
               JOIN ($esql) je ON je.id = u.id
@@ -2346,12 +2348,13 @@ function get_enrolled_users(context $context, $withcapability = '', $groupid = 0
  * @param context $context
  * @param string $withcapability
  * @param int $groupid 0 means ignore groups, any other value limits the result by group id
+ * @param bool $onlyactive consider only active enrolments in enabled plugins and time restrictions
  * @return array of user records
  */
-function count_enrolled_users(context $context, $withcapability = '', $groupid = 0) {
+function count_enrolled_users(context $context, $withcapability = '', $groupid = 0, $onlyactive = false) {
     global $DB;
 
-    list($esql, $params) = get_enrolled_sql($context, $withcapability, $groupid);
+    list($esql, $params) = get_enrolled_sql($context, $withcapability, $groupid, $onlyactive);
     $sql = "SELECT count(u.id)
               FROM {user} u
               JOIN ($esql) je ON je.id = u.id
@@ -7636,3 +7639,61 @@ function get_related_contexts_string(context $context) {
         return (' ='.$context->id);
     }
 }
+
+/**
+ * Given context and array of users, returns array of users whose enrolment status is suspended,
+ * or enrolment has expired or has not started. Also removes those users from the given array
+ *
+ * @param context $context context in which suspended users should be extracted.
+ * @param array $users list of users.
+ * @param array $ignoreusers array of user ids to ignore, e.g. guest
+ * @return array list of suspended users.
+ */
+function extract_suspended_users($context, &$users, $ignoreusers=array()) {
+    global $DB;
+
+    // Get active enrolled users.
+    list($sql, $params) = get_enrolled_sql($context, null, null, true);
+    $activeusers = $DB->get_records_sql($sql, $params);
+
+    // Move suspended users to a separate array & remove from the initial one.
+    $susers = array();
+    if (sizeof($activeusers)) {
+        foreach ($users as $userid => $user) {
+            if (!array_key_exists($userid, $activeusers) && !in_array($userid, $ignoreusers)) {
+                $susers[$userid] = $user;
+                unset($users[$userid]);
+            }
+        }
+    }
+    return $susers;
+}
+
+/**
+ * Given context and array of users, returns array of user ids whose enrolment status is suspended,
+ * or enrolment has expired or not started.
+ *
+ * @param context $context context in which user enrolment is checked.
+ * @return array list of suspended user id's.
+ */
+function get_suspended_userids($context){
+    global $DB;
+
+    // Get all enrolled users.
+    list($sql, $params) = get_enrolled_sql($context);
+    $users = $DB->get_records_sql($sql, $params);
+
+    // Get active enrolled users.
+    list($sql, $params) = get_enrolled_sql($context, null, null, true);
+    $activeusers = $DB->get_records_sql($sql, $params);
+
+    $susers = array();
+    if (sizeof($activeusers) != sizeof($users)) {
+        foreach ($users as $userid => $user) {
+            if (!array_key_exists($userid, $activeusers)) {
+                $susers[$userid] = $userid;
+            }
+        }
+    }
+    return $susers;
+}
index d5fa85f..9659b46 100644 (file)
@@ -1040,6 +1040,16 @@ $capabilities = array(
         )
     ),
 
+    'moodle/course:viewsuspendedusers' => array(
+
+        'captype' => 'read',
+        'contextlevel' => CONTEXT_SYSTEM,
+        'archetypes' => array(
+            'editingteacher' => CAP_ALLOW,
+            'manager' => CAP_ALLOW
+        )
+    ),
+
     'moodle/blog:view' => array(
 
         'captype' => 'read',
index 5e9677c..3af68c1 100644 (file)
@@ -48,6 +48,9 @@ information provided here is intended especially for developers.
   get_courses_wmanagers()
   See http://docs.moodle.org/dev/Courses_lists_upgrade_to_2.5
 * $core_renderer->block_move_target() changed to support more verbose move-block-here descriptions.
+* Additional (optional) param $onlyactive has been added to get_enrolled_users, count_enrolled_users
+  functions to get information for only active (excluding suspended enrolments) users. Included two
+  helper functions extract_suspended_users, get_suspended_userids to extract suspended user information.
 
 Database (DML) layer:
 * $DB->sql_empty() is deprecated, you have to use sql parameters with empty values instead,