From aac66bef1e9cb14d8fdadc37a5f99174c6e7d207 Mon Sep 17 00:00:00 2001 From: Simey Lameze Date: Tue, 2 Dec 2014 13:40:47 +0800 Subject: [PATCH] MDL-48273 singleview: add load_user method and other group validations All credits goes to Damyon, thanks! --- .../singleview/classes/local/screen/grade.php | 14 +++-------- .../classes/local/screen/screen.php | 25 +++++++++++++++++++ .../singleview/classes/local/screen/user.php | 8 ++++-- grade/report/singleview/index.php | 7 ++---- grade/report/singleview/lib.php | 25 ++++++++++--------- grade/report/upgrade.txt | 3 +++ 6 files changed, 52 insertions(+), 30 deletions(-) diff --git a/grade/report/singleview/classes/local/screen/grade.php b/grade/report/singleview/classes/local/screen/grade.php index 51346d1b99a..2905a9a593c 100644 --- a/grade/report/singleview/classes/local/screen/grade.php +++ b/grade/report/singleview/classes/local/screen/grade.php @@ -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' )) diff --git a/grade/report/singleview/classes/local/screen/screen.php b/grade/report/singleview/classes/local/screen/screen.php index 0550af3f275..f31c1d2b8f0 100644 --- a/grade/report/singleview/classes/local/screen/screen.php +++ b/grade/report/singleview/classes/local/screen/screen.php @@ -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; + } } diff --git a/grade/report/singleview/classes/local/screen/user.php b/grade/report/singleview/classes/local/screen/user.php index cf3fdddda37..699323756c6 100644 --- a/grade/report/singleview/classes/local/screen/user.php +++ b/grade/report/singleview/classes/local/screen/user.php @@ -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' )) diff --git a/grade/report/singleview/index.php b/grade/report/singleview/index.php index a355b282538..42e99bf017d 100644 --- a/grade/report/singleview/index.php +++ b/grade/report/singleview/index.php @@ -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()); diff --git a/grade/report/singleview/lib.php b/grade/report/singleview/lib.php index 5382c6cec50..b40711b648e 100644 --- a/grade/report/singleview/lib.php +++ b/grade/report/singleview/lib.php @@ -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(); } /** diff --git a/grade/report/upgrade.txt b/grade/report/upgrade.txt index 748b210524f..ad6d6002842 100644 --- a/grade/report/upgrade.txt +++ b/grade/report/upgrade.txt @@ -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 -- 2.43.0