diff --git a/mod/feedback/lib.php b/mod/feedback/lib.php index ae282bc0742..66fc211e998 100644 --- a/mod/feedback/lib.php +++ b/mod/feedback/lib.php @@ -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; } //////////////////////////////////////////////// diff --git a/mod/feedback/show_entries.php b/mod/feedback/show_entries.php index 7b3b0af424f..424438734ad 100644 --- a/mod/feedback/show_entries.php +++ b/mod/feedback/show_entries.php @@ -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) { diff --git a/mod/feedback/tests/lib_test.php b/mod/feedback/tests/lib_test.php index 4303be3311b..24625409fb1 100644 --- a/mod/feedback/tests/lib_test.php +++ b/mod/feedback/tests/lib_test.php @@ -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]); + } }