MDL-58453 mod_feedback: Refactor get_non_respondents WS

We should return more information like if the user started or not the
feedback and the total number of non respondents (to be able to
paginate).
This commit is contained in:
Juan Leyva 2017-03-31 10:34:50 +02:00
parent 3aa424703b
commit 682aea9b84
4 changed files with 68 additions and 35 deletions

View File

@ -992,10 +992,12 @@ class mod_feedback_external extends external_api {
* @since Moodle 3.3
*/
public static function get_non_respondents($feedbackid, $groupid = 0, $sort = 'lastaccess', $page = 0, $perpage = 0) {
global $CFG;
require_once($CFG->dirroot . '/mod/feedback/lib.php');
$params = array('feedbackid' => $feedbackid, 'groupid' => $groupid, 'sort' => $sort, 'page' => $page, 'perpage' => $perpage);
$params = self::validate_parameters(self::get_non_respondents_parameters(), $params);
$warnings = $itemsdata = array();
$warnings = $nonrespondents = array();
list($feedback, $course, $cm, $context) = self::validate_feedback($params['feedbackid']);
@ -1024,20 +1026,28 @@ class mod_feedback_external extends external_api {
if ($params['sort'] !== 'firstname' && $params['sort'] !== 'lastname' && $params['sort'] !== 'lastaccess') {
throw new invalid_parameter_exception('Invalid sort param, must be firstname, lastname or lastaccess.');
}
$params['sort'] = 'u.' . $params['sort'];
// Check if we are page filtering.
if ($params['page'] == 0 && $params['perpage'] == 0) {
$perpage = false;
$page = false;
if ($params['perpage'] == 0) {
$page = $params['page'];
$perpage = FEEDBACK_DEFAULT_PAGE_COUNT;
} else {
$perpage = $params['perpage'];
$page = $perpage * $params['page'];
}
$users = feedback_get_incomplete_users($cm, $groupid, $params['sort'], $page, $perpage);
$users = feedback_get_incomplete_users($cm, $groupid, $params['sort'], $page, $perpage, true);
foreach ($users as $user) {
$nonrespondents[] = [
'courseid' => $course->id,
'userid' => $user->id,
'fullname' => fullname($user),
'started' => $user->feedbackstarted
];
}
$result = array(
'users' => $users,
'users' => $nonrespondents,
'total' => feedback_count_incomplete_users($cm, $groupid),
'warnings' => $warnings
);
return $result;
@ -1052,10 +1062,18 @@ class mod_feedback_external extends external_api {
public static function get_non_respondents_returns() {
return new external_single_structure(
array(
'users' => new external_multiple_structure(
new external_value(PARAM_INT, 'The user id')
),
'warnings' => new external_warnings(),
'users' => new external_multiple_structure(
new external_single_structure(
array(
'courseid' => new external_value(PARAM_INT, 'Course id'),
'userid' => new external_value(PARAM_INT, 'The user id'),
'fullname' => new external_value(PARAM_TEXT, 'User full name'),
'started' => new external_value(PARAM_BOOL, 'If the user has started the attempt'),
)
)
),
'total' => new external_value(PARAM_INT, 'Total number of non respondents'),
'warnings' => new external_warnings(),
)
);
}

View File

@ -971,13 +971,15 @@ function feedback_check_is_switchrole() {
* @param string $sort
* @param int $startpage
* @param int $pagecount
* @return object the userrecords
* @param bool $includestatus to return if the user started or not the feedback among the complete user record
* @return array array of user ids or user objects when $includestatus set to true
*/
function feedback_get_incomplete_users(cm_info $cm,
$group = false,
$sort = '',
$startpage = false,
$pagecount = false) {
$pagecount = false,
$includestatus = false) {
global $DB;
@ -985,7 +987,8 @@ function feedback_get_incomplete_users(cm_info $cm,
//first get all user who can complete this feedback
$cap = 'mod/feedback:complete';
$fields = 'u.id, u.username';
$allnames = get_all_user_name_fields(true, 'u');
$fields = 'u.id, ' . $allnames . ', u.picture, u.email, u.imagealt';
if (!$allusers = get_users_by_capability($context,
$cap,
$fields,
@ -999,25 +1002,35 @@ function feedback_get_incomplete_users(cm_info $cm,
}
// Filter users that are not in the correct group/grouping.
$info = new \core_availability\info_module($cm);
$allusers = $info->filter_user_list($allusers);
$allusersrecords = $info->filter_user_list($allusers);
$allusers = array_keys($allusers);
$allusers = array_keys($allusersrecords);
//now get all completeds
$params = array('feedback'=>$cm->instance);
if (!$completedusers = $DB->get_records_menu('feedback_completed', $params, '', 'id, userid')) {
return $allusers;
if ($completedusers = $DB->get_records_menu('feedback_completed', $params, '', 'id, userid')) {
// Now strike all completedusers from allusers.
$allusers = array_diff($allusers, $completedusers);
}
//now strike all completedusers from allusers
$allusers = array_diff($allusers, $completedusers);
//for paging I use array_slice()
if ($startpage !== false AND $pagecount !== false) {
$allusers = array_slice($allusers, $startpage, $pagecount);
}
return $allusers;
// Check if we should return the full users objects.
if ($includestatus) {
$userrecords = [];
$startedusers = $DB->get_records_menu('feedback_completedtmp', ['feedback' => $cm->instance], '', 'id, userid');
$startedusers = array_flip($startedusers);
foreach ($allusers as $userid) {
$allusersrecords[$userid]->feedbackstarted = isset($startedusers[$userid]);
$userrecords[] = $allusersrecords[$userid];
}
return $userrecords;
} else { // Return just user ids.
return $allusers;
}
}
/**

View File

@ -216,36 +216,38 @@ if ($showall) {
$pagecount = $table->get_page_size();
}
$students = feedback_get_incomplete_users($cm, $usedgroupid, $sort, $startpage, $pagecount);
// Return students record including if they started or not the feedback.
$students = feedback_get_incomplete_users($cm, $usedgroupid, $sort, $startpage, $pagecount, true);
//####### viewreports-start
//print the list of students
echo $OUTPUT->heading(get_string('non_respondents_students', 'feedback', $matchcount), 4);
echo isset($groupselect) ? $groupselect : '';
echo '<div class="clearer"></div>';
if (!$students) {
if (empty($students)) {
echo $OUTPUT->notification(get_string('noexistingparticipants', 'enrol'));
} else {
if (has_capability('moodle/course:bulkmessaging', $coursecontext)) {
$canbulkmessaging = has_capability('moodle/course:bulkmessaging', $coursecontext);
if ($canbulkmessaging) {
echo '<form class="mform" action="show_nonrespondents.php" method="post" id="feedback_sendmessageform">';
}
foreach ($students as $student) {
$user = $DB->get_record('user', array('id'=>$student));
//userpicture and link to the profilepage
$profile_url = $CFG->wwwroot.'/user/view.php?id='.$user->id.'&amp;course='.$course->id;
$profilelink = '<strong><a href="'.$profile_url.'">'.fullname($user).'</a></strong>';
$data = array ($OUTPUT->user_picture($user, array('courseid'=>$course->id)), $profilelink);
if ($DB->record_exists('feedback_completedtmp', array('userid' => $user->id, 'feedback' => $feedback->id))) {
foreach ($students as $student) {
//userpicture and link to the profilepage
$profileurl = $CFG->wwwroot.'/user/view.php?id='.$student->id.'&amp;course='.$course->id;
$profilelink = '<strong><a href="'.$profileurl.'">'.fullname($student).'</a></strong>';
$data = array($OUTPUT->user_picture($student, array('courseid' => $course->id)), $profilelink);
if ($student->feedbackstarted) {
$data[] = get_string('started', 'feedback');
} else {
$data[] = get_string('not_started', 'feedback');
}
//selections to bulk messaging
if (has_capability('moodle/course:bulkmessaging', $coursecontext)) {
$data[] = '<input type="checkbox" class="usercheckbox" name="messageuser[]" value="'.$user->id.'" />';
if ($canbulkmessaging) {
$data[] = '<input type="checkbox" class="usercheckbox" name="messageuser[]" value="'.$student->id.'" />';
}
$table->add_data($data);
}

View File

@ -705,7 +705,7 @@ class mod_feedback_external_testcase extends externallib_advanced_testcase {
$result = external_api::clean_returnvalue(mod_feedback_external::get_non_respondents_returns(), $result);
$this->assertCount(0, $result['warnings']);
$this->assertCount(1, $result['users']);
$this->assertEquals($anotherstudent->id, $result['users'][0]);
$this->assertEquals($anotherstudent->id, $result['users'][0]['userid']);
// Create another student.
$anotherstudent2 = self::getDataGenerator()->create_user();