MDL-84463 mod_feedback: Fix users in no group and email
* Non editing teachers in no group should not receive feedback emails from students in no group
This commit is contained in:
+19
-6
@@ -1125,16 +1125,12 @@ function feedback_get_viewreports_users($cmid, $groups = false) {
|
||||
* @uses CONTEXT_MODULE
|
||||
* @param int $cmid
|
||||
* @param mixed $groups single groupid or array of groupids - group(s) user is in
|
||||
* @return object the userrecords
|
||||
* @return stdClass[] the userrecords
|
||||
*/
|
||||
function feedback_get_receivemail_users($cmid, $groups = false) {
|
||||
|
||||
$context = context_module::instance($cmid);
|
||||
|
||||
//description of the call below:
|
||||
//get_users_by_capability($context, $capability, $fields='', $sort='', $limitfrom='',
|
||||
// $limitnum='', $groups='', $exceptions='', $doanything=true)
|
||||
return get_users_by_capability($context,
|
||||
$allusers = get_users_by_capability($context,
|
||||
'mod/feedback:receivemail',
|
||||
'',
|
||||
'lastname',
|
||||
@@ -1143,6 +1139,23 @@ function feedback_get_receivemail_users($cmid, $groups = false) {
|
||||
$groups,
|
||||
'',
|
||||
false);
|
||||
if (empty($groups)) {
|
||||
// Here the user that has submitted the feedback is not in any group.
|
||||
[$course, $cm] = get_course_and_cm_from_cmid($cmid);
|
||||
$groupmode = groups_get_activity_groupmode($cm, $course);
|
||||
if ($groupmode == SEPARATEGROUPS) {
|
||||
// In separate group mode, only the user who can see all groups can see the feedback, so
|
||||
// in turn can receive the notification.
|
||||
$viewallgroupsusers = get_users_by_capability(
|
||||
$context,
|
||||
'moodle/site:accessallgroups',
|
||||
'u.id, u.id'
|
||||
);
|
||||
// Remove users cannot access all groups.
|
||||
$allusers = array_intersect_key($allusers, $viewallgroupsusers);
|
||||
}
|
||||
}
|
||||
return $allusers;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////
|
||||
|
||||
@@ -22,6 +22,8 @@
|
||||
* @package mod_feedback
|
||||
*/
|
||||
|
||||
use mod_feedback\manager;
|
||||
|
||||
require_once("../../config.php");
|
||||
require_once("lib.php");
|
||||
|
||||
@@ -152,6 +154,11 @@ if ($userid || $showcompleted) {
|
||||
// Print the list of responses.
|
||||
$courseselectform->display();
|
||||
|
||||
if (!manager::can_see_others_in_groups($feedbackstructure->get_cm())) {
|
||||
echo $OUTPUT->notification(get_string('notingroup'));
|
||||
echo $OUTPUT->footer();
|
||||
exit();
|
||||
}
|
||||
// Show non-anonymous responses (always retrieve them even if current feedback is anonymous).
|
||||
$totalrows = $responsestable->get_total_responses_count();
|
||||
if (!$feedbackstructure->is_anonymous() || $totalrows) {
|
||||
|
||||
@@ -1163,4 +1163,50 @@ final class lib_test extends \advanced_testcase {
|
||||
);
|
||||
$generator->create_instance($params);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test that if a teacher (non editing) is not part of any group in separate group mode he will not receive notification emails.
|
||||
* @covers ::feedback_get_receivemail_users
|
||||
*/
|
||||
public function test_feedback_get_receivemail_users(): void {
|
||||
$this->resetAfterTest();
|
||||
$generator = $this->getDataGenerator();
|
||||
$course = $generator->create_course(['groupmode' => SEPARATEGROUPS, 'groupmodeforce' => 1]);
|
||||
$group = $generator->create_group(['courseid' => $course->id, 'name' => 'group0']);
|
||||
|
||||
$feedbackgenerator = $generator->get_plugin_generator('mod_feedback');
|
||||
$feedback = $feedbackgenerator->create_instance(['course' => $course->id, 'email_notification' => true]);
|
||||
$teacher = [];
|
||||
$data = [
|
||||
'teacher1' => 'teacher',
|
||||
'teacher2' => 'teacher',
|
||||
'teacher3' => 'editingteacher',
|
||||
'teacher4' => 'editingteacher',
|
||||
];
|
||||
foreach ($data as $username => $role) {
|
||||
$teacher[$username] = $generator->create_user(['username' => $username]);
|
||||
$generator->enrol_user($teacher[$username]->id, $course->id, $role);
|
||||
}
|
||||
$generator->create_group_member([
|
||||
'groupid' => $group->id,
|
||||
'userid' => $teacher['teacher1']->id,
|
||||
]);
|
||||
$generator->create_group_member([
|
||||
'groupid' => $group->id,
|
||||
'userid' => $teacher['teacher4']->id,
|
||||
]);
|
||||
|
||||
$usergroup = $group->id;
|
||||
// Non editing Teachers (teacher1) in a group should receive notification emails.
|
||||
// Editing teachers (teacher4), in a group should also receive notification emails.
|
||||
$teachersingroup = feedback_get_receivemail_users($feedback->cmid, $usergroup);
|
||||
$this->assertCount(2, $teachersingroup);
|
||||
$this->assertNotEmpty($teachersingroup[$teacher['teacher1']->id]);
|
||||
$this->assertNotEmpty($teachersingroup[$teacher['teacher4']->id]);
|
||||
// Here we should return only the editing teachers (teacher3 and 4) who have access to all groups.
|
||||
$teacherwithnogroup = feedback_get_receivemail_users($feedback->cmid);
|
||||
$this->assertCount(2, $teacherwithnogroup);
|
||||
$this->assertNotEmpty($teacherwithnogroup[$teacher['teacher3']->id]);
|
||||
$this->assertNotEmpty($teacherwithnogroup[$teacher['teacher4']->id]);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user