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:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user