mirror of
https://github.com/moodle/moodle.git
synced 2025-01-18 22:08:20 +01:00
MDL-55928 gradereport_user: New WS for retrieve grade items
It includes a refactor of the complete externallib. Previously it was not possible to filter the report by groups.
This commit is contained in:
parent
345330d172
commit
08d7965e63
@ -1,5 +1,10 @@
|
|||||||
This files describes API changes in /grade/report/*,
|
This files describes API changes in /grade/report/*,
|
||||||
information provided here is intended especially for developers.
|
information provided here is intended especially for developers.
|
||||||
|
|
||||||
|
=== 3.2 ===
|
||||||
|
* External function gradereport_user_external::get_grades_table now has an optional groupid parameter.
|
||||||
|
Is recommended to use this parameter in courses with separate groups or when the user requesting the report is in more than one group.
|
||||||
|
|
||||||
=== 2.9 ===
|
=== 2.9 ===
|
||||||
* Deprecating grade_report_grader:get_collapsing_icon.
|
* Deprecating grade_report_grader:get_collapsing_icon.
|
||||||
* A new web service function gradereport_user_get_grades_table has been added which will allow external system to retrieve grade information ready to be formatted as a table similar to the gradebook user report one.
|
* A new web service function gradereport_user_get_grades_table has been added which will allow external system to retrieve grade information ready to be formatted as a table similar to the gradebook user report one.
|
||||||
|
@ -41,5 +41,14 @@ $functions = array(
|
|||||||
'type' => 'write',
|
'type' => 'write',
|
||||||
'capabilities' => 'gradereport/user:view',
|
'capabilities' => 'gradereport/user:view',
|
||||||
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
|
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
|
||||||
|
),
|
||||||
|
'gradereport_user_get_grade_items' => array(
|
||||||
|
'classname' => 'gradereport_user_external',
|
||||||
|
'methodname' => 'get_grade_items',
|
||||||
|
'classpath' => 'grade/report/user/externallib.php',
|
||||||
|
'description' => 'Returns the complete list of grade items for users in a course',
|
||||||
|
'type' => 'read',
|
||||||
|
'capabilities' => 'gradereport/user:view',
|
||||||
|
'services' => array(MOODLE_OFFICIAL_MOBILE_SERVICE),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@ -37,45 +37,32 @@ require_once("$CFG->libdir/externallib.php");
|
|||||||
*/
|
*/
|
||||||
class gradereport_user_external extends external_api {
|
class gradereport_user_external extends external_api {
|
||||||
|
|
||||||
/**
|
|
||||||
* Describes the parameters for get_grades_table.
|
|
||||||
*
|
|
||||||
* @return external_external_function_parameters
|
|
||||||
* @since Moodle 2.9
|
|
||||||
*/
|
|
||||||
public static function get_grades_table_parameters() {
|
|
||||||
return new external_function_parameters (
|
|
||||||
array(
|
|
||||||
'courseid' => new external_value(PARAM_INT, 'Course Id', VALUE_REQUIRED),
|
|
||||||
'userid' => new external_value(PARAM_INT, 'Return grades only for this user (optional)', VALUE_DEFAULT, 0)
|
|
||||||
)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Returns a list of grades tables for users in a course.
|
* Validate access permissions to the report
|
||||||
*
|
*
|
||||||
* @param int $courseid Course Id
|
* @param int $courseid the courseid
|
||||||
* @param int $userid Only this user (optional)
|
* @param int $userid the user id to retrieve data from
|
||||||
*
|
* @param int $groupid the group id
|
||||||
* @return array the grades tables
|
* @return array with the parameters cleaned and other required information
|
||||||
* @since Moodle 2.9
|
* @since Moodle 3.2
|
||||||
*/
|
*/
|
||||||
public static function get_grades_table($courseid, $userid = 0) {
|
protected static function check_report_access($courseid, $userid, $groupid = 0) {
|
||||||
global $CFG, $USER;
|
global $USER;
|
||||||
|
|
||||||
$warnings = array();
|
|
||||||
|
|
||||||
// Validate the parameter.
|
// Validate the parameter.
|
||||||
$params = self::validate_parameters(self::get_grades_table_parameters(),
|
$params = self::validate_parameters(self::get_grades_table_parameters(),
|
||||||
array(
|
array(
|
||||||
'courseid' => $courseid,
|
'courseid' => $courseid,
|
||||||
'userid' => $userid)
|
'userid' => $userid,
|
||||||
);
|
'groupid' => $groupid,
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
// Compact/extract functions are not recommended.
|
// Compact/extract functions are not recommended.
|
||||||
$courseid = $params['courseid'];
|
$courseid = $params['courseid'];
|
||||||
$userid = $params['userid'];
|
$userid = $params['userid'];
|
||||||
|
$groupid = $params['groupid'];
|
||||||
|
|
||||||
// Function get_course internally throws an exception if the course doesn't exist.
|
// Function get_course internally throws an exception if the course doesn't exist.
|
||||||
$course = get_course($courseid);
|
$course = get_course($courseid);
|
||||||
@ -93,6 +80,11 @@ class gradereport_user_external extends external_api {
|
|||||||
} else {
|
} else {
|
||||||
$user = core_user::get_user($userid, '*', MUST_EXIST);
|
$user = core_user::get_user($userid, '*', MUST_EXIST);
|
||||||
core_user::require_active_user($user);
|
core_user::require_active_user($user);
|
||||||
|
// Check if we can view the user group (if any).
|
||||||
|
// When userid == 0, we are retrieving all the users, we'll check then if a groupid is required.
|
||||||
|
if (!groups_user_groups_visible($course, $user->id)) {
|
||||||
|
throw new moodle_exception('notingroup');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
$access = false;
|
$access = false;
|
||||||
@ -109,6 +101,42 @@ class gradereport_user_external extends external_api {
|
|||||||
throw new moodle_exception('nopermissiontoviewgrades', 'error');
|
throw new moodle_exception('nopermissiontoviewgrades', 'error');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (!empty($groupid)) {
|
||||||
|
// Determine is the group is visible to user.
|
||||||
|
if (!groups_group_visible($groupid, $course)) {
|
||||||
|
throw new moodle_exception('notingroup');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
// Check to see if groups are being used here.
|
||||||
|
if ($groupmode = groups_get_course_groupmode($course)) {
|
||||||
|
$groupid = groups_get_course_group($course);
|
||||||
|
// Determine is the group is visible to user (this is particullary for the group 0).
|
||||||
|
if (!groups_group_visible($groupid, $course)) {
|
||||||
|
throw new moodle_exception('notingroup');
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
$groupid = 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return array($params, $course, $context, $user, $groupid);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Get the report data
|
||||||
|
* @param stdClass $course course object
|
||||||
|
* @param stdClass $context context object
|
||||||
|
* @param stdClass $user user object (it can be null for all the users)
|
||||||
|
* @param int $userid the user to retrieve data from, 0 for all
|
||||||
|
* @param int $groupid the group id to filter
|
||||||
|
* @param bool $tabledata whether to get the table data (true) or the gradeitemdata
|
||||||
|
* @return array data and possible warnings
|
||||||
|
* @since Moodle 3.2
|
||||||
|
*/
|
||||||
|
protected static function get_report_data($course, $context, $user, $userid, $groupid, $tabledata = true) {
|
||||||
|
global $CFG;
|
||||||
|
|
||||||
|
$warnings = array();
|
||||||
// Require files here to save some memory in case validation fails.
|
// Require files here to save some memory in case validation fails.
|
||||||
require_once($CFG->dirroot . '/group/lib.php');
|
require_once($CFG->dirroot . '/group/lib.php');
|
||||||
require_once($CFG->libdir . '/gradelib.php');
|
require_once($CFG->libdir . '/gradelib.php');
|
||||||
@ -122,49 +150,95 @@ class gradereport_user_external extends external_api {
|
|||||||
array(
|
array(
|
||||||
'type' => 'report',
|
'type' => 'report',
|
||||||
'plugin' => 'user',
|
'plugin' => 'user',
|
||||||
'courseid' => $courseid,
|
'courseid' => $course->id,
|
||||||
'userid' => $userid)
|
'userid' => $userid)
|
||||||
);
|
);
|
||||||
|
|
||||||
$tables = array();
|
$reportdata = array();
|
||||||
|
|
||||||
// Just one user.
|
// Just one user.
|
||||||
if ($user) {
|
if ($user) {
|
||||||
$report = new grade_report_user($courseid, $gpr, $context, $userid);
|
$report = new grade_report_user($course->id, $gpr, $context, $userid);
|
||||||
$report->fill_table();
|
$report->fill_table();
|
||||||
|
|
||||||
$tables[] = array(
|
$gradeuserdata = array(
|
||||||
'courseid' => $courseid,
|
'courseid' => $course->id,
|
||||||
'userid' => $user->id,
|
'userid' => $user->id,
|
||||||
'userfullname' => fullname($user),
|
'userfullname' => fullname($user),
|
||||||
'maxdepth' => $report->maxdepth,
|
'maxdepth' => $report->maxdepth,
|
||||||
'tabledata' => $report->tabledata
|
|
||||||
);
|
);
|
||||||
|
if ($tabledata) {
|
||||||
|
$gradeuserdata['tabledata'] = $report->tabledata;
|
||||||
|
} else {
|
||||||
|
$gradeuserdata['gradeitems'] = $report->gradeitemsdata;
|
||||||
|
}
|
||||||
|
$reportdata[] = $gradeuserdata;
|
||||||
} else {
|
} else {
|
||||||
$defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
|
$defaultgradeshowactiveenrol = !empty($CFG->grade_report_showonlyactiveenrol);
|
||||||
$showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
|
$showonlyactiveenrol = get_user_preferences('grade_report_showonlyactiveenrol', $defaultgradeshowactiveenrol);
|
||||||
$showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context);
|
$showonlyactiveenrol = $showonlyactiveenrol || !has_capability('moodle/course:viewsuspendedusers', $context);
|
||||||
|
|
||||||
$gui = new graded_users_iterator($course);
|
$gui = new graded_users_iterator($course, null, $groupid);
|
||||||
$gui->require_active_enrolment($showonlyactiveenrol);
|
$gui->require_active_enrolment($showonlyactiveenrol);
|
||||||
$gui->init();
|
$gui->init();
|
||||||
|
|
||||||
while ($userdata = $gui->next_user()) {
|
while ($userdata = $gui->next_user()) {
|
||||||
$currentuser = $userdata->user;
|
$currentuser = $userdata->user;
|
||||||
$report = new grade_report_user($courseid, $gpr, $context, $currentuser->id);
|
$report = new grade_report_user($course->id, $gpr, $context, $currentuser->id);
|
||||||
$report->fill_table();
|
$report->fill_table();
|
||||||
|
|
||||||
$tables[] = array(
|
$gradeuserdata = array(
|
||||||
'courseid' => $courseid,
|
'courseid' => $course->id,
|
||||||
'userid' => $currentuser->id,
|
'userid' => $currentuser->id,
|
||||||
'userfullname' => fullname($currentuser),
|
'userfullname' => fullname($currentuser),
|
||||||
'maxdepth' => $report->maxdepth,
|
'maxdepth' => $report->maxdepth,
|
||||||
'tabledata' => $report->tabledata
|
|
||||||
);
|
);
|
||||||
|
if ($tabledata) {
|
||||||
|
$gradeuserdata['tabledata'] = $report->tabledata;
|
||||||
|
} else {
|
||||||
|
$gradeuserdata['gradeitems'] = $report->gradeitemsdata;
|
||||||
|
}
|
||||||
|
$reportdata[] = $gradeuserdata;
|
||||||
}
|
}
|
||||||
$gui->close();
|
$gui->close();
|
||||||
}
|
}
|
||||||
|
return array($reportdata, $warnings);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the parameters for get_grades_table.
|
||||||
|
*
|
||||||
|
* @return external_external_function_parameters
|
||||||
|
* @since Moodle 2.9
|
||||||
|
*/
|
||||||
|
public static function get_grades_table_parameters() {
|
||||||
|
return new external_function_parameters (
|
||||||
|
array(
|
||||||
|
'courseid' => new external_value(PARAM_INT, 'Course Id', VALUE_REQUIRED),
|
||||||
|
'userid' => new external_value(PARAM_INT, 'Return grades only for this user (optional)', VALUE_DEFAULT, 0),
|
||||||
|
'groupid' => new external_value(PARAM_INT, 'Get users from this group only', VALUE_DEFAULT, 0)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns a list of grades tables for users in a course.
|
||||||
|
*
|
||||||
|
* @param int $courseid Course Id
|
||||||
|
* @param int $userid Only this user (optional)
|
||||||
|
* @param int $groupid Get users from this group only
|
||||||
|
*
|
||||||
|
* @return array the grades tables
|
||||||
|
* @since Moodle 2.9
|
||||||
|
*/
|
||||||
|
public static function get_grades_table($courseid, $userid = 0, $groupid = 0) {
|
||||||
|
global $CFG, $USER;
|
||||||
|
|
||||||
|
list($params, $course, $context, $user, $groupid) = self::check_report_access($courseid, $userid, $groupid);
|
||||||
|
$userid = $params['userid'];
|
||||||
|
|
||||||
|
// We pass userid because it can be still 0.
|
||||||
|
list($tables, $warnings) = self::get_report_data($course, $context, $user, $userid, $groupid);
|
||||||
|
|
||||||
$result = array();
|
$result = array();
|
||||||
$result['tables'] = $tables;
|
$result['tables'] = $tables;
|
||||||
@ -268,7 +342,7 @@ class gradereport_user_external extends external_api {
|
|||||||
return new external_function_parameters(
|
return new external_function_parameters(
|
||||||
array(
|
array(
|
||||||
'courseid' => new external_value(PARAM_INT, 'id of the course'),
|
'courseid' => new external_value(PARAM_INT, 'id of the course'),
|
||||||
'userid' => new external_value(PARAM_INT, 'id of the user, 0 means current user', VALUE_DEFAULT, 0)
|
'userid' => new external_value(PARAM_INT, 'id of the user, 0 means current user', VALUE_DEFAULT, 0),
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@ -346,4 +420,105 @@ class gradereport_user_external extends external_api {
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes the parameters for get_grade_items.
|
||||||
|
*
|
||||||
|
* @return external_external_function_parameters
|
||||||
|
* @since Moodle 3.2
|
||||||
|
*/
|
||||||
|
public static function get_grade_items_parameters() {
|
||||||
|
return self::get_grades_table_parameters();
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the complete list of grade items for users in a course.
|
||||||
|
*
|
||||||
|
* @param int $courseid Course Id
|
||||||
|
* @param int $userid Only this user (optional)
|
||||||
|
* @param int $groupid Get users from this group only
|
||||||
|
*
|
||||||
|
* @return array the grades tables
|
||||||
|
* @since Moodle 3.2
|
||||||
|
*/
|
||||||
|
public static function get_grade_items($courseid, $userid = 0, $groupid = 0) {
|
||||||
|
global $CFG, $USER;
|
||||||
|
|
||||||
|
list($params, $course, $context, $user, $groupid) = self::check_report_access($courseid, $userid, $groupid);
|
||||||
|
$userid = $params['userid'];
|
||||||
|
|
||||||
|
// We pass userid because it can be still 0.
|
||||||
|
list($gradeitems, $warnings) = self::get_report_data($course, $context, $user, $userid, $groupid, false);
|
||||||
|
|
||||||
|
foreach ($gradeitems as $gradeitem) {
|
||||||
|
if (isset($gradeitem['feedback']) and isset($gradeitem['feedbackformat'])) {
|
||||||
|
list($gradeitem['feedback'], $gradeitem['feedbackformat']) =
|
||||||
|
external_format_text($gradeitem['feedback'], $gradeitem['feedbackformat'], $context->id);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$result = array();
|
||||||
|
$result['usergrades'] = $gradeitems;
|
||||||
|
$result['warnings'] = $warnings;
|
||||||
|
return $result;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Describes tget_grade_items return value.
|
||||||
|
*
|
||||||
|
* @return external_single_structure
|
||||||
|
* @since Moodle 3.2
|
||||||
|
*/
|
||||||
|
public static function get_grade_items_returns() {
|
||||||
|
return new external_single_structure(
|
||||||
|
array(
|
||||||
|
'usergrades' => new external_multiple_structure(
|
||||||
|
new external_single_structure(
|
||||||
|
array(
|
||||||
|
'courseid' => new external_value(PARAM_INT, 'course id'),
|
||||||
|
'userid' => new external_value(PARAM_INT, 'user id'),
|
||||||
|
'userfullname' => new external_value(PARAM_TEXT, 'user fullname'),
|
||||||
|
'maxdepth' => new external_value(PARAM_INT, 'table max depth (needed for printing it)'),
|
||||||
|
'gradeitems' => new external_multiple_structure(
|
||||||
|
new external_single_structure(
|
||||||
|
array(
|
||||||
|
'id' => new external_value(PARAM_INT, 'Grade item id'),
|
||||||
|
'itemtype' => new external_value(PARAM_ALPHA, 'Grade item type'),
|
||||||
|
'itemmodule' => new external_value(PARAM_PLUGIN, 'Grade item module'),
|
||||||
|
'iteminstance' => new external_value(PARAM_INT, 'Grade item instance'),
|
||||||
|
'itemnumber' => new external_value(PARAM_INT, 'Grade item item number'),
|
||||||
|
'categoryid' => new external_value(PARAM_INT, 'Grade item category id'),
|
||||||
|
'outcomeid' => new external_value(PARAM_INT, 'Outcome id'),
|
||||||
|
'scaleid' => new external_value(PARAM_INT, 'Scale id'),
|
||||||
|
'cmid' => new external_value(PARAM_INT, 'Course module id (if type mod)', VALUE_OPTIONAL),
|
||||||
|
'weightraw' => new external_value(PARAM_FLOAT, 'Weight raw', VALUE_OPTIONAL),
|
||||||
|
'weightformatted' => new external_value(PARAM_NOTAGS, 'Weight', VALUE_OPTIONAL),
|
||||||
|
'status' => new external_value(PARAM_ALPHA, 'Status', VALUE_OPTIONAL),
|
||||||
|
'graderaw' => new external_value(PARAM_FLOAT, 'Grade raw', VALUE_OPTIONAL),
|
||||||
|
'gradedatesubmitted' => new external_value(PARAM_INT, 'Grade submit date', VALUE_OPTIONAL),
|
||||||
|
'gradedategraded' => new external_value(PARAM_INT, 'Grade graded date', VALUE_OPTIONAL),
|
||||||
|
'gradehiddenbydate' => new external_value(PARAM_BOOL, 'Grade hidden by date?', VALUE_OPTIONAL),
|
||||||
|
'gradeneedsupdate' => new external_value(PARAM_BOOL, 'Grade needs update?', VALUE_OPTIONAL),
|
||||||
|
'gradeishidden' => new external_value(PARAM_BOOL, 'Grade is hidden?', VALUE_OPTIONAL),
|
||||||
|
'gradeformatted' => new external_value(PARAM_NOTAGS, 'The grade formatted', VALUE_OPTIONAL),
|
||||||
|
'grademin' => new external_value(PARAM_FLOAT, 'Grade min', VALUE_OPTIONAL),
|
||||||
|
'grademax' => new external_value(PARAM_FLOAT, 'Grade max', VALUE_OPTIONAL),
|
||||||
|
'rangeformatted' => new external_value(PARAM_NOTAGS, 'Range formatted', VALUE_OPTIONAL),
|
||||||
|
'percentageformatted' => new external_value(PARAM_NOTAGS, 'Percentage', VALUE_OPTIONAL),
|
||||||
|
'lettergradeformatted' => new external_value(PARAM_NOTAGS, 'Letter grade', VALUE_OPTIONAL),
|
||||||
|
'rank' => new external_value(PARAM_INT, 'Rank in the course', VALUE_OPTIONAL),
|
||||||
|
'numusers' => new external_value(PARAM_INT, 'Num users in course', VALUE_OPTIONAL),
|
||||||
|
'averageformatted' => new external_value(PARAM_NOTAGS, 'Grade average', VALUE_OPTIONAL),
|
||||||
|
'feedback' => new external_value(PARAM_RAW, 'Grade feedback', VALUE_OPTIONAL),
|
||||||
|
'feedbackformat' => new external_format_value('feedback'),
|
||||||
|
), 'Grade items'
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
)
|
||||||
|
),
|
||||||
|
'warnings' => new external_warnings()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,7 +49,7 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
private function load_data($s1grade, $s2grade) {
|
private function load_data($s1grade, $s2grade) {
|
||||||
global $DB;
|
global $DB;
|
||||||
|
|
||||||
$course = $this->getDataGenerator()->create_course();
|
$course = $this->getDataGenerator()->create_course(array('groupmode' => SEPARATEGROUPS, 'groupmodeforce' => 1));
|
||||||
|
|
||||||
$studentrole = $DB->get_record('role', array('shortname' => 'student'));
|
$studentrole = $DB->get_record('role', array('shortname' => 'student'));
|
||||||
$student1 = $this->getDataGenerator()->create_user();
|
$student1 = $this->getDataGenerator()->create_user();
|
||||||
@ -58,10 +58,20 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
$student2 = $this->getDataGenerator()->create_user();
|
$student2 = $this->getDataGenerator()->create_user();
|
||||||
$this->getDataGenerator()->enrol_user($student2->id, $course->id, $studentrole->id);
|
$this->getDataGenerator()->enrol_user($student2->id, $course->id, $studentrole->id);
|
||||||
|
|
||||||
$teacherrole = $DB->get_record('role', array('shortname' => 'editingteacher'));
|
$teacherrole = $DB->get_record('role', array('shortname' => 'teacher'));
|
||||||
$teacher = $this->getDataGenerator()->create_user();
|
$teacher = $this->getDataGenerator()->create_user();
|
||||||
$this->getDataGenerator()->enrol_user($teacher->id, $course->id, $teacherrole->id);
|
$this->getDataGenerator()->enrol_user($teacher->id, $course->id, $teacherrole->id);
|
||||||
|
|
||||||
|
$context = context_course::instance($course->id);
|
||||||
|
assign_capability('moodle/site:accessallgroups', CAP_PROHIBIT, $teacherrole->id, $context);
|
||||||
|
accesslib_clear_all_caches_for_unit_testing();
|
||||||
|
|
||||||
|
$group1 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
|
||||||
|
$group2 = $this->getDataGenerator()->create_group(array('courseid' => $course->id));
|
||||||
|
groups_add_member($group1->id, $student1->id);
|
||||||
|
groups_add_member($group1->id, $teacher->id);
|
||||||
|
groups_add_member($group2->id, $student2->id);
|
||||||
|
|
||||||
$assignment = $this->getDataGenerator()->create_module('assign', array('name' => "Test assign", 'course' => $course->id));
|
$assignment = $this->getDataGenerator()->create_module('assign', array('name' => "Test assign", 'course' => $course->id));
|
||||||
$modcontext = get_coursemodule_from_instance('assign', $assignment->id, $course->id);
|
$modcontext = get_coursemodule_from_instance('assign', $assignment->id, $course->id);
|
||||||
$assignment->cmidnumber = $modcontext->id;
|
$assignment->cmidnumber = $modcontext->id;
|
||||||
@ -71,7 +81,7 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
$studentgrades = array($student1->id => $student1grade, $student2->id => $student2grade);
|
$studentgrades = array($student1->id => $student1grade, $student2->id => $student2grade);
|
||||||
assign_grade_item_update($assignment, $studentgrades);
|
assign_grade_item_update($assignment, $studentgrades);
|
||||||
|
|
||||||
return array($course, $teacher, $student1, $student2);
|
return array($course, $teacher, $student1, $student2, $assignment);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -84,30 +94,26 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
$s1grade = 80;
|
$s1grade = 80;
|
||||||
$s2grade = 60;
|
$s2grade = 60;
|
||||||
|
|
||||||
list($course, $teacher, $student1, $student2) = $this->load_data($s1grade, $s2grade);
|
list($course, $teacher, $student1, $student2, $assignment) = $this->load_data($s1grade, $s2grade);
|
||||||
|
|
||||||
// A teacher must see all student grades.
|
// A teacher must see all student grades (in their group only).
|
||||||
$this->setUser($teacher);
|
$this->setUser($teacher);
|
||||||
|
|
||||||
$studentgrades = gradereport_user_external::get_grades_table($course->id);
|
$studentgrades = gradereport_user_external::get_grades_table($course->id);
|
||||||
$studentgrades = external_api::clean_returnvalue(gradereport_user_external::get_grades_table_returns(), $studentgrades);
|
$studentgrades = external_api::clean_returnvalue(gradereport_user_external::get_grades_table_returns(), $studentgrades);
|
||||||
|
|
||||||
// No warnings returned.
|
// No warnings returned.
|
||||||
$this->assertTrue(count($studentgrades['warnings']) == 0);
|
$this->assertCount(0, $studentgrades['warnings']);
|
||||||
|
|
||||||
// Check that two grades are returned (each for student).
|
// Check that only grades for the student in the teacher group are returned.
|
||||||
$this->assertTrue(count($studentgrades['tables']) == 2);
|
$this->assertCount(1, $studentgrades['tables']);
|
||||||
|
|
||||||
// Read returned grades.
|
// Read returned grades.
|
||||||
$studentreturnedgrades = array();
|
$studentreturnedgrades = array();
|
||||||
$studentreturnedgrades[$studentgrades['tables'][0]['userid']] =
|
$studentreturnedgrades[$studentgrades['tables'][0]['userid']] =
|
||||||
(int) $studentgrades['tables'][0]['tabledata'][1]['grade']['content'];
|
(int) $studentgrades['tables'][0]['tabledata'][1]['grade']['content'];
|
||||||
|
|
||||||
$studentreturnedgrades[$studentgrades['tables'][1]['userid']] =
|
|
||||||
(int) $studentgrades['tables'][1]['tabledata'][1]['grade']['content'];
|
|
||||||
|
|
||||||
$this->assertEquals($s1grade, $studentreturnedgrades[$student1->id]);
|
$this->assertEquals($s1grade, $studentreturnedgrades[$student1->id]);
|
||||||
$this->assertEquals($s2grade, $studentreturnedgrades[$student2->id]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -121,7 +127,7 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
$s1grade = 80;
|
$s1grade = 80;
|
||||||
$s2grade = 60;
|
$s2grade = 60;
|
||||||
|
|
||||||
list($course, $teacher, $student1, $student2) = $this->load_data($s1grade, $s2grade);
|
list($course, $teacher, $student1, $student2, $assignment) = $this->load_data($s1grade, $s2grade);
|
||||||
|
|
||||||
// A user can see his own grades.
|
// A user can see his own grades.
|
||||||
$this->setUser($student1);
|
$this->setUser($student1);
|
||||||
@ -148,7 +154,7 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
$s1grade = 80;
|
$s1grade = 80;
|
||||||
$s2grade = 60;
|
$s2grade = 60;
|
||||||
|
|
||||||
list($course, $teacher, $student1, $student2) = $this->load_data($s1grade, $s2grade);
|
list($course, $teacher, $student1, $student2, $assignment) = $this->load_data($s1grade, $s2grade);
|
||||||
|
|
||||||
$this->setUser($student2);
|
$this->setUser($student2);
|
||||||
|
|
||||||
@ -156,9 +162,8 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
$studentgrade = gradereport_user_external::get_grades_table($course->id, $student1->id);
|
$studentgrade = gradereport_user_external::get_grades_table($course->id, $student1->id);
|
||||||
$this->fail('Exception expected due to not perissions to view other user grades.');
|
$this->fail('Exception expected due to not perissions to view other user grades.');
|
||||||
} catch (moodle_exception $e) {
|
} catch (moodle_exception $e) {
|
||||||
$this->assertEquals('nopermissiontoviewgrades', $e->errorcode);
|
$this->assertEquals('notingroup', $e->errorcode);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -171,7 +176,7 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
|
|
||||||
$s1grade = 80;
|
$s1grade = 80;
|
||||||
$s2grade = 60;
|
$s2grade = 60;
|
||||||
list($course, $teacher, $student1, $student2) = $this->load_data($s1grade, $s2grade);
|
list($course, $teacher, $student1, $student2, $assignment) = $this->load_data($s1grade, $s2grade);
|
||||||
|
|
||||||
// Redirect events to the sink, so we can recover them later.
|
// Redirect events to the sink, so we can recover them later.
|
||||||
$sink = $this->redirectEvents();
|
$sink = $this->redirectEvents();
|
||||||
@ -207,7 +212,152 @@ class gradereport_user_externallib_testcase extends externallib_advanced_testcas
|
|||||||
} catch (moodle_exception $e) {
|
} catch (moodle_exception $e) {
|
||||||
$this->assertEquals('nopermissiontoviewgrades', $e->errorcode);
|
$this->assertEquals('nopermissiontoviewgrades', $e->errorcode);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test get_grades_items function case teacher
|
||||||
|
*/
|
||||||
|
public function test_get_grade_items_teacher() {
|
||||||
|
|
||||||
|
$this->resetAfterTest(true);
|
||||||
|
|
||||||
|
$s1grade = 80;
|
||||||
|
$s2grade = 60;
|
||||||
|
|
||||||
|
list($course, $teacher, $student1, $student2, $assignment) = $this->load_data($s1grade, $s2grade);
|
||||||
|
|
||||||
|
// A teacher must see all student grades (in their group only).
|
||||||
|
$this->setUser($teacher);
|
||||||
|
|
||||||
|
grade_set_setting($course->id, 'report_user_showrank', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showpercentage', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showhiddenitems', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showgrade', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showfeedback', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showweight', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showcontributiontocoursetotal', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showlettergrade', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showaverage', 1);
|
||||||
|
|
||||||
|
$studentgrades = gradereport_user_external::get_grade_items($course->id);
|
||||||
|
$studentgrades = external_api::clean_returnvalue(gradereport_user_external::get_grade_items_returns(), $studentgrades);
|
||||||
|
// No warnings returned.
|
||||||
|
$this->assertCount(0, $studentgrades['warnings']);
|
||||||
|
|
||||||
|
// Check that only grades for the student in the teacher group are returned.
|
||||||
|
$this->assertCount(1, $studentgrades['usergrades']);
|
||||||
|
$this->assertCount(2, $studentgrades['usergrades'][0]['gradeitems']);
|
||||||
|
|
||||||
|
$this->assertEquals($course->id, $studentgrades['usergrades'][0]['courseid']);
|
||||||
|
$this->assertEquals($student1->id, $studentgrades['usergrades'][0]['userid']);
|
||||||
|
// Module grades.
|
||||||
|
$this->assertEquals('mod', $studentgrades['usergrades'][0]['gradeitems'][0]['itemtype']);
|
||||||
|
$this->assertEquals('assign', $studentgrades['usergrades'][0]['gradeitems'][0]['itemmodule']);
|
||||||
|
$this->assertEquals($assignment->id, $studentgrades['usergrades'][0]['gradeitems'][0]['iteminstance']);
|
||||||
|
$this->assertEquals($assignment->cmidnumber, $studentgrades['usergrades'][0]['gradeitems'][0]['cmid']);
|
||||||
|
$this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][0]['itemnumber']);
|
||||||
|
$this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['outcomeid']);
|
||||||
|
$this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['scaleid']);
|
||||||
|
$this->assertEquals(80, $studentgrades['usergrades'][0]['gradeitems'][0]['graderaw']);
|
||||||
|
$this->assertEquals('80.00', $studentgrades['usergrades'][0]['gradeitems'][0]['gradeformatted']);
|
||||||
|
$this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][0]['grademin']);
|
||||||
|
$this->assertEquals(100, $studentgrades['usergrades'][0]['gradeitems'][0]['grademax']);
|
||||||
|
$this->assertEquals('0–100', $studentgrades['usergrades'][0]['gradeitems'][0]['rangeformatted']);
|
||||||
|
$this->assertEquals('80.00 %', $studentgrades['usergrades'][0]['gradeitems'][0]['percentageformatted']);
|
||||||
|
$this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['feedback']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradehiddenbydate']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeneedsupdate']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeishidden']);
|
||||||
|
$this->assertEquals('B-', $studentgrades['usergrades'][0]['gradeitems'][0]['lettergradeformatted']);
|
||||||
|
$this->assertEquals(1, $studentgrades['usergrades'][0]['gradeitems'][0]['rank']);
|
||||||
|
$this->assertEquals(2, $studentgrades['usergrades'][0]['gradeitems'][0]['numusers']);
|
||||||
|
$this->assertEquals(70, $studentgrades['usergrades'][0]['gradeitems'][0]['averageformatted']);
|
||||||
|
|
||||||
|
// Course grades.
|
||||||
|
$this->assertEquals('course', $studentgrades['usergrades'][0]['gradeitems'][1]['itemtype']);
|
||||||
|
$this->assertEquals(80, $studentgrades['usergrades'][0]['gradeitems'][1]['graderaw']);
|
||||||
|
$this->assertEquals('80.00', $studentgrades['usergrades'][0]['gradeitems'][1]['gradeformatted']);
|
||||||
|
$this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][1]['grademin']);
|
||||||
|
$this->assertEquals(100, $studentgrades['usergrades'][0]['gradeitems'][1]['grademax']);
|
||||||
|
$this->assertEquals('0–100', $studentgrades['usergrades'][0]['gradeitems'][1]['rangeformatted']);
|
||||||
|
$this->assertEquals('80.00 %', $studentgrades['usergrades'][0]['gradeitems'][1]['percentageformatted']);
|
||||||
|
$this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][1]['feedback']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['gradehiddenbydate']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['gradeneedsupdate']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][1]['gradeishidden']);
|
||||||
|
$this->assertEquals('B-', $studentgrades['usergrades'][0]['gradeitems'][1]['lettergradeformatted']);
|
||||||
|
$this->assertEquals(1, $studentgrades['usergrades'][0]['gradeitems'][1]['rank']);
|
||||||
|
$this->assertEquals(2, $studentgrades['usergrades'][0]['gradeitems'][1]['numusers']);
|
||||||
|
$this->assertEquals(70, $studentgrades['usergrades'][0]['gradeitems'][1]['averageformatted']);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test get_grades_items function case student
|
||||||
|
*/
|
||||||
|
public function test_get_grade_items_student() {
|
||||||
|
|
||||||
|
$this->resetAfterTest(true);
|
||||||
|
|
||||||
|
$s1grade = 80;
|
||||||
|
$s2grade = 60;
|
||||||
|
|
||||||
|
list($course, $teacher, $student1, $student2, $assignment) = $this->load_data($s1grade, $s2grade);
|
||||||
|
|
||||||
|
grade_set_setting($course->id, 'report_user_showrank', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showpercentage', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showgrade', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showfeedback', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showweight', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showcontributiontocoursetotal', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showlettergrade', 1);
|
||||||
|
grade_set_setting($course->id, 'report_user_showaverage', 1);
|
||||||
|
|
||||||
|
$this->setUser($student1);
|
||||||
|
|
||||||
|
$studentgrades = gradereport_user_external::get_grade_items($course->id, $student1->id);
|
||||||
|
$studentgrades = external_api::clean_returnvalue(gradereport_user_external::get_grade_items_returns(), $studentgrades);
|
||||||
|
// No warnings returned.
|
||||||
|
$this->assertCount(0, $studentgrades['warnings']);
|
||||||
|
|
||||||
|
// Check that only grades for the student in the teacher group are returned.
|
||||||
|
$this->assertCount(1, $studentgrades['usergrades']);
|
||||||
|
$this->assertCount(2, $studentgrades['usergrades'][0]['gradeitems']);
|
||||||
|
|
||||||
|
$this->assertEquals($course->id, $studentgrades['usergrades'][0]['courseid']);
|
||||||
|
$this->assertEquals($student1->id, $studentgrades['usergrades'][0]['userid']);
|
||||||
|
$this->assertEquals('mod', $studentgrades['usergrades'][0]['gradeitems'][0]['itemtype']);
|
||||||
|
$this->assertEquals('assign', $studentgrades['usergrades'][0]['gradeitems'][0]['itemmodule']);
|
||||||
|
$this->assertEquals($assignment->id, $studentgrades['usergrades'][0]['gradeitems'][0]['iteminstance']);
|
||||||
|
$this->assertEquals($assignment->cmidnumber, $studentgrades['usergrades'][0]['gradeitems'][0]['cmid']);
|
||||||
|
$this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][0]['itemnumber']);
|
||||||
|
$this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['outcomeid']);
|
||||||
|
$this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['scaleid']);
|
||||||
|
$this->assertEquals(80, $studentgrades['usergrades'][0]['gradeitems'][0]['graderaw']);
|
||||||
|
$this->assertEquals('80.00', $studentgrades['usergrades'][0]['gradeitems'][0]['gradeformatted']);
|
||||||
|
$this->assertEquals(0, $studentgrades['usergrades'][0]['gradeitems'][0]['grademin']);
|
||||||
|
$this->assertEquals(100, $studentgrades['usergrades'][0]['gradeitems'][0]['grademax']);
|
||||||
|
$this->assertEquals('0–100', $studentgrades['usergrades'][0]['gradeitems'][0]['rangeformatted']);
|
||||||
|
$this->assertEquals('80.00 %', $studentgrades['usergrades'][0]['gradeitems'][0]['percentageformatted']);
|
||||||
|
$this->assertEmpty($studentgrades['usergrades'][0]['gradeitems'][0]['feedback']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradehiddenbydate']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeneedsupdate']);
|
||||||
|
$this->assertFalse($studentgrades['usergrades'][0]['gradeitems'][0]['gradeishidden']);
|
||||||
|
$this->assertEquals('B-', $studentgrades['usergrades'][0]['gradeitems'][0]['lettergradeformatted']);
|
||||||
|
$this->assertEquals(1, $studentgrades['usergrades'][0]['gradeitems'][0]['rank']);
|
||||||
|
$this->assertEquals(2, $studentgrades['usergrades'][0]['gradeitems'][0]['numusers']);
|
||||||
|
$this->assertEquals(70, $studentgrades['usergrades'][0]['gradeitems'][0]['averageformatted']);
|
||||||
|
|
||||||
|
// Hide one grade for the user.
|
||||||
|
$gradegrade = new grade_grade(array('userid' => $student1->id,
|
||||||
|
'itemid' => $studentgrades['usergrades'][0]['gradeitems'][0]['id']), true);
|
||||||
|
$gradegrade->set_hidden(1);
|
||||||
|
$studentgrades = gradereport_user_external::get_grade_items($course->id, $student1->id);
|
||||||
|
$studentgrades = external_api::clean_returnvalue(gradereport_user_external::get_grade_items_returns(), $studentgrades);
|
||||||
|
|
||||||
|
// Check we get only the course final grade.
|
||||||
|
$this->assertCount(1, $studentgrades['usergrades']);
|
||||||
|
$this->assertCount(1, $studentgrades['usergrades'][0]['gradeitems']);
|
||||||
|
$this->assertEquals('course', $studentgrades['usergrades'][0]['gradeitems'][0]['itemtype']);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -24,6 +24,6 @@
|
|||||||
|
|
||||||
defined('MOODLE_INTERNAL') || die();
|
defined('MOODLE_INTERNAL') || die();
|
||||||
|
|
||||||
$plugin->version = 2016052300; // The current plugin version (Date: YYYYMMDDXX)
|
$plugin->version = 2016052301; // The current plugin version (Date: YYYYMMDDXX)
|
||||||
$plugin->requires = 2016051900; // Requires this Moodle version
|
$plugin->requires = 2016051900; // Requires this Moodle version
|
||||||
$plugin->component = 'gradereport_user'; // Full name of the plugin (used for diagnostics)
|
$plugin->component = 'gradereport_user'; // Full name of the plugin (used for diagnostics)
|
||||||
|
@ -39,7 +39,7 @@ class core_grades_external extends external_api {
|
|||||||
* @return external_function_parameters
|
* @return external_function_parameters
|
||||||
* @since Moodle 2.7
|
* @since Moodle 2.7
|
||||||
* @deprecated Moodle 3.2 MDL-51373 - Please do not call this function any more.
|
* @deprecated Moodle 3.2 MDL-51373 - Please do not call this function any more.
|
||||||
* @see gradereport_user_external::get_grades_table for a similar function
|
* @see gradereport_user_external::get_grade_items for a similar function
|
||||||
*/
|
*/
|
||||||
public static function get_grades_parameters() {
|
public static function get_grades_parameters() {
|
||||||
return new external_function_parameters(
|
return new external_function_parameters(
|
||||||
@ -68,7 +68,7 @@ class core_grades_external extends external_api {
|
|||||||
* @return array Array of grades
|
* @return array Array of grades
|
||||||
* @since Moodle 2.7
|
* @since Moodle 2.7
|
||||||
* @deprecated Moodle 3.2 MDL-51373 - Please do not call this function any more.
|
* @deprecated Moodle 3.2 MDL-51373 - Please do not call this function any more.
|
||||||
* @see gradereport_user_external::get_grades_table for a similar function
|
* @see gradereport_user_external::get_grade_items for a similar function
|
||||||
*/
|
*/
|
||||||
public static function get_grades($courseid, $component = null, $activityid = null, $userids = array()) {
|
public static function get_grades($courseid, $component = null, $activityid = null, $userids = array()) {
|
||||||
global $CFG, $USER, $DB;
|
global $CFG, $USER, $DB;
|
||||||
@ -298,7 +298,7 @@ class core_grades_external extends external_api {
|
|||||||
* @param int $itemnumber Item number
|
* @param int $itemnumber Item number
|
||||||
* @return grade_item A grade_item instance
|
* @return grade_item A grade_item instance
|
||||||
* @deprecated Moodle 3.2 MDL-51373 - Please do not call this function any more.
|
* @deprecated Moodle 3.2 MDL-51373 - Please do not call this function any more.
|
||||||
* @see gradereport_user_external::get_grades_table for a similar function
|
* @see gradereport_user_external::get_grade_items for a similar function
|
||||||
*/
|
*/
|
||||||
private static function get_grade_item($courseid, $itemtype, $itemmodule = null, $iteminstance = null, $itemnumber = null) {
|
private static function get_grade_item($courseid, $itemtype, $itemmodule = null, $iteminstance = null, $itemnumber = null) {
|
||||||
$gradeiteminstance = null;
|
$gradeiteminstance = null;
|
||||||
@ -318,7 +318,7 @@ class core_grades_external extends external_api {
|
|||||||
* @return external_description
|
* @return external_description
|
||||||
* @since Moodle 2.7
|
* @since Moodle 2.7
|
||||||
* @deprecated Moodle 3.2 MDL-51373 - Please do not call this function any more.
|
* @deprecated Moodle 3.2 MDL-51373 - Please do not call this function any more.
|
||||||
* @see gradereport_user_external::get_grades_table for a similar function
|
* @see gradereport_user_external::get_grade_items for a similar function
|
||||||
*/
|
*/
|
||||||
public static function get_grades_returns() {
|
public static function get_grades_returns() {
|
||||||
return new external_single_structure(
|
return new external_single_structure(
|
||||||
|
Loading…
x
Reference in New Issue
Block a user