Merge branch 'MDL-76445-master-2' of https://github.com/mihailges/moodle
This commit is contained in:
@@ -781,6 +781,37 @@ function grade_get_plugin_info($courseid, $active_type, $active_plugin) {
|
||||
return $plugin_info;
|
||||
}
|
||||
|
||||
/**
|
||||
* Load a valid list of gradable users in a course.
|
||||
*
|
||||
* @param int $courseid The course ID.
|
||||
* @param int|null $groupid The group ID (optional).
|
||||
* @return array $users A list of enrolled gradable users.
|
||||
*/
|
||||
function get_gradable_users(int $courseid, ?int $groupid = null): array {
|
||||
global $CFG;
|
||||
|
||||
$context = context_course::instance($courseid);
|
||||
// Create a graded_users_iterator because it will properly check the groups etc.
|
||||
$defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
|
||||
$onlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol) ||
|
||||
!has_capability('moodle/course:viewsuspendedusers', $context);
|
||||
|
||||
$course = get_course($courseid);
|
||||
$gui = new graded_users_iterator($course, null, $groupid);
|
||||
$gui->require_active_enrolment($onlyactiveenrol);
|
||||
$gui->init();
|
||||
|
||||
// Flatten the users.
|
||||
$users = [];
|
||||
while ($user = $gui->next_user()) {
|
||||
$users[$user->user->id] = $user->user;
|
||||
}
|
||||
$gui->close();
|
||||
|
||||
return $users;
|
||||
}
|
||||
|
||||
/**
|
||||
* A simple class containing info about grade plugins.
|
||||
* Can be subclassed for special rules
|
||||
|
||||
@@ -151,7 +151,7 @@ class grade extends tablelike implements selectable_items, filterable_items {
|
||||
*/
|
||||
public function init($selfitemisempty = false) {
|
||||
|
||||
$this->items = $this->load_users();
|
||||
$this->items = get_gradable_users($this->courseid, $this->groupid);
|
||||
$this->totalitemcount = count($this->items);
|
||||
|
||||
if ($selfitemisempty) {
|
||||
|
||||
@@ -405,28 +405,15 @@ abstract class screen {
|
||||
|
||||
/**
|
||||
* Load a valid list of users for this gradebook as the screen "items".
|
||||
* @return array $users A list of enroled users.
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @return array A list of enroled users.
|
||||
*/
|
||||
protected function load_users(): array {
|
||||
global $CFG;
|
||||
debugging('The function ' . __FUNCTION__ . '() is deprecated. Please use get_gradable_users() instead.',
|
||||
DEBUG_DEVELOPER);
|
||||
|
||||
// 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 = [];
|
||||
while ($user = $gui->next_user()) {
|
||||
$users[$user->user->id] = $user->user;
|
||||
}
|
||||
$gui->close();
|
||||
return $users;
|
||||
return get_gradable_users($this->courseid, $this->groupid);
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -32,6 +32,7 @@ defined('MOODLE_INTERNAL') || die;
|
||||
/**
|
||||
* The gradebook simple view - initial view to select your search options
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @package gradereport_singleview
|
||||
* @copyright 2014 Moodle Pty Ltd (http://moodle.com)
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
@@ -44,11 +45,15 @@ class select extends screen {
|
||||
/**
|
||||
* Initialise this screen
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @param bool $selfitemisempty Has an item been selected (will be false)
|
||||
*/
|
||||
public function init($selfitemisempty = false) {
|
||||
global $DB;
|
||||
|
||||
debugging('The function ' . __FUNCTION__ . '() is deprecated as part of the deprecation process of the ' .
|
||||
'\gradereport_singleview\local\screen\select class which is no longer used.', DEBUG_DEVELOPER);
|
||||
|
||||
$roleids = explode(',', get_config('moodle', 'gradebookroles'));
|
||||
|
||||
$this->items = [];
|
||||
@@ -66,20 +71,28 @@ class select extends screen {
|
||||
/**
|
||||
* Get the type of items on this screen, not valid so return false.
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @return string|null
|
||||
*/
|
||||
public function item_type(): ?string {
|
||||
debugging('The function ' . __FUNCTION__ . '() is deprecated as part of the deprecation process of the ' .
|
||||
'\gradereport_singleview\local\screen\select class which is no longer used.', DEBUG_DEVELOPER);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the HTML for the page.
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @return string
|
||||
*/
|
||||
public function html(): string {
|
||||
global $OUTPUT, $COURSE;
|
||||
|
||||
debugging('The function ' . __FUNCTION__ . '() is deprecated as part of the deprecation process of the ' .
|
||||
'\gradereport_singleview\local\screen\select class which is no longer used.', DEBUG_DEVELOPER);
|
||||
|
||||
if ($this->itemid === null) {
|
||||
$userlink = new \moodle_url('/grade/report/singleview/index.php', ['id' => $COURSE->id, 'item' => 'user_select']);
|
||||
$gradelink = new \moodle_url('/grade/report/singleview/index.php', ['id' => $COURSE->id, 'item' => 'grade_select']);
|
||||
@@ -137,17 +150,27 @@ class select extends screen {
|
||||
|
||||
/**
|
||||
* Should we show the next prev selector?
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @return bool
|
||||
*/
|
||||
public function supports_next_prev(): bool {
|
||||
debugging('The function ' . __FUNCTION__ . '() is deprecated as part of the deprecation process of the ' .
|
||||
'\gradereport_singleview\local\screen\select class which is no longer used.', DEBUG_DEVELOPER);
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Should we show the base singlereport group selector?
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @return bool
|
||||
*/
|
||||
public function display_group_selector(): bool {
|
||||
debugging('The function ' . __FUNCTION__ . '() is deprecated as part of the deprecation process of the ' .
|
||||
'\gradereport_singleview\local\screen\select class which is no longer used.', DEBUG_DEVELOPER);
|
||||
|
||||
if ($this->itemid === null) {
|
||||
return false;
|
||||
}
|
||||
@@ -157,18 +180,26 @@ class select extends screen {
|
||||
/**
|
||||
* Get the heading for the screen.
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @return string
|
||||
*/
|
||||
public function heading(): string {
|
||||
debugging('The function ' . __FUNCTION__ . '() is deprecated as part of the deprecation process of the ' .
|
||||
'\gradereport_singleview\local\screen\select class which is no longer used.', DEBUG_DEVELOPER);
|
||||
|
||||
return ' ';
|
||||
}
|
||||
|
||||
/**
|
||||
* Does this screen support paging?
|
||||
*
|
||||
* @deprecated since Moodle 4.3
|
||||
* @return bool
|
||||
*/
|
||||
public function supports_paging(): bool {
|
||||
debugging('The function ' . __FUNCTION__ . '() is deprecated as part of the deprecation process of the ' .
|
||||
'\gradereport_singleview\local\screen\select class which is no longer used.', DEBUG_DEVELOPER);
|
||||
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -102,7 +102,7 @@ class user extends tablelike implements selectable_items {
|
||||
public function init($selfitemisempty = false) {
|
||||
|
||||
if (!$selfitemisempty) {
|
||||
$validusers = $this->load_users();
|
||||
$validusers = get_gradable_users($this->courseid, $this->groupid);
|
||||
if (!isset($validusers[$this->itemid])) {
|
||||
// If the passed user id is not valid, show the first user from the list instead.
|
||||
$this->item = reset($validusers);
|
||||
|
||||
@@ -33,32 +33,15 @@ $groupid = optional_param('group', null, PARAM_INT);
|
||||
|
||||
// Making this work with profile reports.
|
||||
$userid = optional_param('userid', null, PARAM_INT);
|
||||
|
||||
$defaulttype = $userid ? 'user' : 'select';
|
||||
|
||||
$itemid = optional_param('itemid', null, PARAM_INT);
|
||||
$itemtype = optional_param('item', $defaulttype, PARAM_TEXT);
|
||||
$itemtype = optional_param('item', null, PARAM_TEXT);
|
||||
$page = optional_param('page', 0, PARAM_INT);
|
||||
$perpage = optional_param('perpage', 100, PARAM_INT);
|
||||
|
||||
$edit = optional_param('edit', -1, PARAM_BOOL); // Sticky editing mode.
|
||||
|
||||
if (empty($itemid) && ($itemtype !== 'user_select' && $itemtype !== 'grade_select')) {
|
||||
$itemid = $userid;
|
||||
$itemtype = $defaulttype;
|
||||
}
|
||||
|
||||
$courseparams = ['id' => $courseid];
|
||||
$pageparams = [
|
||||
'id' => $courseid,
|
||||
'group' => $groupid,
|
||||
'userid' => $userid,
|
||||
'itemid' => $itemid,
|
||||
'item' => $itemtype,
|
||||
'page' => $page,
|
||||
'perpage' => $perpage,
|
||||
];
|
||||
$PAGE->set_url(new moodle_url('/grade/report/singleview/index.php', $pageparams));
|
||||
|
||||
$PAGE->set_pagelayout('report');
|
||||
$PAGE->set_other_editing_capability('moodle/grade:edit');
|
||||
|
||||
@@ -68,10 +51,6 @@ if (!$course = $DB->get_record('course', $courseparams)) {
|
||||
|
||||
require_login($course);
|
||||
|
||||
if (!in_array($itemtype, gradereport_singleview\report\singleview::valid_screens())) {
|
||||
throw new \moodle_exception('notvalid', 'gradereport_singleview', '', $itemtype);
|
||||
}
|
||||
|
||||
$context = context_course::instance($course->id);
|
||||
|
||||
// This is the normal requirements.
|
||||
@@ -85,6 +64,90 @@ $gpr = new grade_plugin_return([
|
||||
'courseid' => $courseid
|
||||
]);
|
||||
|
||||
// Last selected report session tracking.
|
||||
if (!isset($USER->grade_last_report)) {
|
||||
$USER->grade_last_report = [];
|
||||
}
|
||||
$USER->grade_last_report[$course->id] = 'singleview';
|
||||
// If the item type is not explicitly defined or not valid, try to use the last viewed one (obtain in from the session)
|
||||
// or fallback to the user select (zero) state.
|
||||
if (!$itemtype || !in_array($itemtype, \gradereport_singleview\report\singleview::valid_screens())) {
|
||||
$itemtype = isset($SESSION->gradereport_singleview["itemtype-{$context->id}"]) ?
|
||||
$SESSION->gradereport_singleview["itemtype-{$context->id}"] : 'user_select';
|
||||
}
|
||||
|
||||
$currentgroup = $gpr->groupid;
|
||||
// To make some other functions work better later.
|
||||
if (!$currentgroup) {
|
||||
$currentgroup = null;
|
||||
}
|
||||
|
||||
$lastvieweduseritemid = $SESSION->gradereport_singleview["useritem-{$context->id}"] ?? null;
|
||||
$lastviewedgradeitemid = $SESSION->gradereport_singleview["gradeitem-{$context->id}"] ?? null;
|
||||
|
||||
switch ($itemtype) {
|
||||
case 'user_select':
|
||||
// If there is a stored user item (last viewed) in a session variable, bypass the user select zero state
|
||||
// and display this user item. Also, make sure that the stored last viewed user is part of the current
|
||||
// list of gradable users in this course.
|
||||
if ($lastvieweduseritemid && array_key_exists($lastvieweduseritemid, get_gradable_users($courseid, $currentgroup))) {
|
||||
$itemtype = 'user';
|
||||
$itemid = $lastvieweduseritemid;
|
||||
} else {
|
||||
$itemid = null;
|
||||
}
|
||||
break;
|
||||
case 'user':
|
||||
if (is_null($itemid)) {
|
||||
$itemid = $userid ?? $lastvieweduseritemid;
|
||||
}
|
||||
// If the item id (user id) cannot be defined or the user id is not part of the list of gradable users,
|
||||
// display the user select zero state.
|
||||
if (is_null($itemid) || !array_key_exists($itemid, get_gradable_users($courseid, $currentgroup))) {
|
||||
$itemtype = 'user_select';
|
||||
}
|
||||
break;
|
||||
case 'grade_select':
|
||||
// If there is a stored grade item (last viewed) in a session variable, bypass the grade item select zero state
|
||||
// and display this grade item.
|
||||
if ($lastviewedgradeitemid) {
|
||||
$itemtype = 'grade';
|
||||
$itemid = $lastviewedgradeitemid;
|
||||
} else {
|
||||
$itemid = null;
|
||||
}
|
||||
break;
|
||||
case 'grade':
|
||||
// If there is a stored grade item (last viewed) in a session variable, use it.
|
||||
if (is_null($itemid) && $lastviewedgradeitemid) {
|
||||
$itemid = $lastviewedgradeitemid;
|
||||
}
|
||||
$gtree = new grade_tree($courseid, false, false, null, !$CFG->enableoutcomes);
|
||||
$gradeableitems = $gtree->get_items();
|
||||
// The item id (grade item id) cannot be defined, display the grade select zero state.
|
||||
if (is_null($itemid) || !array_key_exists($itemid, $gtree->get_items())) {
|
||||
$itemtype = 'grade_select';
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
$report = new gradereport_singleview\report\singleview($courseid, $gpr, $context, $itemtype, $itemid);
|
||||
|
||||
$pageparams = [
|
||||
'id' => $courseid,
|
||||
'userid' => $userid,
|
||||
'itemid' => $itemid,
|
||||
'item' => $itemtype,
|
||||
'page' => $page,
|
||||
'perpage' => $perpage,
|
||||
];
|
||||
|
||||
if (!is_null($groupid)) {
|
||||
$pageparams['group'] = $groupid;
|
||||
}
|
||||
|
||||
$PAGE->set_url(new moodle_url('/grade/report/singleview/index.php', $pageparams));
|
||||
|
||||
// Build editing on/off button for themes that need it.
|
||||
$button = '';
|
||||
if ($PAGE->user_allowed_editing() && !$PAGE->theme->haseditswitch) {
|
||||
@@ -97,14 +160,6 @@ if ($PAGE->user_allowed_editing() && !$PAGE->theme->haseditswitch) {
|
||||
$button = $OUTPUT->edit_button(new moodle_url($PAGE->url, $options), 'get');
|
||||
}
|
||||
|
||||
// Last selected report session tracking.
|
||||
if (!isset($USER->grade_last_report)) {
|
||||
$USER->grade_last_report = [];
|
||||
}
|
||||
$USER->grade_last_report[$course->id] = 'singleview';
|
||||
|
||||
$report = new gradereport_singleview\report\singleview($courseid, $gpr, $context, $itemtype, $itemid);
|
||||
|
||||
$reportname = $report->screen->heading();
|
||||
|
||||
if ($itemtype == 'user' || $itemtype == 'user_select') {
|
||||
@@ -149,6 +204,11 @@ if ($data = data_submitted()) {
|
||||
grade_regrade_final_grades_if_required($course);
|
||||
|
||||
echo $report->output();
|
||||
// Save the screen state in a session variable as last viewed state.
|
||||
$SESSION->gradereport_singleview["itemtype-{$context->id}"] = $itemtype;
|
||||
if ($itemid) {
|
||||
$SESSION->gradereport_singleview["{$itemtype}item-{$context->id}"] = $itemid;
|
||||
}
|
||||
|
||||
if (($itemtype !== 'select') && ($itemtype !== 'grade_select') &&($itemtype !== 'user_select')) {
|
||||
$item = (isset($userid)) ? $userid : $itemid;
|
||||
@@ -157,12 +217,6 @@ if (($itemtype !== 'select') && ($itemtype !== 'grade_select') &&($itemtype !==
|
||||
$showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
|
||||
$showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context);
|
||||
|
||||
$currentgroup = $gpr->groupid;
|
||||
|
||||
// To make some other functions work better later.
|
||||
if (!$currentgroup) {
|
||||
$currentgroup = null;
|
||||
}
|
||||
$gui = new graded_users_iterator($course, null, $currentgroup);
|
||||
$gui->require_active_enrolment($showonlyactiveenrol);
|
||||
$gui->init();
|
||||
|
||||
@@ -1 +1,2 @@
|
||||
filtergrades,gradereport_singleview
|
||||
viewsingleuserorgradeitem,gradereport_singleview
|
||||
|
||||
@@ -79,7 +79,6 @@ $string['ariareporttype'] = 'Select a report type to view';
|
||||
$string['viewby'] = 'View by';
|
||||
$string['viewsingleuser'] = 'Select a user above to view all their grades';
|
||||
$string['viewsinglegradeitem'] = 'Select a grade item above';
|
||||
$string['viewsingleuserorgradeitem'] = 'View all the grades of a single user or grade item.';
|
||||
$string['searchgrades'] = 'Search grade items';
|
||||
$string['selectagrade'] = 'Select a grade item';
|
||||
$string['selectgradeitemlink'] = 'Select a grade item';
|
||||
@@ -88,3 +87,6 @@ $string['unsaveddatawarning'] = 'Unsaved data warning';
|
||||
|
||||
// Deprecated since Moodle 4.1.
|
||||
$string['filtergrades'] = 'Show grades for {$a}.';
|
||||
|
||||
// Deprecated since Moodle 4.3.
|
||||
$string['viewsingleuserorgradeitem'] = 'View all the grades of a single user or grade item.';
|
||||
|
||||
@@ -7,11 +7,12 @@ Feature: We can use Single view
|
||||
Background:
|
||||
Given the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
| Course 1 | C1 | 0 |
|
||||
And the following "users" exist:
|
||||
| username | firstname | lastname | email | idnumber | middlename | alternatename | firstnamephonetic | lastnamephonetic |
|
||||
| teacher1 | Teacher | 1 | teacher1@example.com | t1 | | fred | | |
|
||||
| teacher2 | No edit | 1 | teacher2@example.com | t2 | | nick | | |
|
||||
| teacher3 | Teacher | 3 | teacher3@example.com | t3 | | jack | | |
|
||||
| student1 | Grainne | Beauchamp | student1@example.com | s1 | Ann | Jill | Gronya | Beecham |
|
||||
| student2 | Niamh | Cholmondely | student2@example.com | s2 | Jane | Nina | Nee | Chumlee |
|
||||
| student3 | Siobhan | Desforges | student3@example.com | s3 | Sarah | Sev | Shevon | De-forjay |
|
||||
@@ -29,6 +30,7 @@ Feature: We can use Single view
|
||||
| user | course | role |
|
||||
| teacher1 | C1 | editingteacher |
|
||||
| teacher2 | C1 | teacher |
|
||||
| teacher3 | C1 | teacher |
|
||||
| student1 | C1 | student |
|
||||
| student2 | C1 | student |
|
||||
| student3 | C1 | student |
|
||||
@@ -171,3 +173,106 @@ Feature: We can use Single view
|
||||
And "new grade item 1" "link" should not exist in the "//tbody//tr[position()=1]//td[position()=2]" "xpath_element"
|
||||
Then "Category total" "link" should not exist in the "//tbody//tr[position()=2]//td[position()=2]" "xpath_element"
|
||||
And "Course total" "link" should not exist in the "//tbody//tr[position()=last()]//td[position()=2]" "xpath_element"
|
||||
|
||||
Scenario: Teacher sees his last viewed singleview report type when navigating back to the gradebook singleview report.
|
||||
Given I navigate to "View > Single view" in the course gradebook
|
||||
And I should see "Select a user above to view all their grades" in the "region-main" "region"
|
||||
And I click on "Grade items" "link"
|
||||
And I should see "Select a grade item above" in the "region-main" "region"
|
||||
And I am on "Course 1" course homepage
|
||||
When I navigate to "View > Single view" in the course gradebook
|
||||
Then I should see "Select a grade item above" in the "region-main" "region"
|
||||
And I log out
|
||||
And I log in as "teacher3"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > Single view" in the course gradebook
|
||||
And I should see "Select a user above to view all their grades" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher sees his last viewed user report when navigating back to the gradebook singleview report.
|
||||
Given I navigate to "View > Single view" in the course gradebook
|
||||
And I click on "Gronya,Beecham" in the "user" search widget
|
||||
And I should see "Gronya,Beecham" in the "region-main" "region"
|
||||
And I am on "Course 1" course homepage
|
||||
When I navigate to "View > Single view" in the course gradebook
|
||||
Then I should not see "Select a user above to view all their grades" in the "region-main" "region"
|
||||
And I should see "Gronya,Beecham" in the "region-main" "region"
|
||||
And I log out
|
||||
And I log in as "teacher3"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > Single view" in the course gradebook
|
||||
And I should see "Select a user above to view all their grades" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher sees his last viewed grade item report when navigating back to the gradebook singleview report.
|
||||
Given I navigate to "View > Single view" in the course gradebook
|
||||
And I click on "Grade items" "link"
|
||||
And I click on "Test assignment one" in the "grade" search widget
|
||||
And I should see "Test assignment one" in the "region-main" "region"
|
||||
And I am on "Course 1" course homepage
|
||||
When I navigate to "View > Single view" in the course gradebook
|
||||
Then I should not see "Select a grade item above" in the "region-main" "region"
|
||||
And I should see "Test assignment one" in the "region-main" "region"
|
||||
And I log out
|
||||
And I log in as "teacher3"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > Single view" in the course gradebook
|
||||
And I should see "Select a user above to view all their grades" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher sees his last viewed user report if the user is a part of the the current group.
|
||||
Given the following "groups" exist:
|
||||
| name | course | idnumber | participation |
|
||||
| Group 1 | C1 | G1 | 1 |
|
||||
And the following "group members" exist:
|
||||
| user | group |
|
||||
| student2 | G1 |
|
||||
And I am on the "Course 1" "course editing" page
|
||||
And I expand all fieldsets
|
||||
And I set the field "Group mode" to "Visible groups"
|
||||
And I press "Save and display"
|
||||
And I navigate to "View > Single view" in the course gradebook
|
||||
And I click on "Nee,Chumlee" in the "user" search widget
|
||||
And I navigate to "View > Grader report" in the course gradebook
|
||||
And I click on "Group 1" in the "group" search widget
|
||||
When I navigate to "View > Single view" in the course gradebook
|
||||
Then I should see "Nee,Chumlee" in the "region-main" "region"
|
||||
And I should not see "Select a user above to view all their grades" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher does not see his last viewed user report if the user is not a part of the the current group.
|
||||
Given the following "groups" exist:
|
||||
| name | course | idnumber | participation |
|
||||
| Group 1 | C1 | G1 | 1 |
|
||||
And the following "group members" exist:
|
||||
| user | group |
|
||||
| student2 | G1 |
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "Settings" in current page administration
|
||||
And I expand all fieldsets
|
||||
And I set the field "Group mode" to "Visible groups"
|
||||
And I press "Save and display"
|
||||
And I navigate to "View > Single view" in the course gradebook
|
||||
And I click on "Gronya,Beecham" in the "user" search widget
|
||||
And I navigate to "View > Grader report" in the course gradebook
|
||||
And I click on "Group 1" in the "group" search widget
|
||||
When I navigate to "View > Single view" in the course gradebook
|
||||
Then I should see "Select a user above to view all their grades" in the "region-main" "region"
|
||||
And I should not see "Gronya,Beecham" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher does not see his last viewed user report if that user is no longer enrolled in the course.
|
||||
Given I navigate to "View > Single view" in the course gradebook
|
||||
And I click on "Gronya,Beecham" in the "user" search widget
|
||||
And I navigate to course participants
|
||||
And I click on "Unenrol" "icon" in the "Gronya,Beecham" "table_row"
|
||||
And I click on "Unenrol" "button" in the "Unenrol" "dialogue"
|
||||
When I navigate to "View > Single view" in the course gradebook
|
||||
Then I should see "Select a user above to view all their grades" in the "region-main" "region"
|
||||
And I should not see "Gronya,Beecham" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher does not see his last viewed grade item report if the item no longer exists in the course.
|
||||
Given I navigate to "View > Single view" in the course gradebook
|
||||
And I click on "Grade items" "link"
|
||||
And I click on "Test assignment four" in the "grade" search widget
|
||||
And I am on "Course 1" course homepage with editing mode on
|
||||
And I delete "Test assignment four" activity
|
||||
And I run all adhoc tasks
|
||||
When I navigate to "View > Single view" in the course gradebook
|
||||
Then I should see "Select a grade item above" in the "region-main" "region"
|
||||
And I should not see "Test grade item" in the "region-main" "region"
|
||||
|
||||
@@ -63,11 +63,13 @@ class screen_test extends \advanced_testcase {
|
||||
grade_regrade_final_grades($course->id);
|
||||
$screentest = new gradereport_singleview_screen_testable($course->id, 0, $group->id);
|
||||
$groupusers = $screentest->test_load_users();
|
||||
$this->assertDebuggingCalled('The function load_users() is deprecated. Please use get_gradable_users() instead.');
|
||||
$this->assertCount(2, $groupusers);
|
||||
|
||||
// Now, let's suspend the enrolment of a user. Should return only one user.
|
||||
$this->getDataGenerator()->enrol_user($user2->id, $course->id, $roleteacher->id, 'manual', 0, 0, ENROL_USER_SUSPENDED);
|
||||
$users = $screentest->test_load_users();
|
||||
$this->assertDebuggingCalled('The function load_users() is deprecated. Please use get_gradable_users() instead.');
|
||||
$this->assertCount(1, $users);
|
||||
|
||||
// Change the viewsuspendedusers capabilities and set the user preference to display suspended users.
|
||||
@@ -77,6 +79,7 @@ class screen_test extends \advanced_testcase {
|
||||
$this->setUser($teacher);
|
||||
$screentest = new gradereport_singleview_screen_testable($course->id, 0, $group->id);
|
||||
$users = $screentest->test_load_users();
|
||||
$this->assertDebuggingCalled('The function load_users() is deprecated. Please use get_gradable_users() instead.');
|
||||
$this->assertCount(2, $users);
|
||||
|
||||
// Change the capability again, now the user can't see the suspended enrolments.
|
||||
@@ -84,11 +87,13 @@ class screen_test extends \advanced_testcase {
|
||||
set_user_preference('grade_report_showonlyactiveenrol', false, $teacher);
|
||||
accesslib_clear_all_caches_for_unit_testing();
|
||||
$users = $screentest->test_load_users();
|
||||
$this->assertDebuggingCalled('The function load_users() is deprecated. Please use get_gradable_users() instead.');
|
||||
$this->assertCount(1, $users);
|
||||
|
||||
// Now, activate the user enrolment again. We shall get 2 users now.
|
||||
$this->getDataGenerator()->enrol_user($user2->id, $course->id, $roleteacher->id, 'manual', 0, 0, ENROL_USER_ACTIVE);
|
||||
$users = $screentest->test_load_users();
|
||||
$this->assertDebuggingCalled('The function load_users() is deprecated. Please use get_gradable_users() instead.');
|
||||
$this->assertCount(2, $users);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,6 +1,14 @@
|
||||
This files describes API changes in /grade/report/*,
|
||||
information provided here is intended especially for developers.
|
||||
|
||||
=== 4.3 ===
|
||||
|
||||
* The load_users() method in the gradereport_singleview\local\screen class has been deprecated. Please use
|
||||
get_gradable_users() instead.
|
||||
* The \gradereport_singleview\local\screen\select has been deprecated. This class generates the output for the initial
|
||||
view to select the single view item type (user or grade item) which is no longer actively used as we do not provide
|
||||
direct links to it.
|
||||
|
||||
=== 4.2 ===
|
||||
* 'Show calculations' setting has been removed from grader report (link is moved to grade action menu)
|
||||
* 'Show activity icons' setting has been removed from grader report
|
||||
|
||||
+27
-11
@@ -106,6 +106,20 @@ if (has_capability('moodle/grade:viewall', $context)) {
|
||||
$userid = $USER->id;
|
||||
}
|
||||
|
||||
// If there is a stored (last viewed) user in a session variable, bypass the user select zero state and display the
|
||||
// report for that user.
|
||||
$lastvieweduserid = $SESSION->gradereport_user["useritem-{$context->id}"] ?? null;
|
||||
if (is_null($userid) && !is_null($lastvieweduserid)) {
|
||||
$userid = $lastvieweduserid;
|
||||
}
|
||||
|
||||
$gradableusers = get_gradable_users($courseid, $currentgroup);
|
||||
// Validate whether the requested user is a valid gradable user in this course. If, not display the user select
|
||||
// zero state.
|
||||
if (empty($gradableusers) || ($userid && !array_key_exists($userid, $gradableusers))) {
|
||||
$userid = null;
|
||||
}
|
||||
|
||||
$defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
|
||||
$showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
|
||||
$showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context);
|
||||
@@ -121,20 +135,22 @@ if (has_capability('moodle/grade:viewall', $context)) {
|
||||
$gui->init();
|
||||
|
||||
if (is_null($userid)) { // Zero state.
|
||||
$report = new gradereport_user\report\user($courseid, $gpr, $context, $USER->id, $viewasuser);
|
||||
|
||||
if (isset($report)) {
|
||||
// Trigger report viewed event.
|
||||
$report->viewed();
|
||||
}
|
||||
|
||||
$actionbar = new \gradereport_user\output\action_bar($context, $userview, null, $currentgroup);
|
||||
// Print header.
|
||||
print_grade_page_head($courseid, 'report', 'user', false, false, null, true,
|
||||
null, null, null, $actionbar);
|
||||
|
||||
echo $report->output_report_zerostate();
|
||||
if (empty($gradableusers)) { // There are no available gradable users, display a notification.
|
||||
$message = $currentgroup ? get_string('nostudentsingroup') : get_string('nostudentsyet');
|
||||
echo $OUTPUT->notification($message, 'warning', false);
|
||||
} else { // Otherwise, display the zero state template.
|
||||
$report = new gradereport_user\report\user($courseid, $gpr, $context, $USER->id, $viewasuser);
|
||||
echo $report->output_report_zerostate();
|
||||
}
|
||||
} else if ($userid == 0) { // Show all reports.
|
||||
// Store the id of the current user item in a session variable which represents the last viewed item.
|
||||
$SESSION->gradereport_user["useritem-{$context->id}"] = $userid;
|
||||
|
||||
$actionbar = new \gradereport_user\output\action_bar($context, $userview, 0, $currentgroup);
|
||||
print_grade_page_head($courseid, 'report', 'user', false, false, null, true,
|
||||
null, null, null, $actionbar);
|
||||
@@ -152,6 +168,9 @@ if (has_capability('moodle/grade:viewall', $context)) {
|
||||
}
|
||||
$gui->close();
|
||||
} else { // Show one user's report.
|
||||
// Store the id of the current user item in a session variable which represents the last viewed item.
|
||||
$SESSION->gradereport_user["useritem-{$context->id}"] = $userid;
|
||||
|
||||
$report = new gradereport_user\report\user($courseid, $gpr, $context, $userid, $viewasuser);
|
||||
$actionbar = new \gradereport_user\output\action_bar($context, $userview, $report->user->id, $currentgroup);
|
||||
|
||||
@@ -189,9 +208,6 @@ if (has_capability('moodle/grade:viewall', $context)) {
|
||||
if (isset($report)) {
|
||||
// Trigger report viewed event.
|
||||
$report->viewed();
|
||||
} else {
|
||||
echo html_writer::tag('div', '', ['class' => 'clearfix']);
|
||||
echo $OUTPUT->notification(get_string('nostudentsyet'));
|
||||
}
|
||||
|
||||
echo $OUTPUT->footer();
|
||||
|
||||
@@ -1,17 +1,121 @@
|
||||
@core @core_grades @gradereport_user
|
||||
@core @core_grades @gradereport_user @javascript
|
||||
Feature: We can use the user report
|
||||
As a user
|
||||
I browse to the User report
|
||||
|
||||
Background:
|
||||
Given the following "courses" exist:
|
||||
| fullname | shortname | category |
|
||||
| Course 1 | C1 | 0 |
|
||||
| fullname | shortname | category | groupmode |
|
||||
| Course 1 | C1 | 0 | 1 |
|
||||
|
||||
@javascript
|
||||
Scenario: Verify we can view a user grade report with no users enrolled.
|
||||
Given I log in as "admin"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > User report" in the course gradebook
|
||||
And I click on "All users (0)" in the "user" search widget
|
||||
Then I should see "There are no students enrolled in this course."
|
||||
|
||||
Scenario: Teacher sees his last viewed user report when navigating back to the gradebook user report.
|
||||
Given the following "users" exist:
|
||||
| username | firstname | lastname | email |
|
||||
| teacher1 | Teacher | 1 | teacher1@example.com |
|
||||
| teacher2 | Teacher | 2 | teacher2@example.com |
|
||||
| student1 | Student | 1 | student1@example.com |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| teacher1 | C1 | editingteacher |
|
||||
| teacher2 | C1 | editingteacher |
|
||||
| student1 | C1 | student |
|
||||
And I log in as "teacher1"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > User report" in the course gradebook
|
||||
And I should see "Select a user above to view their report" in the "region-main" "region"
|
||||
And I click on "Student 1" in the "user" search widget
|
||||
And I should see "Student 1" in the "region-main" "region"
|
||||
And I am on "Course 1" course homepage
|
||||
When I navigate to "View > User report" in the course gradebook
|
||||
Then I should not see "Select a user above to view their report" in the "region-main" "region"
|
||||
And I should see "Student 1" in the "region-main" "region"
|
||||
And I log out
|
||||
And I log in as "teacher2"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > User report" in the course gradebook
|
||||
And I should see "Select a user above to view their report" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher sees his last viewed user report if the user is a part of the the current group.
|
||||
Given the following "groups" exist:
|
||||
| name | course | idnumber | participation |
|
||||
| Group 1 | C1 | G1 | 1 |
|
||||
And the following "users" exist:
|
||||
| username | firstname | lastname | email |
|
||||
| teacher1 | Teacher | 1 | teacher1@example.com |
|
||||
| student1 | Student | 1 | student1@example.com |
|
||||
| student2 | Student | 2 | student2@example.com |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| teacher1 | C1 | editingteacher |
|
||||
| student1 | C1 | student |
|
||||
| student2 | C1 | student |
|
||||
And the following "group members" exist:
|
||||
| user | group |
|
||||
| student2 | G1 |
|
||||
And I log in as "teacher1"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > User report" in the course gradebook
|
||||
And I click on "Student 2" in the "user" search widget
|
||||
And I navigate to "View > Grader report" in the course gradebook
|
||||
And I click on "Group 1" in the "group" search widget
|
||||
When I navigate to "View > User report" in the course gradebook
|
||||
Then I should see "Student 2" in the "region-main" "region"
|
||||
And I should not see "Select a user above to view their report" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher does not see the last viewed user if the user is not a part of the the current group.
|
||||
Given the following "groups" exist:
|
||||
| name | course | idnumber | participation |
|
||||
| Group 1 | C1 | G1 | 1 |
|
||||
And the following "users" exist:
|
||||
| username | firstname | lastname | email |
|
||||
| teacher1 | Teacher | 1 | teacher1@example.com |
|
||||
| student1 | Student | 1 | student1@example.com |
|
||||
| student2 | Student | 2 | student2@example.com |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| teacher1 | C1 | editingteacher |
|
||||
| student1 | C1 | student |
|
||||
| student2 | C1 | student |
|
||||
And the following "group members" exist:
|
||||
| user | group |
|
||||
| student2 | G1 |
|
||||
And I log in as "teacher1"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > User report" in the course gradebook
|
||||
And I click on "Student 1" in the "user" search widget
|
||||
And I navigate to "View > Grader report" in the course gradebook
|
||||
And I click on "Group 1" in the "group" search widget
|
||||
When I navigate to "View > User report" in the course gradebook
|
||||
Then I should see "Select a user above to view their report" in the "region-main" "region"
|
||||
And I should not see "Student 1" in the "region-main" "region"
|
||||
|
||||
Scenario: Teacher does not see his last viewed user report if the user is no longer enrolled in the course.
|
||||
Given the following "users" exist:
|
||||
| username | firstname | lastname | email |
|
||||
| teacher1 | Teacher | 1 | teacher1@example.com |
|
||||
| student1 | Student | 1 | student1@example.com |
|
||||
| student2 | Student | 2 | student2@example.com |
|
||||
And the following "course enrolments" exist:
|
||||
| user | course | role |
|
||||
| teacher1 | C1 | editingteacher |
|
||||
| student1 | C1 | student |
|
||||
| student2 | C1 | student |
|
||||
And I log in as "teacher1"
|
||||
And I am on "Course 1" course homepage
|
||||
And I navigate to "View > User report" in the course gradebook
|
||||
And I click on "Student 1" in the "user" search widget
|
||||
And I should see "Student 1" in the "region-main" "region"
|
||||
And I navigate to course participants
|
||||
And I click on "Unenrol" "icon" in the "Student 1" "table_row"
|
||||
And I click on "Unenrol" "button" in the "Unenrol" "dialogue"
|
||||
And I am on "Course 1" course homepage
|
||||
When I navigate to "View > User report" in the course gradebook
|
||||
Then I should see "Select a user above to view their report" in the "region-main" "region"
|
||||
And I should not see "Student 1" in the "region-main" "region"
|
||||
|
||||
@@ -711,4 +711,67 @@ class lib_test extends \advanced_testcase {
|
||||
$this->assertArrayHasKey('assign', $gradeitems2);
|
||||
$this->assertArrayHasKey('manual', $gradeitems2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test get_gradable_users() function.
|
||||
*
|
||||
* @covers ::get_gradable_users
|
||||
*/
|
||||
public function test_get_gradable_users() {
|
||||
global $DB;
|
||||
|
||||
$this->setAdminUser();
|
||||
$this->resetAfterTest(true);
|
||||
|
||||
$roleteacher = $DB->get_record('role', ['shortname' => 'teacher'], '*', MUST_EXIST);
|
||||
|
||||
// Create a course.
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$coursecontext = \context_course::instance($course->id);
|
||||
// Create groups.
|
||||
$group1 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
|
||||
$group2 = $this->getDataGenerator()->create_group(['courseid' => $course->id]);
|
||||
// Create and enrol a teacher and some students into the course.
|
||||
$teacher = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
|
||||
$student1 = $this->getDataGenerator()->create_and_enrol($course, 'student');
|
||||
$student2 = $this->getDataGenerator()->create_and_enrol($course, 'student');
|
||||
$student3 = $this->getDataGenerator()->create_and_enrol($course, 'student');
|
||||
// Add student1 and student2 to group1.
|
||||
$this->getDataGenerator()->create_group_member(['groupid' => $group1->id, 'userid' => $student1->id]);
|
||||
$this->getDataGenerator()->create_group_member(['groupid' => $group1->id, 'userid' => $student2->id]);
|
||||
// Add student3 to group2.
|
||||
$this->getDataGenerator()->create_group_member(['groupid' => $group2->id, 'userid' => $student3->id]);
|
||||
|
||||
// Perform a regrade before creating the report.
|
||||
grade_regrade_final_grades($course->id);
|
||||
// Should return all gradable users (only students).
|
||||
$gradableusers = get_gradable_users($course->id);
|
||||
$this->assertEqualsCanonicalizing([$student1->id, $student2->id, $student3->id], array_keys($gradableusers));
|
||||
|
||||
// Now, let's suspend the enrolment of student2.
|
||||
$this->getDataGenerator()->enrol_user($student2->id, $course->id, 'student', 'manual', 0, 0, ENROL_USER_SUSPENDED);
|
||||
// Should return only the active gradable users (student1 and student3).
|
||||
$gradableusers = get_gradable_users($course->id);
|
||||
$this->assertEqualsCanonicalizing([$student1->id, $student3->id], array_keys($gradableusers));
|
||||
|
||||
// Give teacher 'viewsuspendedusers' capability and set a preference to display suspended users.
|
||||
assign_capability('moodle/course:viewsuspendedusers', CAP_ALLOW, $roleteacher->id, $coursecontext, true);
|
||||
set_user_preference('grade_report_showonlyactiveenrol', false, $teacher);
|
||||
accesslib_clear_all_caches_for_unit_testing();
|
||||
|
||||
$this->setUser($teacher);
|
||||
// Should return all gradable users (including suspended enrolments).
|
||||
$gradableusers = get_gradable_users($course->id);
|
||||
$this->assertEqualsCanonicalizing([$student1->id, $student2->id, $student3->id], array_keys($gradableusers));
|
||||
|
||||
// Reactivate the course enrolment of student2.
|
||||
$this->getDataGenerator()->enrol_user($student2->id, $course->id, 'student', 'manual', 0, 0, ENROL_USER_ACTIVE);
|
||||
$this->setAdminUser();
|
||||
// Should return all gradable users from group1 (student1 and student2).
|
||||
$gradableusers = get_gradable_users($course->id, $group1->id);
|
||||
$this->assertEqualsCanonicalizing([$student1->id, $student2->id], array_keys($gradableusers));
|
||||
// Should return all gradable users from group2 (student3).
|
||||
$gradableusers = get_gradable_users($course->id, $group2->id);
|
||||
$this->assertEqualsCanonicalizing([$student3->id], array_keys($gradableusers));
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user