MDL-80245 reportbuilder: define custom report tags area.

This commit is contained in:
Paul Holden 2023-11-17 15:40:22 +00:00
parent b2fa19f45d
commit a1f064339d
No known key found for this signature in database
GPG Key ID: A81A96D6045F6164
8 changed files with 87 additions and 8 deletions

View File

@ -263,6 +263,7 @@ $string['sorting'] = 'Sorting';
$string['sorting_help'] = 'You can set the initial sort order of columns in the report, which can then be changed by users by clicking on column names.';
$string['switchedit'] = 'Switch to edit mode';
$string['switchpreview'] = 'Switch to preview mode';
$string['tagarea_reportbuilder_report'] = 'Custom reports';
$string['tasksendschedule'] = 'Send report schedule';
$string['tasksendschedules'] = 'Send report schedules';
$string['timeadded'] = 'Time added';

View File

@ -93,4 +93,10 @@ $tagareas = [
'callback' => 'badge_get_tagged_badges',
'callbackfile' => '/badges/lib.php',
],
[
'itemtype' => 'reportbuilder_report',
'component' => 'core_reportbuilder',
'callback' => 'core_reportbuilder_get_tagged_reports',
'callbackfile' => '/reportbuilder/lib.php',
],
];

View File

@ -26,6 +26,7 @@ use core_reportbuilder\manager;
use core_reportbuilder\local\models\column;
use core_reportbuilder\local\models\filter;
use core_reportbuilder\local\models\report as report_model;
use core_tag_tag;
/**
* Helper class for manipulating custom reports and their elements (columns, filters, conditions, etc)
@ -48,19 +49,24 @@ class report {
$data->name = trim($data->name);
$data->type = datasource::TYPE_CUSTOM_REPORT;
$reportpersistent = manager::create_report_persistent($data);
// Create report persistent.
$report = manager::create_report_persistent($data);
// Add datasource default columns, filters and conditions to the report.
if ($default) {
$source = $reportpersistent->get('source');
$source = $report->get('source');
/** @var datasource $datasource */
$datasource = new $source($reportpersistent, []);
$datasource = new $source($report);
$datasource->add_default_columns();
$datasource->add_default_filters();
$datasource->add_default_conditions();
}
return $reportpersistent;
// Report tags.
core_tag_tag::set_item_tags('core_reportbuilder', 'reportbuilder_report', $report->get('id'),
$report->get_context(), $data->tags);
return $report;
}
/**
@ -80,6 +86,10 @@ class report {
'uniquerows' => $data->uniquerows,
])->update();
// Report tags.
core_tag_tag::set_item_tags('core_reportbuilder', 'reportbuilder_report', $report->get('id'),
$report->get_context(), $data->tags);
return $report;
}
@ -96,6 +106,9 @@ class report {
throw new invalid_parameter_exception('Invalid report');
}
// Report tags.
core_tag_tag::remove_all_item_tags('core_reportbuilder', 'reportbuilder_report', $report->get('id'));
return $report->delete();
}

View File

@ -51,6 +51,12 @@ class core_reportbuilder_generator extends component_generator_base {
throw new coding_exception('Record must contain \'source\' property');
}
// Report tags.
$tags = $record['tags'] ?? '';
if (!is_array($tags)) {
$record['tags'] = preg_split('/\s*,\s*/', $tags, -1, PREG_SPLIT_NO_EMPTY);
}
// Include default setup unless specifically disabled in passed record.
$default = (bool) ($record['default'] ?? true);

View File

