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:
Laurent David
2025-08-06 01:34:17 +00:00
committed by Jenkins
parent 390333268c
commit 893e1c1005
3 changed files with 72 additions and 6 deletions
+19 -6
View File
@@ -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;
}
////////////////////////////////////////////////
+7
View File
@@ -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) {
+46
View File
@@ -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]);
}
}