MDL-48273 singleview: add load_user method and other group validations
authorSimey Lameze <simey@moodle.com>
Tue, 2 Dec 2014 05:40:47 +0000 (13:40 +0800)
committerDan Poltawski <dan@moodle.com>
Mon, 8 Dec 2014 11:19:06 +0000 (11:19 +0000)
All credits goes to Damyon, thanks!

grade/report/singleview/classes/local/screen/grade.php
grade/report/singleview/classes/local/screen/screen.php
grade/report/singleview/classes/local/screen/user.php
grade/report/singleview/index.php
grade/report/singleview/lib.php
grade/report/upgrade.txt

index 51346d1..2905a9a 100644 (file)
@@ -121,17 +121,9 @@ class grade extends tablelike implements selectable_items, filterable_items {
      * @param bool $selfitemisempty True if we have not selected a user.
      */
     public function init($selfitemisempty = false) {
-        $roleids = explode(',', get_config('moodle', 'gradebookroles'));
-
-        $this->items = array();
-        foreach ($roleids as $roleid) {
-            // Keeping the first user appearance.
-            $this->items = $this->items + get_role_users(
-                $roleid, $this->context, false, '',
-                'u.lastname, u.firstname', null, $this->groupid);
-        }
 
-        $this->totalitemcount = count_role_users($roleids, $this->context);
+        $this->items = $this->load_users();
+        $this->totalitemcount = count($this->items);
 
         if ($selfitemisempty) {
             return;
@@ -273,7 +265,7 @@ class grade extends tablelike implements selectable_items, filterable_items {
             new moodle_url('/grade/report/singleview/index.php', array(
                 'perpage' => $this->perpage,
                 'id' => $this->courseid,
-                'groupid' => $this->groupid,
+                'group' => $this->groupid,
                 'itemid' => $this->itemid,
                 'item' => 'grade'
             ))
index 0550af3..f31c1d2 100644 (file)
@@ -375,4 +375,29 @@ abstract class screen {
     public function supports_next_prev() {
         return true;
     }
+
+    /**
+     * Load a valid list of users for this gradebook as the screen "items".
+     * @return array $users A list of enroled users.
+     */
+    protected function load_users() {
+        global $CFG;
+
+        // Create a graded_users_iterator because it will properly check the groups etc.
+        $defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
+        $showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
+        $showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $this->context);
+
+        require_once($CFG->dirroot.'/grade/lib.php');
+        $gui = new \graded_users_iterator($this->course, null, $this->groupid);
+        $gui->require_active_enrolment($showonlyactiveenrol);
+        $gui->init();
+
+        // Flatten the users.
+        $users = array();
+        while ($user = $gui->next_user()) {
+            $users[$user->user->id] = $user->user;
+        }
+        return $users;
+    }
 }
index cf3fddd..6993237 100644 (file)
@@ -101,7 +101,11 @@ class user extends tablelike implements selectable_items {
         global $DB;
 
         if (!$selfitemisempty) {
-            $this->item = $DB->get_record('user', array('id' => $this->itemid));
+            $validusers = $this->load_users();
+            if (!isset($validusers[$this->itemid])) {
+                print_error('invaliduserid');
+            }
+            $this->item = $validusers[$this->itemid];
         }
 
         $params = array('courseid' => $this->courseid);
@@ -307,7 +311,7 @@ class user extends tablelike implements selectable_items {
             new moodle_url('/grade/report/singleview/index.php', array(
                 'perpage' => $this->perpage,
                 'id' => $this->courseid,
-                'groupid' => $this->groupid,
+                'group' => $this->groupid,
                 'itemid' => $this->itemid,
                 'item' => 'user'
             ))
index a355b28..42e99bf 100644 (file)
@@ -76,10 +76,7 @@ $USER->grade_last_report[$course->id] = 'singleview';
 // this must be done before constructing of the grade tree.
 grade_regrade_final_grades($courseid);
 
-$report = new gradereport_singleview(
-    $courseid, $gpr, $context,
-    $itemtype, $itemid, $groupid
-);
+$report = new gradereport_singleview($courseid, $gpr, $context, $itemtype, $itemid);
 
 $reportname = $report->screen->heading();
 
@@ -130,7 +127,7 @@ if (!empty($options)) {
 
     $relreport = new gradereport_singleview(
                 $courseid, $gpr, $context,
-                $report->screen->item_type(), $optionitemid, $groupid
+                $report->screen->item_type(), $optionitemid
     );
     $reloptions = $relreport->screen->options();
     $reloptionssorting = array_keys($relreport->screen->options());
index 5382c6c..b40711b 100644 (file)
@@ -74,18 +74,11 @@ class gradereport_singleview extends grade_report {
      * @param context_course $context
      * @param string $itemtype Should be user, select or grade
      * @param int $itemid The id of the user or grade item
-     * @param int $groupid (optional) The current groupid.
+     * @param string $unused Used to be group id but that was removed and this is now unused.
      */
-    public function __construct($courseid, $gpr, $context, $itemtype, $itemid, $groupid=null) {
+    public function __construct($courseid, $gpr, $context, $itemtype, $itemid, $unused = null) {
         parent::__construct($courseid, $gpr, $context);
 
-        $screenclass = "\\gradereport_singleview\\local\\screen\\${itemtype}";
-
-        $this->screen = new $screenclass($courseid, $itemid, $groupid);
-
-        // Load custom or predifined js.
-        $this->screen->js();
-
         $base = '/grade/report/singleview/index.php';
 
         $idparams = array('id' => $courseid);
@@ -93,11 +86,19 @@ class gradereport_singleview extends grade_report {
         $this->baseurl = new moodle_url($base, $idparams);
 
         $this->pbarurl = new moodle_url($base, $idparams + array(
-            'item' => $itemtype,
-            'itemid' => $itemid
-        ));
+                'item' => $itemtype,
+                'itemid' => $itemid
+            ));
 
+        //  The setup_group method is used to validate group mode and permissions and define the currentgroup value.
         $this->setup_groups();
+
+        $screenclass = "\\gradereport_singleview\\local\\screen\\${itemtype}";
+
+        $this->screen = new $screenclass($courseid, $itemid, $this->currentgroup);
+
+        // Load custom or predifined js.
+        $this->screen->js();
     }
 
     /**
index 748b210..ad6d600 100644 (file)
@@ -1,6 +1,9 @@
 This files describes API changes in /grade/report/*,
 information provided here is intended especially for developers.
 
+=== 2.8.1 ===
+* gradereport_singleview::__construct doesn't need groupid parameter anymore, so it was renamed to $unused.
+
 === 2.6.5, 2.7.2 ===
 
 * The callback function grade_report_*_profilereport now takes one more parameter $viewasuser. This parameter