@ -21,6 +21,7 @@ namespace core_reportbuilder;
use advanced_testcase;
use core_reportbuilder_generator;
use core_reportbuilder\local\models\{audience, column, filter, report, schedule};
use core_tag_tag;
use core_user\reportbuilder\datasource\users;
/**
@ -44,9 +45,11 @@ class generator_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']]);
$this->assertTrue(report::record_exists($report->get('id')));
$this->assertEqualsCanonicalizing(['cat', 'dog'],
core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report->get('id')));
}
/**

View File

@ -21,8 +21,10 @@ namespace core_reportbuilder\local\helpers;
use advanced_testcase;
use core_reportbuilder_generator;
use invalid_parameter_exception;
use core_reportbuilder\datasource;
use core_reportbuilder\local\models\column;
use core_reportbuilder\local\models\filter;
use core_tag_tag;
use core_user\reportbuilder\datasource\users;
/**
@ -35,6 +37,49 @@ use core_user\reportbuilder\datasource\users;
*/
class report_test extends advanced_testcase {
/**
* Test creation report
*/
public function test_create_report(): void {
$this->resetAfterTest();
$this->setAdminUser();
$report = report::create_report((object) [
'name' => 'My report',
'source' => users::class,
'tags' => ['cat', 'dog'],
]);
$this->assertEquals('My report', $report->get('name'));
$this->assertEquals(datasource::TYPE_CUSTOM_REPORT, $report->get('type'));
$this->assertEqualsCanonicalizing(['cat', 'dog'],
core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report->get('id')));
}
/**
* Test updating report
*/
public function test_update_report(): void {
$this->resetAfterTest();
$this->setAdminUser();
/** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$report = $generator->create_report(['name' => 'My report', 'source' => users::class, 'uniquerows' => 0]);
$reportupdated = report::update_report((object) [
'id' => $report->get('id'),
'name' => 'My renamed report',
'uniquerows' => 1,
'tags' => ['cat', 'dog'],
]);
$this->assertEquals('My renamed report', $reportupdated->get('name'));
$this->assertTrue($reportupdated->get('uniquerows'));
$this->assertEqualsCanonicalizing(['cat', 'dog'],
core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $reportupdated->get('id')));
}
/**
* Test deleting report
*/
@ -46,7 +91,8 @@ class report_test extends advanced_testcase {
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
// Create Report1 and add some elements.
$report1 = $generator->create_report(['name' => 'My report 1', 'source' => users::class, 'default' => false]);
$report1 = $generator->create_report(['name' => 'My report 1', 'source' => users::class, 'default' => false,
'tags' => ['cat', 'dog']]);
$column1 = $generator->create_column(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']);
$filter1 = $generator->create_filter(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']);
$condition1 = $generator->create_condition(['reportid' => $report1->get('id'), 'uniqueidentifier' => 'user:email']);
@ -58,13 +104,15 @@ class report_test extends advanced_testcase {
$condition2 = $generator->create_condition(['reportid' => $report2->get('id'), 'uniqueidentifier' => 'user:email']);
// Delete Report1.
report::delete_report($report1->get('id'));
$result = report::delete_report($report1->get('id'));
$this->assertTrue($result);
// Make sure Report1, and all it's elements are deleted.
$this->assertFalse($report1::record_exists($report1->get('id')));
$this->assertFalse($column1::record_exists($column1->get('id')));
$this->assertFalse($filter1::record_exists($filter1->get('id')));
$this->assertFalse($condition1::record_exists($condition1->get('id')));
$this->assertEmpty(core_tag_tag::get_item_tags_array('core_reportbuilder', 'reportbuilder_report', $report1->get('id')));
// Make sure Report2, and all it's elements still exist.
$this->assertTrue($report2::record_exists($report2->get('id')));

View File

@ -15,6 +15,8 @@ Information provided here is intended especially for developers.
* The base datasource `add_all_from_entity` method accepts additional parameters to limit which columns, filters and conditions
are added. The `add_[columns|filters|conditions]_from_entity` class methods also now support wildcard matching in both `$include`
and `$exclude` parameters
* Custom reports now implement the tag API, with options for specifying in the `report::[create|update]_report` helper methods
as well as in the `create_report` test generator method
* New report filter types:
- `filesize` for reports containing filesize data

View File

@ -29,7 +29,7 @@
defined('MOODLE_INTERNAL') || die();
$version = 2024030500.00; // YYYYMMDD = weekly release date of this DEV branch.
$version = 2024030600.00; // YYYYMMDD = weekly release date of this DEV branch.
// RR = release increments - 00 in DEV branches.
// .XX = incremental changes.
$release = '4.4dev+ (Build: 20240305)'; // Human-friendly version name