MDL-86699 mod_forum: use course category/module entities in report.

Enhance, and set benchmark for other course module reports in, the
forum custom report source by including category and module data.
This commit is contained in:
Paul Holden
2025-12-04 15:07:46 +00:00
parent 9529a59a91
commit a3996db063
4 changed files with 74 additions and 19 deletions
@@ -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
@@ -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());
@@ -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 <[email protected]>
* @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");
}
}
@@ -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',
'<div class="text_to_html">My cool forum</div>',
'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,