MDL-76301 course: Add course overview files to courses datasource

This commit is contained in:
David Matamoros 2022-11-24 10:53:03 +01:00
parent 5019abfdd6
commit facc3322e4
6 changed files with 80 additions and 13 deletions

View File

@ -19,10 +19,12 @@ declare(strict_types=1);
namespace core_course\reportbuilder\datasource;
use core_course\reportbuilder\local\entities\course_category;
use core_files\reportbuilder\local\entities\file;
use core_reportbuilder\datasource;
use core_reportbuilder\local\entities\course;
use core_reportbuilder\local\helpers\database;
use core_tag\reportbuilder\local\entities\tag;
use lang_string;
/**
* Courses datasource
@ -70,6 +72,20 @@ class courses extends datasource {
$this->add_entity($tagentity
->add_joins($courseentity->get_tag_joins()));
// Join the files entity.
$contextalias = $courseentity->get_table_alias('context');
$fileentity = (new file())
->set_entity_title(new lang_string('courseoverviewfiles'));
$filesalias = $fileentity->get_table_alias('files');
$this->add_entity($fileentity
->add_join($courseentity->get_context_join())
->add_join("LEFT JOIN {files} {$filesalias}
ON {$filesalias}.contextid = {$contextalias}.id
AND {$filesalias}.component = 'course'
AND {$filesalias}.filearea = 'overviewfiles'
AND {$filesalias}.itemid = 0
AND {$filesalias}.filename != '.'"));
// Add all columns/filters/conditions from entities to be available in custom reports.
$this->add_all_from_entity($coursecatentity->get_entity_name());
$this->add_all_from_entity($courseentity->get_entity_name());
@ -78,6 +94,12 @@ class courses extends datasource {
$this->add_columns_from_entity($tagentity->get_entity_name(), ['name', 'namewithlink']);
$this->add_filter($tagentity->get_filter('name'));
$this->add_condition($tagentity->get_condition('name'));
// Add specific file entity elements.
$this->add_columns_from_entity($fileentity->get_entity_name(), ['name', 'size', 'type', 'timecreated']);
$this->add_filters_from_entity($fileentity->get_entity_name(), ['name', 'size', 'timecreated']);
$this->add_conditions_from_entity($fileentity->get_entity_name(), ['name', 'size', 'timecreated']);
}
/**

View File

@ -18,6 +18,7 @@ declare(strict_types=1);
namespace core_course\reportbuilder\datasource;
use context_course;
use core_customfield_generator;
use core_reportbuilder_testcase;
use core_reportbuilder_generator;
@ -77,6 +78,16 @@ class courses_test extends core_reportbuilder_testcase {
$course = $this->getDataGenerator()->create_course(['tags' => ['Horses']]);
// Add a course image.
get_file_storage()->create_file_from_string([
'contextid' => context_course::instance($course->id)->id,
'component' => 'course',
'filearea' => 'overviewfiles',
'itemid' => 0,
'filepath' => '/',
'filename' => 'HelloWorld.jpg',
], 'HelloWorld');
/** @var core_reportbuilder_generator $generator */
$generator = $this->getDataGenerator()->get_plugin_generator('core_reportbuilder');
$report = $generator->create_report(['name' => 'Courses', 'source' => courses::class, 'default' => 0]);
@ -91,6 +102,9 @@ class courses_test extends core_reportbuilder_testcase {
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'tag:name']);
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'tag:namewithlink']);
// File entity.
$generator->create_column(['reportid' => $report->get('id'), 'uniqueidentifier' => 'file:name']);
$content = $this->get_custom_report_content($report->get('id'));
$this->assertCount(1, $content);
@ -99,6 +113,7 @@ class courses_test extends core_reportbuilder_testcase {
$this->assertEquals($course->fullname, $courserow[1]);
$this->assertEquals('Horses', $courserow[2]);
$this->assertStringContainsString('Horses', $courserow[3]);
$this->assertEquals('HelloWorld.jpg', $courserow[4]);
}
/**

View File

@ -54,7 +54,7 @@ class custom_report_audience_cards_exporter_test extends advanced_testcase {
$menucardsite = reset($menucardsite);
$this->assertNotEmpty($menucardsite['key']);
$this->assertGreaterThanOrEqual(4, $menucardsite['items']);
$this->assertGreaterThanOrEqual(4, count($menucardsite['items']));
// Test the structure of the first menu card item.
$menucarditem = reset($menucardsite['items']);

View File

@ -51,8 +51,8 @@ class custom_report_column_cards_exporter_test extends advanced_testcase {
$export = $exporter->export($PAGE->get_renderer('core_reportbuilder'));
// The root of the menu cards property should contain each entity.
$this->assertCount(3, $export->menucards);
[$menucardcategory, $menucardcourse, $menucardtag] = $export->menucards;
$this->assertCount(4, $export->menucards);
[$menucardcategory, $menucardcourse, $menucardtag, $menucardfile] = $export->menucards;
// Course category entity menu card.
$this->assertEquals('Course category', $menucardcategory['name']);
@ -95,5 +95,19 @@ class custom_report_column_cards_exporter_test extends advanced_testcase {
'title' => 'Add column \'Tag name\'',
'action' => 'report-add-column',
], $menucarditem);
// File entity menu card.
$this->assertEquals('Course image', $menucardfile['name']);
$this->assertEquals('file', $menucardfile['key']);
$this->assertNotEmpty($menucardfile['items']);
// Test the structure of the first menu card item.
$menucarditem = reset($menucardfile['items']);
$this->assertEquals([
'name' => 'Filename',
'identifier' => 'file:name',
'title' => 'Add column \'Filename\'',
'action' => 'report-add-column',
], $menucarditem);
}
}

View File

@ -54,12 +54,12 @@ class custom_report_conditions_exporter_test extends advanced_testcase {
$this->assertTrue($export->hasavailableconditions);
// The root of the available conditions property should contain each entity.
$this->assertCount(3, $export->availableconditions);
[$conditionscategory, $conditionscourse, $conditionstag] = $export->availableconditions;
$this->assertCount(4, $export->availableconditions);
[$conditionscategory, $conditionscourse, $conditionstag, $conditionsfile] = $export->availableconditions;
// Course category conditions, assert structure of first item.
$this->assertEquals('Course category', $conditionscategory['optiongroup']['text']);
$this->assertGreaterThanOrEqual(1, $conditionscategory['optiongroup']['values']);
$this->assertGreaterThanOrEqual(1, count($conditionscategory['optiongroup']['values']));
$this->assertEquals([
'value' => 'course_category:name',
'visiblename' => 'Select category',
@ -67,7 +67,7 @@ class custom_report_conditions_exporter_test extends advanced_testcase {
// Course conditions, assert structure of first item.
$this->assertEquals('Course', $conditionscourse['optiongroup']['text']);
$this->assertGreaterThanOrEqual(1, $conditionscourse['optiongroup']['values']);
$this->assertGreaterThanOrEqual(1, count($conditionscourse['optiongroup']['values']));
$this->assertEquals([
'value' => 'course:fullname',
'visiblename' => 'Course full name',
@ -78,12 +78,20 @@ class custom_report_conditions_exporter_test extends advanced_testcase {
// Tag conditions, assert structure of first item.
$this->assertEquals('Tag', $conditionstag['optiongroup']['text']);
$this->assertGreaterThanOrEqual(1, $conditionstag['optiongroup']['values']);
$this->assertGreaterThanOrEqual(1, count($conditionstag['optiongroup']['values']));
$this->assertEquals([
'value' => 'tag:name',
'visiblename' => 'Tag name',
], $conditionstag['optiongroup']['values'][0]);
// File conditions, assert structure of first item.
$this->assertEquals('Course image', $conditionsfile['optiongroup']['text']);
$this->assertGreaterThanOrEqual(1, count($conditionsfile['optiongroup']['values']));
$this->assertEquals([
'value' => 'file:name',
'visiblename' => 'Filename',
], $conditionsfile['optiongroup']['values'][0]);
// The active conditions are contained inside form HTML, just assert there's something present.
$this->assertTrue($export->hasactiveconditions);
$this->assertNotEmpty($export->activeconditionsform);

View File

@ -67,12 +67,12 @@ class custom_report_filters_exporter_test extends advanced_testcase {
$this->assertTrue($export->hasavailablefilters);
// The root of the available filters property should contain each entity.
$this->assertCount(3, $export->availablefilters);
[$filterscategory, $filterscourse, $filterstag] = $export->availablefilters;
$this->assertCount(4, $export->availablefilters);
[$filterscategory, $filterscourse, $filterstag, $filtersfile] = $export->availablefilters;
// Course category filters, assert structure of first item.
$this->assertEquals('Course category', $filterscategory['optiongroup']['text']);
$this->assertGreaterThanOrEqual(1, $filterscategory['optiongroup']['values']);
$this->assertGreaterThanOrEqual(1, count($filterscategory['optiongroup']['values']));
$this->assertEquals([
'value' => 'course_category:text',
'visiblename' => 'Category name',
@ -80,7 +80,7 @@ class custom_report_filters_exporter_test extends advanced_testcase {
// Course filters, assert structure of first item.
$this->assertEquals('Course', $filterscourse['optiongroup']['text']);
$this->assertGreaterThanOrEqual(1, $filterscourse['optiongroup']['values']);
$this->assertGreaterThanOrEqual(1, count($filterscourse['optiongroup']['values']));
$this->assertEquals([
'value' => 'course:fullname',
'visiblename' => 'Course full name',
@ -93,12 +93,20 @@ class custom_report_filters_exporter_test extends advanced_testcase {
// Tag filters, assert structure of first item.
$this->assertEquals('Tag', $filterstag['optiongroup']['text']);
$this->assertGreaterThanOrEqual(1, $filterstag['optiongroup']['values']);
$this->assertGreaterThanOrEqual(1, count($filterstag['optiongroup']['values']));
$this->assertEquals([
'value' => 'tag:name',
'visiblename' => 'Tag name',
], $filterstag['optiongroup']['values'][0]);
// File filters, assert structure of first item.
$this->assertEquals('Course image', $filtersfile['optiongroup']['text']);
$this->assertGreaterThanOrEqual(1, count($filtersfile['optiongroup']['values']));
$this->assertEquals([
'value' => 'file:name',
'visiblename' => 'Filename',
], $filtersfile['optiongroup']['values'][0]);
$this->assertTrue($export->hasactivefilters);
$this->assertCount(2, $export->activefilters);
[$activefiltercourseidnumber, $activefiltercategoryname] = $export->activefilters;