mirror of
https://github.com/moodle/moodle.git
synced 2025-04-21 00:12:56 +02:00
MDL-76301 course: Add course overview files to courses datasource
This commit is contained in:
parent
5019abfdd6
commit
facc3322e4
@ -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']);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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]);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -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']);
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
|
@ -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;
|
||||
|
Loading…
x
Reference in New Issue
Block a user