This commit is contained in:
Ilya Tregubov
2022-06-15 14:36:16 +04:00
4 changed files with 126 additions and 19 deletions
+24 -13
View File
@@ -47,6 +47,25 @@ class dataformat extends base {
}
}
/**
* Given a list of dataformat types, return them sorted according to site configuration (if set)
*
* @param string[] $formats List of formats, ['csv', 'pdf', etc]
* @return string[] List of formats according to configured sort, ['csv', 'odf', etc]
*/
private static function get_plugins_sortorder(array $formats): array {
global $CFG;
if (!empty($CFG->dataformat_plugins_sortorder)) {
$order = explode(',', $CFG->dataformat_plugins_sortorder);
$order = array_merge(array_intersect($order, $formats), array_diff($formats, $order));
} else {
$order = $formats;
}
return $order;
}
/**
* Gathers and returns the information about all plugins of the given type
*
@@ -57,16 +76,9 @@ class dataformat extends base {
* @return array of plugintype classes, indexed by the plugin name
*/
public static function get_plugins($type, $typerootdir, $typeclass, $pluginman) {
global $CFG;
$formats = parent::get_plugins($type, $typerootdir, $typeclass, $pluginman);
if (!empty($CFG->dataformat_plugins_sortorder)) {
$order = explode(',', $CFG->dataformat_plugins_sortorder);
$order = array_merge(array_intersect($order, array_keys($formats)),
array_diff(array_keys($formats), $order));
} else {
$order = array_keys($formats);
}
$order = static::get_plugins_sortorder(array_keys($formats));
$sortedformats = array();
foreach ($order as $formatname) {
$sortedformats[$formatname] = $formats[$formatname];
@@ -79,18 +91,17 @@ class dataformat extends base {
* @return array|null of enabled plugins $pluginname=>$pluginname, null means unknown
*/
public static function get_enabled_plugins() {
$enabled = array();
$plugins = core_plugin_manager::instance()->get_installed_plugins('dataformat');
if (!$plugins) {
return array();
}
$order = static::get_plugins_sortorder(array_keys($plugins));
$enabled = array();
foreach ($plugins as $plugin => $version) {
$disabled = get_config('dataformat_' . $plugin, 'disabled');
foreach ($order as $formatname) {
$disabled = get_config('dataformat_' . $formatname, 'disabled');
if (empty($disabled)) {
$enabled[$plugin] = $plugin;
$enabled[$formatname] = $formatname;
}
}
return $enabled;
+94
View File
@@ -0,0 +1,94 @@
<?php
// This file is part of Moodle - http://moodle.org/
//
// Moodle is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// Moodle is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with Moodle. If not, see <http://www.gnu.org/licenses/>.
declare(strict_types=1);
namespace core\plugininfo;
use advanced_testcase;
/**
* Unit tests for the dataformat plugininfo class
*
* @package core
* @covers \core\plugininfo\dataformat
* @copyright 2022 Paul Holden <[email protected]>
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
*/
class dataformat_test extends advanced_testcase {
/**
* Helper method, to allow easy filtering of default formats in order to perform assertions without any third-party
* formats affecting expected results
*
* @param string $format
* @return bool
*/
private function filter_default_plugins(string $format): bool {
$defaultformats = ['csv', 'excel', 'html', 'json', 'ods', 'pdf'];
return in_array($format, $defaultformats);
}
/**
* Test getting enabled plugins
*/
public function test_get_enabled_plugins(): void {
$this->resetAfterTest();
// Check all default formats.
$plugins = array_filter(dataformat::get_enabled_plugins(), [$this, 'filter_default_plugins']);
$this->assertEquals([
'csv' => 'csv',
'excel' => 'excel',
'html' => 'html',
'json' => 'json',
'ods' => 'ods',
'pdf' => 'pdf',
], $plugins);
// Disable excel & html.
dataformat::enable_plugin('excel', 0);
dataformat::enable_plugin('html', 0);
$plugins = array_filter(dataformat::get_enabled_plugins(), [$this, 'filter_default_plugins']);
$this->assertEquals([
'csv' => 'csv',
'json' => 'json',
'ods' => 'ods',
'pdf' => 'pdf',
], $plugins);
}
/**
* Test getting enabled plugins obeys configured sortorder
*/
public function test_get_enabled_plugins_sorted(): void {
$this->resetAfterTest();
set_config('dataformat_plugins_sortorder', 'csv,pdf,excel,json,html,ods');
$plugins = array_filter(dataformat::get_enabled_plugins(), [$this, 'filter_default_plugins']);
$this->assertEquals([
'csv' => 'csv',
'pdf' => 'pdf',
'excel' => 'excel',
'json' => 'json',
'html' => 'html',
'ods' => 'ods',
], $plugins);
}
}
@@ -339,10 +339,10 @@ class schedule {
* @return string[]
*/
public static function get_format_options(): array {
$dataformats = core_plugin_manager::instance()->get_plugins_of_type('dataformat');
$dataformats = dataformat::get_enabled_plugins();
return array_map(static function(dataformat $dataformat): string {
return $dataformat->displayname;
return array_map(static function(string $pluginname): string {
return get_string('dataformat', 'dataformat_' . $pluginname);
}, $dataformats);
}
@@ -29,7 +29,6 @@ use core_reportbuilder\local\entities\user;
use core_reportbuilder\local\filters\date;
use core_reportbuilder\local\filters\text;
use core_reportbuilder\local\helpers\format;
use core_reportbuilder\local\helpers\schedule as helper;
use core_reportbuilder\local\models\report;
use core_reportbuilder\local\models\schedule;
use core_reportbuilder\local\report\action;
@@ -198,8 +197,11 @@ class report_schedules extends system_report {
->add_fields("{$tablealias}.format")
->set_is_sortable(true)
->add_callback(static function(string $format): string {
$formats = helper::get_format_options();
return $formats[$format] ?? '';
if (get_string_manager()->string_exists('dataformat', 'dataformat_' . $format)) {
return get_string('dataformat', 'dataformat_' . $format);
} else {
return $format;
}
})
);