From 866dffabfccf884d5e49585181e279c9fca4a635 Mon Sep 17 00:00:00 2001 From: David Kelly Date: Fri, 16 May 2025 12:55:39 +0000 Subject: [PATCH] MDL-85516 mod_assign: Include site-suspended users with submissions when 'Include suspended participants' is enabled --- mod/assign/locallib.php | 18 +++++++ .../tests/locallib_participants_test.php | 51 +++++++++++++++++++ 2 files changed, 69 insertions(+) diff --git a/mod/assign/locallib.php b/mod/assign/locallib.php index 929ae113..5fd00e96 100644 --- a/mod/assign/locallib.php +++ b/mod/assign/locallib.php @@ -2359,6 +2359,24 @@ class assign { $users = $DB->get_records_sql($sql, $params); + // Append site-suspended users with submissions if 'Include suspended participants' is enabled. + if (!$this->show_only_active_users()) { + $suspendedusers = $DB->get_records_sql(" + SELECT u.* + FROM {user} u + JOIN {assign_submission} s ON s.userid = u.id + WHERE s.assignment = :assignid + AND u.suspended = 1 + AND u.deleted = 0 + ", ['assignid' => $instance->id]); + + foreach ($suspendedusers as $suser) { + if (!array_key_exists($suser->id, $users)) { + $users[$suser->id] = $suser; + } + } + } + $cm = $this->get_course_module(); $info = new \core_availability\info_module($cm); $users = $info->filter_user_list($users); diff --git a/mod/assign/tests/locallib_participants_test.php b/mod/assign/tests/locallib_participants_test.php index 38d784ac..0e6c0523 100644 --- a/mod/assign/tests/locallib_participants_test.php +++ b/mod/assign/tests/locallib_participants_test.php @@ -175,4 +175,55 @@ final class locallib_participants_test extends \advanced_testcase { $this->setUser($previoususer); } + + /** + * Ensure site-suspended users with submissions are listed when "include suspended" is enabled. + */ + public function test_list_participants_includes_site_suspended_users_with_submissions(): void { + global $DB; + + $this->resetAfterTest(true); + + // Create course, teacher, and assignment. + $course = self::getDataGenerator()->create_course(); + $teacher = self::getDataGenerator()->create_and_enrol($course, 'teacher'); + $student = self::getDataGenerator()->create_and_enrol($course, 'student'); + $assign = $this->create_instance($course); + + // Add a submission and submit for grading. + $this->add_submission($student, $assign); + $this->submit_for_grading($student, $assign); + + // Confirm the submission exists. + $submission = $DB->get_record('assign_submission', [ + 'assignment' => $assign->get_instance()->id, + 'userid' => $student->id + ]); + $this->assertNotEmpty($submission, 'Submission should exist before suspension'); + + // Suspend the user site-wide. + $DB->set_field('user', 'suspended', 1, ['id' => $student->id]); + + // Re-instantiate assign class, but force "include suspended" to true. + $assign = new testable_assign_with_includesuspended( + $assign->get_context(), + $assign->get_course_module(), + $assign->get_course() + ); + + // Get participants. + $participants = $assign->list_participants(0, false); + + // Assert that the suspended user is included. + $this->assertArrayHasKey($student->id, $participants, 'Suspended user with submission should be listed'); + } +} + +/** + * Testable assign class that always includes suspended users. + */ +class testable_assign_with_includesuspended extends \assign { + public function show_only_active_users(): bool { + return false; // Simulates "Include suspended users" checkbox checked + } } -- 2.39.5