diff --git a/.upgradenotes/MDL-86699-2025091811071315.yml b/.upgradenotes/MDL-86699-2025091811071315.yml new file mode 100644 index 00000000000..b8390d082f6 --- /dev/null +++ b/.upgradenotes/MDL-86699-2025091811071315.yml @@ -0,0 +1,12 @@ +issueNumber: MDL-86699 +notes: + core_reportbuilder: + - message: >- + There are two new entities intended for reports specific to course + module data, in order to provide a baseline in terms of module reporting + and API usage: + + + * + `core_course\reportbuilder\local\entities\{course_module,course_module_base}` + type: improved diff --git a/public/course/classes/reportbuilder/local/entities/course_module.php b/public/course/classes/reportbuilder/local/entities/course_module.php new file mode 100644 index 00000000000..a47195107e8 --- /dev/null +++ b/public/course/classes/reportbuilder/local/entities/course_module.php @@ -0,0 +1,140 @@ +. + +declare(strict_types=1); + +namespace core_course\reportbuilder\local\entities; + +use core\lang_string; +use core_reportbuilder\local\entities\base; +use core_reportbuilder\local\filters\{boolean_select, date, text}; +use core_reportbuilder\local\helpers\format; +use core_reportbuilder\local\report\{column, filter}; + +/** + * Course module entity + * + * @package core_course + * @copyright 2025 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +class course_module extends base { + /** + * Database tables that this entity uses + * + * @return string[] + */ + protected function get_default_tables(): array { + return [ + 'course_modules', + ]; + } + + /** + * The default title for this entity + * + * @return lang_string + */ + protected function get_default_entity_title(): lang_string { + return new lang_string('coursemodule', 'core_course'); + } + + /** + * Returns list of all available columns + * + * @return column[] + */ + protected function get_available_columns(): array { + $coursemodulealias = $this->get_table_alias('course_modules'); + + // ID number. + $columns[] = (new column( + 'idnumber', + new lang_string('idnumber'), + $this->get_entity_name(), + )) + ->add_joins($this->get_joins()) + ->add_field("{$coursemodulealias}.idnumber") + ->set_is_sortable(true); + + // Visible. + $columns[] = (new column( + 'visible', + new lang_string('visible'), + $this->get_entity_name(), + )) + ->add_joins($this->get_joins()) + ->set_type(column::TYPE_BOOLEAN) + ->add_field("{$coursemodulealias}.visible") + ->set_is_sortable(true) + ->add_callback([format::class, 'boolean_as_text']); + + // Time created. + $columns[] = (new column( + 'timecreated', + new lang_string('timecreated', 'core_reportbuilder'), + $this->get_entity_name(), + )) + ->add_joins($this->get_joins()) + ->set_type(column::TYPE_TIMESTAMP) + ->add_field("{$coursemodulealias}.added") + ->set_is_sortable(true) + ->add_callback([format::class, 'userdate']); + + return $columns; + } + + /** + * Return list of all available filters + * + * @return filter[] + */ + protected function get_available_filters(): array { + $coursemodulealias = $this->get_table_alias('course_modules'); + + // ID number. + $filters[] = (new filter( + text::class, + 'idnumber', + new lang_string('idnumber'), + $this->get_entity_name(), + "{$coursemodulealias}.idnumber", + )) + ->add_joins($this->get_joins()); + + // Visible. + $filters[] = (new filter( + boolean_select::class, + 'visible', + new lang_string('visible'), + $this->get_entity_name(), + "{$coursemodulealias}.visible", + )) + ->add_joins($this->get_joins()); + + // Time created. + $filters[] = (new filter( + date::class, + 'timecreated', + new lang_string('timecreated', 'core_reportbuilder'), + $this->get_entity_name(), + "{$coursemodulealias}.added", + )) + ->add_joins($this->get_joins()); + + return $filters; + } +} diff --git a/public/course/classes/reportbuilder/local/entities/course_module_base.php b/public/course/classes/reportbuilder/local/entities/course_module_base.php new file mode 100644 index 00000000000..e6cc2ab9e7f --- /dev/null +++ b/public/course/classes/reportbuilder/local/entities/course_module_base.php @@ -0,0 +1,68 @@ +. + +declare(strict_types=1); + +namespace core_course\reportbuilder\local\entities; + +use core_reportbuilder\local\entities\base; +use core_reportbuilder\local\helpers\database; + +/** + * Abstract base course module entity, to be extended by all course module specific entities + * + * @package core_course + * @copyright 2025 Paul Holden + * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later + */ +abstract class course_module_base extends base { + /** + * Database tables that this entity uses + * + * @return string[] + */ + protected function get_default_tables(): array { + return [ + 'context', + 'course_modules', + ]; + } + + /** + * Return course modules joins + * + * @param string $modulename Name of the module, e.g. "forum" + * @param string $modulefieldid Field used to select the module ID, e.g. "f.id" + * @return string[] + */ + final public function get_course_modules_joins(string $modulename, string $modulefieldid): array { + [ + 'context' => $contextalias, + 'course_modules' => $coursemodulesalias, + ] = $this->get_table_aliases(); + + $modulesalias = database::generate_alias(); + + return [ + "JOIN {course_modules} {$coursemodulesalias} + ON {$coursemodulesalias}.instance = {$modulefieldid}", + "JOIN {modules} {$modulesalias} + ON {$modulesalias}.id = {$coursemodulesalias}.module AND {$modulesalias}.name = '{$modulename}'", + "JOIN {context} {$contextalias} + ON {$contextalias}.contextlevel = " . CONTEXT_MODULE . " AND {$contextalias}.instanceid = {$coursemodulesalias}.id", + ]; + } +} diff --git a/public/lang/en/course.php b/public/lang/en/course.php index ef924edf319..192e9c75d3e 100644 --- a/public/lang/en/course.php +++ b/public/lang/en/course.php @@ -68,6 +68,7 @@ $string['coursecontentnotifupdate'] = '{$a->coursename} content change'; $string['coursecontentnotifupdatebody'] = '

{$a->moduletypename} {$a->modulename} has been changed in the course {$a->coursename}.

Change your notification preferences

'; $string['coursecontentnotification_help'] = 'Tick the box to notify course participants about this new or changed activity or resource. Only users who can access the activity or resource will receive the notification.'; $string['coursecount'] = 'Course count'; +$string['coursemodule'] = 'Course module'; $string['coursenotyetstarted'] = 'The course has not yet started'; $string['coursenotyetfinished'] = 'The course has not yet finished'; $string['courseparticipants'] = 'Course participants';