diff --git a/.upgradenotes/MDL-86699-2025112111183228.yml b/.upgradenotes/MDL-86699-2025112111183228.yml new file mode 100644 index 00000000000..09afbc6a751 --- /dev/null +++ b/.upgradenotes/MDL-86699-2025112111183228.yml @@ -0,0 +1,7 @@ +issueNumber: MDL-86699 +notes: + mod_forum: + - message: >- + The forum report entity `->get_context_joins()` method is deprecated, + replaced with `->get_course_modules_joins(...)` + type: deprecated diff --git a/public/mod/forum/classes/reportbuilder/datasource/forums.php b/public/mod/forum/classes/reportbuilder/datasource/forums.php index 01b815c221e..96d074ecfc9 100644 --- a/public/mod/forum/classes/reportbuilder/datasource/forums.php +++ b/public/mod/forum/classes/reportbuilder/datasource/forums.php @@ -18,6 +18,7 @@ declare(strict_types=1); namespace mod_forum\reportbuilder\datasource; +use core_course\reportbuilder\local\entities\{course_category, course_module}; use core_reportbuilder\datasource; use core_reportbuilder\local\entities\{course, user}; use mod_forum\reportbuilder\local\entities\{forum, discussion, post}; @@ -47,12 +48,13 @@ class forums extends datasource { [ 'context' => $contextalias, + 'course_modules' => $coursemodulesalias, 'forum' => $forumalias, ] = $forumentity->get_table_aliases(); $this->set_main_table('forum', $forumalias); $this->add_entity($forumentity - ->add_joins($forumentity->get_context_joins())); + ->add_joins($forumentity->get_course_modules_joins('forum', "{$forumalias}.id"))); // Join the course entity. $courseentity = new course(); @@ -60,6 +62,19 @@ class forums extends datasource { $this->add_entity($courseentity ->add_join("LEFT JOIN {course} {$coursealias} ON {$coursealias}.id = {$forumalias}.course")); + // Join the course category entity. + $coursecatentity = new course_category(); + $coursecatalias = $coursecatentity->get_table_alias('course_categories'); + $this->add_entity($coursecatentity + ->add_joins($courseentity->get_joins()) + ->add_join("LEFT JOIN {course_categories} {$coursecatalias} ON {$coursecatalias}.id = {$coursealias}.category")); + + // Join the course module entity. + $coursemodentity = (new course_module()) + ->set_table_alias('course_modules', $coursemodulesalias); + $this->add_entity($coursemodentity + ->add_joins($forumentity->get_joins())); + // Join the discussion entity. $discussionentity = (new discussion()) ->set_table_alias('context', $contextalias); @@ -84,7 +99,9 @@ class forums extends datasource { ->add_join("LEFT JOIN {user} {$useralias} ON {$useralias}.id = {$postalias}.userid")); // Add report elements from each of the entities we added to the report. + $this->add_all_from_entity($coursecatentity->get_entity_name()); $this->add_all_from_entity($courseentity->get_entity_name()); + $this->add_all_from_entity($coursemodentity->get_entity_name()); $this->add_all_from_entity($forumentity->get_entity_name()); $this->add_all_from_entity($discussionentity->get_entity_name()); $this->add_all_from_entity($postentity->get_entity_name()); diff --git a/public/mod/forum/classes/reportbuilder/local/entities/forum.php b/public/mod/forum/classes/reportbuilder/local/entities/forum.php index fe091a0d5f9..f8d8939748c 100644 --- a/public/mod/forum/classes/reportbuilder/local/entities/forum.php +++ b/public/mod/forum/classes/reportbuilder/local/entities/forum.php @@ -20,9 +20,9 @@ namespace mod_forum\reportbuilder\local\entities; use core\{context, context_helper}; use core\lang_string; -use core_reportbuilder\local\entities\base; +use core_course\reportbuilder\local\entities\course_module_base; use core_reportbuilder\local\filters\{date, select, text}; -use core_reportbuilder\local\helpers\{database, format}; +use core_reportbuilder\local\helpers\format; use core_reportbuilder\local\report\{column, filter}; use stdClass; @@ -33,17 +33,19 @@ use stdClass; * @copyright 2025 Paul Holden * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class forum extends base { +class forum extends course_module_base { /** * Database tables that this entity uses * * @return string[] */ protected function get_default_tables(): array { - return [ - 'context', - 'forum', - ]; + return array_merge( + parent::get_default_tables(), + [ + 'forum', + ], + ); } /** @@ -228,20 +230,17 @@ class forum extends base { * Return context joins * * @return string[] + * + * @deprecated since Moodle 5.2 - please do not use this function any more, {@see get_course_modules_joins} */ + #[\core\attribute\deprecated('::get_course_modules_joins', since: '5.2', mdl: 'MDL-86699')] public function get_context_joins(): array { + \core\deprecation::emit_deprecation([self::class, __FUNCTION__]); + [ - 'context' => $contextalias, 'forum' => $forumalias, ] = $this->get_table_aliases(); - [$coursemodulealias, $modulealias] = database::generate_aliases(2); - - return [ - "JOIN {course_modules} {$coursemodulealias} ON {$coursemodulealias}.instance = {$forumalias}.id", - "JOIN {modules} {$modulealias} ON {$modulealias}.id = {$coursemodulealias}.module AND {$modulealias}.name = 'forum'", - "JOIN {context} {$contextalias} ON {$contextalias}.contextlevel = " . CONTEXT_MODULE . " - AND {$contextalias}.instanceid = {$coursemodulealias}.id", - ]; + return $this->get_course_modules_joins('forum', "{$forumalias}.id"); } } diff --git a/public/mod/forum/tests/reportbuilder/datasource/forums_test.php b/public/mod/forum/tests/reportbuilder/datasource/forums_test.php index 674d7a1c93b..6e4248e93c5 100644 --- a/public/mod/forum/tests/reportbuilder/datasource/forums_test.php +++ b/public/mod/forum/tests/reportbuilder/datasource/forums_test.php @@ -109,7 +109,8 @@ final class forums_test extends core_reportbuilder_testcase { $this->resetAfterTest(); $this->setAdminUser(); - $course = $this->getDataGenerator()->create_course(); + $category = $this->getDataGenerator()->create_category(); + $course = $this->getDataGenerator()->create_course(['category' => $category->id]); $user = $this->getDataGenerator()->create_and_enrol($course); /** @var mod_forum_generator $generator */ @@ -117,6 +118,7 @@ final class forums_test extends core_reportbuilder_testcase { $forum = $generator->create_instance([ 'course' => $course->id, + 'idnumber' => 'FORUM1', 'intro' => 'My cool forum', 'duedate' => $this->clock->time() + DAYSECS, 'cutoffdate' => $this->clock->time() + WEEKSECS, @@ -135,6 +137,12 @@ final class forums_test extends core_reportbuilder_testcase { $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); $report = $generator->create_report(['name' => 'Forums', 'source' => forums::class, 'default' => 0]); + // Course category. + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_category:name']); + + // Course module. + $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'course_module:idnumber']); + // Forum. $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'forum:description']); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'forum:type']); @@ -157,6 +165,8 @@ final class forums_test extends core_reportbuilder_testcase { $this->assertEquals([ [ + $category->get_formatted_name(), + 'FORUM1', '
My cool forum
', 'Standard forum for general use', 'Wednesday, 2 June 2021, 7:00 AM', @@ -180,6 +190,16 @@ final class forums_test extends core_reportbuilder_testcase { */ public static function datasource_filters_provider(): array { return [ + // Course category. + 'Course category name' => ['course_category:text', [ + 'course_category:text_operator' => text::IS_EQUAL_TO, + 'course_category:text_value' => 'My category', + ], true], + 'Course category name (no match)' => ['course_category:text', [ + 'course_category:text_operator' => text::IS_EQUAL_TO, + 'course_category:text_value' => 'Another category', + ], false], + // Course. 'Course fullname' => ['course:fullname', [ 'course:fullname_operator' => text::IS_EQUAL_TO, @@ -190,6 +210,16 @@ final class forums_test extends core_reportbuilder_testcase { 'course:fullname_value' => 'Another course', ], false], + // Course module. + 'Course module ID number' => ['course_module:idnumber', [ + 'course_module:idnumber_operator' => text::IS_EQUAL_TO, + 'course_module:idnumber_value' => 'FORUM1', + ], true], + 'Course module ID number (no match)' => ['course_module:idnumber', [ + 'course_module:idnumber_operator' => text::IS_EQUAL_TO, + 'course_module:idnumber_value' => 'FORUM2', + ], false], + // Forum. 'Forum name' => ['forum:name', [ 'forum:name_operator' => text::IS_EQUAL_TO, @@ -341,7 +371,8 @@ final class forums_test extends core_reportbuilder_testcase { $this->resetAfterTest(); $this->setAdminUser(); - $course = $this->getDataGenerator()->create_course(['fullname' => 'My course']); + $category = $this->getDataGenerator()->create_category(['name' => 'My category']); + $course = $this->getDataGenerator()->create_course(['category' => $category->id, 'fullname' => 'My course']); $user = $this->getDataGenerator()->create_and_enrol($course, 'student', ['firstname' => 'Zoe']); /** @var mod_forum_generator $generator */ @@ -349,6 +380,7 @@ final class forums_test extends core_reportbuilder_testcase { $forum = $generator->create_instance([ 'course' => $course->id, + 'idnumber' => 'FORUM1', 'name' => 'My forum', 'intro' => 'My cool forum', 'duedate' => $this->clock->time() + DAYSECS,