From bfde1fe687c4f2edb51c835e27e834c18674d0cc Mon Sep 17 00:00:00 2001 From: Paul Holden Date: Thu, 4 Apr 2024 14:26:27 +0100 Subject: [PATCH] MDL-81433 reportbuilder: return custom report tag data in WS calls. --- .../external/custom_report_details_exporter.php | 6 ++++++ .../external/custom_report_details_exporter_test.php | 9 +++++++-- .../tests/external/reports/listing_test.php | 12 ++++++++++-- .../tests/external/reports/retrieve_test.php | 8 ++++++-- reportbuilder/upgrade.txt | 6 ++++++ 5 files changed, 35 insertions(+), 6 deletions(-) diff --git a/reportbuilder/classes/external/custom_report_details_exporter.php b/reportbuilder/classes/external/custom_report_details_exporter.php index 1cf896987c5..256b9248d6e 100644 --- a/reportbuilder/classes/external/custom_report_details_exporter.php +++ b/reportbuilder/classes/external/custom_report_details_exporter.php @@ -24,6 +24,7 @@ use core\external\persistent_exporter; use core_reportbuilder\datasource; use core_reportbuilder\manager; use core_reportbuilder\local\models\report; +use core_tag\external\{tag_item_exporter, util}; use core_user\external\user_summary_exporter; /** @@ -58,6 +59,10 @@ class custom_report_details_exporter extends persistent_exporter { 'type' => PARAM_RAW, 'null' => NULL_ALLOWED, ], + 'tags' => [ + 'type' => tag_item_exporter::read_properties_definition(), + 'multiple' => true, + ], 'modifiedby' => ['type' => user_summary_exporter::read_properties_definition()], ]; } @@ -74,6 +79,7 @@ class custom_report_details_exporter extends persistent_exporter { return [ 'sourcename' => manager::report_source_exists($source, datasource::class) ? $source::get_name() : null, + 'tags' => util::get_item_tags('core_reportbuilder', 'reportbuilder_report', $this->persistent->get('id')), 'modifiedby' => (new user_summary_exporter($usermodified))->export($output), ]; } diff --git a/reportbuilder/tests/external/custom_report_details_exporter_test.php b/reportbuilder/tests/external/custom_report_details_exporter_test.php index 4e143003e8b..2585e2d4c16 100644 --- a/reportbuilder/tests/external/custom_report_details_exporter_test.php +++ b/reportbuilder/tests/external/custom_report_details_exporter_test.php @@ -30,7 +30,7 @@ use core_user\reportbuilder\datasource\users; * @copyright 2022 Paul Holden * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class custom_report_details_exporter_test extends advanced_testcase { +final class custom_report_details_exporter_test extends advanced_testcase { /** * Test exported data structure @@ -45,7 +45,7 @@ class custom_report_details_exporter_test extends advanced_testcase { /** @var core_reportbuilder_generator $generator */ $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); - $report = $generator->create_report(['name' => 'My report', 'source' => users::class]); + $report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'tags' => ['cat', 'dog']]); $exporter = new custom_report_details_exporter($report); $export = $exporter->export($PAGE->get_renderer('core_reportbuilder')); @@ -55,8 +55,13 @@ class custom_report_details_exporter_test extends advanced_testcase { $this->assertEquals($report->get('source'), $export->source); // Source name should be the name of the source. + $this->assertObjectHasProperty('sourcename', $export); $this->assertEquals(users::get_name(), $export->sourcename); + // We use the tag exporter for report tags. + $this->assertObjectHasProperty('tags', $export); + $this->assertEquals(['cat', 'dog'], array_column($export->tags, 'name')); + // We use the user exporter for the modifier of the report. $this->assertObjectHasProperty('modifiedby', $export); $this->assertEquals(fullname($user), $export->modifiedby->fullname); diff --git a/reportbuilder/tests/external/reports/listing_test.php b/reportbuilder/tests/external/reports/listing_test.php index 8325f6d4487..99f32ce0ec4 100644 --- a/reportbuilder/tests/external/reports/listing_test.php +++ b/reportbuilder/tests/external/reports/listing_test.php @@ -39,7 +39,7 @@ require_once("{$CFG->dirroot}/webservice/tests/helpers.php"); * @copyright 2022 Paul Holden * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class listing_test extends externallib_advanced_testcase { +final class listing_test extends externallib_advanced_testcase { /** * Text execute method @@ -52,7 +52,7 @@ class listing_test extends externallib_advanced_testcase { $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); // Create three reports. - $reportone = $generator->create_report(['name' => 'Report one', 'source' => users::class]); + $reportone = $generator->create_report(['name' => 'Report one', 'source' => users::class, 'tags' => ['cat', 'dog']]); $reporttwo = $generator->create_report(['name' => 'Report two', 'source' => users::class]); $reportthree = $generator->create_report(['name' => 'Report three', 'source' => users::class]); @@ -67,7 +67,15 @@ class listing_test extends externallib_advanced_testcase { $result = listing::execute(); $result = external_api::clean_returnvalue(listing::execute_returns(), $result); + // All data is generated by exporters, just assert relevant sample of each. $this->assertEquals(['Report one', 'Report two'], array_column($result['reports'], 'name')); + + $tagscolumn = array_column($result['reports'], 'tags'); + $this->assertEquals([ + ['cat', 'dog'], + [], + ], array_map(fn(array $tags) => array_column($tags, 'name'), $tagscolumn)); + $this->assertEmpty($result['warnings']); } diff --git a/reportbuilder/tests/external/reports/retrieve_test.php b/reportbuilder/tests/external/reports/retrieve_test.php index ac50ab448ac..9c27cfa5337 100644 --- a/reportbuilder/tests/external/reports/retrieve_test.php +++ b/reportbuilder/tests/external/reports/retrieve_test.php @@ -37,7 +37,7 @@ require_once("{$CFG->dirroot}/webservice/tests/helpers.php"); * @copyright 2022 Paul Holden * @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later */ -class retrieve_test extends externallib_advanced_testcase { +final class retrieve_test extends externallib_advanced_testcase { /** * Text execute method @@ -52,7 +52,8 @@ class retrieve_test extends externallib_advanced_testcase { /** @var core_reportbuilder_generator $generator */ $generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder'); - $report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'default' => false]); + $report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'default' => false, + 'tags' => ['cat', 'dog']]); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:fullname', 'sortenabled' => 1]); $generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'user:email']); @@ -63,6 +64,7 @@ class retrieve_test extends externallib_advanced_testcase { // All data is generated by exporters, just assert relevant sample of each. $this->assertArrayHasKey('details', $result); $this->assertEquals('My report', $result['details']['name']); + $this->assertEquals(['cat', 'dog'], array_column($result['details']['tags'], 'name')); $this->assertArrayHasKey('data', $result); $this->assertEquals(['Full name', 'Email address'], $result['data']['headers']); @@ -81,8 +83,10 @@ class retrieve_test extends externallib_advanced_testcase { $result = retrieve::execute($report->get('id'), 1, 2); $result = external_api::clean_returnvalue(retrieve::execute_returns(), $result); + // All data is generated by exporters, just assert relevant sample of each. $this->assertArrayHasKey('details', $result); $this->assertEquals('My report', $result['details']['name']); + $this->assertEquals(['cat', 'dog'], array_column($result['details']['tags'], 'name')); $this->assertArrayHasKey('data', $result); $this->assertEquals(['Full name', 'Email address'], $result['data']['headers']); diff --git a/reportbuilder/upgrade.txt b/reportbuilder/upgrade.txt index 08c38f8fb39..42222b6f086 100644 --- a/reportbuilder/upgrade.txt +++ b/reportbuilder/upgrade.txt @@ -1,6 +1,12 @@ This file describes API changes in /reportbuilder/* Information provided here is intended especially for developers. +=== 4.5 === + +* The following external methods now return tags data relevant to each custom report: + - `core_reportbuilder_list_reports` + - `core_reportbuilder_retrieve_report` + === 4.4 === * New methods `get_identity_[columns|filters]` in user entity, for retrieving all user identity field report elements