mirror of
https://github.com/moodle/moodle.git
synced 2025-08-05 08:56:36 +02:00
MDL-75148 mod_data: Add isplugin info to presets
This activity currently supports two different preset types: - Datapreset plugins, that can be installed copying them to the mod/data/preset folder. - Presets saved manually by users. This commit adds an attribute to the presets to mark them, in order to identify them later (because, for instance, the plugins can't be removed). Apart from that, the methods in lib.php, involved with this issue, have been deprecated. New methods have been implemented in the manager class, covering them with PHPUnit tests.
This commit is contained in:
parent
abeae6acb2
commit
9d10f7d19e
9 changed files with 508 additions and 88 deletions
|
@ -20,6 +20,7 @@ use context;
|
|||
use moodle_exception;
|
||||
use moodle_url;
|
||||
use core_form\dynamic_form;
|
||||
use mod_data\manager;
|
||||
|
||||
/**
|
||||
* Save database as preset form.
|
||||
|
@ -72,9 +73,11 @@ class save_as_preset extends dynamic_form {
|
|||
|
||||
$errors = parent::validation($formdata, $files);
|
||||
$context = $this->get_context_for_dynamic_submission();
|
||||
$cm = get_coursemodule_from_id('', $context->instanceid, 0, false, MUST_EXIST);
|
||||
$manager = manager::create_from_coursemodule($cm);
|
||||
|
||||
if (!empty($formdata['overwrite'])) {
|
||||
$presets = data_get_available_presets($context);
|
||||
$presets = $manager->get_available_presets();
|
||||
$selectedpreset = new \stdClass();
|
||||
foreach ($presets as $preset) {
|
||||
if ($preset->name == $formdata['name']) {
|
||||
|
@ -87,7 +90,7 @@ class save_as_preset extends dynamic_form {
|
|||
}
|
||||
} else {
|
||||
// If the preset exists now then we need to throw an error.
|
||||
$sitepresets = data_get_available_site_presets($context);
|
||||
$sitepresets = $manager->get_available_saved_presets();
|
||||
foreach ($sitepresets as $preset) {
|
||||
if ($formdata['name'] == $preset->name) {
|
||||
$errors['name'] = get_string('errorpresetexists', 'data');
|
||||
|
@ -137,7 +140,8 @@ class save_as_preset extends dynamic_form {
|
|||
|
||||
try {
|
||||
if (!empty($this->get_data()->overwrite)) {
|
||||
$presets = data_get_available_presets($context);
|
||||
$manager = manager::create_from_coursemodule($cm);
|
||||
$presets = $manager->get_available_presets();
|
||||
$selectedpreset = new \stdClass();
|
||||
foreach ($presets as $preset) {
|
||||
if ($preset->name == $this->get_data()->name) {
|
||||
|
|
|
@ -23,6 +23,7 @@ use data_field_base;
|
|||
use mod_data\event\course_module_viewed;
|
||||
use mod_data\event\template_viewed;
|
||||
use mod_data\event\template_updated;
|
||||
use core_component;
|
||||
use stdClass;
|
||||
|
||||
/**
|
||||
|
@ -300,4 +301,81 @@ class manager {
|
|||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of all the available presets.
|
||||
*
|
||||
* @return array A list with the datapreset plugins and the presets saved by users.
|
||||
*/
|
||||
public function get_available_presets(): array {
|
||||
// First load the datapreset plugins that exist within the modules preset dir.
|
||||
$pluginpresets = static::get_available_plugin_presets();
|
||||
|
||||
// Then find the presets that people have saved.
|
||||
$savedpresets = static::get_available_saved_presets();
|
||||
|
||||
return array_merge($pluginpresets, $savedpresets);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of all the presets that users have saved to the site.
|
||||
*
|
||||
* @return array A list with the preset saved by the users.
|
||||
*/
|
||||
public function get_available_saved_presets(): array {
|
||||
global $USER;
|
||||
|
||||
$presets = [];
|
||||
|
||||
$fs = get_file_storage();
|
||||
$files = $fs->get_area_files(DATA_PRESET_CONTEXT, DATA_PRESET_COMPONENT, DATA_PRESET_FILEAREA);
|
||||
if (empty($files)) {
|
||||
return $presets;
|
||||
}
|
||||
$canviewall = has_capability('mod/data:viewalluserpresets', $this->get_context());
|
||||
foreach ($files as $file) {
|
||||
$isnotdirectory = ($file->is_directory() && $file->get_filepath() == '/') || !$file->is_directory();
|
||||
$userid = $file->get_userid();
|
||||
$cannotviewfile = !$canviewall && $userid != $USER->id;
|
||||
if ($isnotdirectory || $cannotviewfile) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$preset = new stdClass();
|
||||
$preset->isplugin = false;
|
||||
$preset->path = $file->get_filepath();
|
||||
$preset->name = trim($preset->path, '/');
|
||||
$preset->shortname = $preset->name;
|
||||
$preset->userid = $userid;
|
||||
$preset->id = $file->get_id();
|
||||
$preset->storedfile = $file;
|
||||
$presets[] = $preset;
|
||||
}
|
||||
|
||||
return $presets;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of all the available plugin presets.
|
||||
*
|
||||
* @return array A list with the datapreset plugins.
|
||||
*/
|
||||
public static function get_available_plugin_presets(): array {
|
||||
$presets = [];
|
||||
|
||||
$dirs = core_component::get_plugin_list('datapreset');
|
||||
foreach ($dirs as $dir => $fulldir) {
|
||||
if (preset::is_directory_a_preset($fulldir)) {
|
||||
$preset = new stdClass();
|
||||
$preset->isplugin = true;
|
||||
$preset->path = $fulldir;
|
||||
$preset->userid = 0;
|
||||
$preset->shortname = $dir;
|
||||
$preset->name = preset::get_name_from_plugin($dir);
|
||||
$presets[] = $preset;
|
||||
}
|
||||
}
|
||||
|
||||
return $presets;
|
||||
}
|
||||
}
|
||||
|
|
58
mod/data/classes/preset.php
Normal file
58
mod/data/classes/preset.php
Normal file
|
@ -0,0 +1,58 @@
|
|||
<?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/>.
|
||||
|
||||
namespace mod_data;
|
||||
|
||||
/**
|
||||
* Class preset for database activity.
|
||||
*
|
||||
* @package mod_data
|
||||
* @copyright 2022 Sara Arjona <sara@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
*/
|
||||
class preset {
|
||||
|
||||
/**
|
||||
* Checks if a directory contains all the required files to define a preset.
|
||||
*
|
||||
* @param string $directory The patch to check if it contains the preset files or not.
|
||||
* @return bool True if the directory contains all the preset files; false otherwise.
|
||||
*/
|
||||
public static function is_directory_a_preset(string $directory): bool {
|
||||
$status = true;
|
||||
$directory = rtrim($directory, '/\\') . '/';
|
||||
$presetfilenames = array_merge(array_values(manager::TEMPLATES_LIST), ['preset.xml']);
|
||||
foreach ($presetfilenames as $filename) {
|
||||
$status &= file_exists($directory.$filename);
|
||||
}
|
||||
|
||||
return $status;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the best name to show for a datapreset plugin.
|
||||
*
|
||||
* @param string $pluginname The datapreset plugin name.
|
||||
* @return string The plugin preset name to display.
|
||||
*/
|
||||
public static function get_name_from_plugin(string $pluginname): string {
|
||||
if (get_string_manager()->string_exists('modulename', 'datapreset_'.$pluginname)) {
|
||||
return get_string('modulename', 'datapreset_'.$pluginname);
|
||||
} else {
|
||||
return $pluginname;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -23,6 +23,8 @@
|
|||
* @package mod_data
|
||||
*/
|
||||
|
||||
use mod_data\manager;
|
||||
|
||||
require_once('../../config.php');
|
||||
require_once('lib.php');
|
||||
require_once($CFG->dirroot.'/mod/data/preset_form.php');
|
||||
|
@ -94,7 +96,8 @@ if ($id) {
|
|||
|
||||
require_login($course, true, $cm);
|
||||
|
||||
$context = context_module::instance($cm->id);
|
||||
$manager = manager::create_from_coursemodule($cm);
|
||||
$context = $manager->get_context();
|
||||
require_capability('mod/data:managetemplates', $context);
|
||||
|
||||
$formimportzip = new data_import_preset_zip_form();
|
||||
|
@ -315,10 +318,10 @@ switch ($mode) {
|
|||
}
|
||||
} else {
|
||||
echo $OUTPUT->heading(get_string('presets', 'data'), 2, 'mb-4');
|
||||
$presets = data_get_available_presets($context);
|
||||
$presetstable = new \mod_data\output\presets($data->id, $presets,
|
||||
$presets = $manager->get_available_presets();
|
||||
$presetsdata = new \mod_data\output\presets($data->id, $presets,
|
||||
new \moodle_url('/mod/data/field.php'));
|
||||
echo $renderer->render_presets($presetstable, false);
|
||||
echo $renderer->render_presets($presetsdata);
|
||||
}
|
||||
echo $OUTPUT->footer();
|
||||
exit;
|
||||
|
@ -463,4 +466,3 @@ if (($mode == 'new') && (!empty($newtype))) { // Adding a new field.
|
|||
|
||||
/// Finish the page
|
||||
echo $OUTPUT->footer();
|
||||
|
||||
|
|
105
mod/data/lib.php
105
mod/data/lib.php
|
@ -22,6 +22,7 @@
|
|||
*/
|
||||
|
||||
use mod_data\manager;
|
||||
use mod_data\preset;
|
||||
|
||||
defined('MOODLE_INTERNAL') || die();
|
||||
|
||||
|
@ -2030,52 +2031,30 @@ function data_convert_to_roles($data, $teacherroles=array(), $studentroles=array
|
|||
* @param string $shortname
|
||||
* @param string $path
|
||||
* @return string
|
||||
* @deprecated since Moodle 4.1 MDL-75148 - please, use the preset::get_name_from_plugin() function instead.
|
||||
* @todo MDL-75189 This will be deleted in Moodle 4.5.
|
||||
* @see preset::get_name_from_plugin()
|
||||
*/
|
||||
function data_preset_name($shortname, $path) {
|
||||
debugging('data_preset_name() is deprecated. Please use preset::get_name_from_plugin() instead.', DEBUG_DEVELOPER);
|
||||
|
||||
// We are looking inside the preset itself as a first choice, but also in normal data directory
|
||||
$string = get_string('modulename', 'datapreset_'.$shortname);
|
||||
|
||||
if (substr($string, 0, 1) == '[') {
|
||||
return $shortname;
|
||||
} else {
|
||||
return $string;
|
||||
}
|
||||
return preset::get_name_from_plugin($shortname);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns an array of all the available presets.
|
||||
*
|
||||
* @return array
|
||||
* @deprecated since Moodle 4.1 MDL-75148 - please, use the manager::get_available_presets() function instead.
|
||||
* @todo MDL-75189 This will be deleted in Moodle 4.5.
|
||||
* @see manager::get_available_presets()
|
||||
*/
|
||||
function data_get_available_presets($context) {
|
||||
global $CFG, $USER;
|
||||
debugging('data_get_available_presets() is deprecated. Please use manager::get_available_presets() instead.', DEBUG_DEVELOPER);
|
||||
|
||||
$presets = array();
|
||||
|
||||
// First load the ratings sub plugins that exist within the modules preset dir
|
||||
if ($dirs = core_component::get_plugin_list('datapreset')) {
|
||||
foreach ($dirs as $dir=>$fulldir) {
|
||||
if (is_directory_a_preset($fulldir)) {
|
||||
$preset = new stdClass();
|
||||
$preset->path = $fulldir;
|
||||
$preset->userid = 0;
|
||||
$preset->shortname = $dir;
|
||||
$preset->name = data_preset_name($dir, $fulldir);
|
||||
if (file_exists($fulldir.'/screenshot.jpg')) {
|
||||
$preset->screenshot = $CFG->wwwroot.'/mod/data/preset/'.$dir.'/screenshot.jpg';
|
||||
} else if (file_exists($fulldir.'/screenshot.png')) {
|
||||
$preset->screenshot = $CFG->wwwroot.'/mod/data/preset/'.$dir.'/screenshot.png';
|
||||
} else if (file_exists($fulldir.'/screenshot.gif')) {
|
||||
$preset->screenshot = $CFG->wwwroot.'/mod/data/preset/'.$dir.'/screenshot.gif';
|
||||
}
|
||||
$presets[] = $preset;
|
||||
}
|
||||
}
|
||||
}
|
||||
// Now add to that the site presets that people have saved
|
||||
$presets = data_get_available_site_presets($context, $presets);
|
||||
return $presets;
|
||||
$cm = get_coursemodule_from_id('', $context->instanceid, 0, false, MUST_EXIST);
|
||||
$manager = manager::create_from_coursemodule($cm);
|
||||
return $manager->get_available_presets();
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2084,30 +2063,20 @@ function data_get_available_presets($context) {
|
|||
* @param stdClass $context The context that we are looking from.
|
||||
* @param array $presets
|
||||
* @return array An array of presets
|
||||
* @deprecated since Moodle 4.1 MDL-75148 - please, use the manager::get_available_saved_presets() function instead.
|
||||
* @todo MDL-75189 This will be deleted in Moodle 4.5.
|
||||
* @see manager::get_available_saved_presets()
|
||||
*/
|
||||
function data_get_available_site_presets($context, array $presets=array()) {
|
||||
global $USER;
|
||||
debugging(
|
||||
'data_get_available_site_presets() is deprecated. Please use manager::get_available_saved_presets() instead.',
|
||||
DEBUG_DEVELOPER
|
||||
);
|
||||
|
||||
$fs = get_file_storage();
|
||||
$files = $fs->get_area_files(DATA_PRESET_CONTEXT, DATA_PRESET_COMPONENT, DATA_PRESET_FILEAREA);
|
||||
$canviewall = has_capability('mod/data:viewalluserpresets', $context);
|
||||
if (empty($files)) {
|
||||
return $presets;
|
||||
}
|
||||
foreach ($files as $file) {
|
||||
if (($file->is_directory() && $file->get_filepath()=='/') || !$file->is_directory() || (!$canviewall && $file->get_userid() != $USER->id)) {
|
||||
continue;
|
||||
}
|
||||
$preset = new stdClass;
|
||||
$preset->path = $file->get_filepath();
|
||||
$preset->name = trim($preset->path, '/');
|
||||
$preset->shortname = $preset->name;
|
||||
$preset->userid = $file->get_userid();
|
||||
$preset->id = $file->get_id();
|
||||
$preset->storedfile = $file;
|
||||
$presets[] = $preset;
|
||||
}
|
||||
return $presets;
|
||||
$cm = get_coursemodule_from_id('', $context->instanceid, 0, false, MUST_EXIST);
|
||||
$manager = manager::create_from_coursemodule($cm);
|
||||
$savedpresets = $manager->get_available_saved_presets();
|
||||
return array_merge($presets, $savedpresets);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2261,22 +2230,18 @@ function data_in_readonly_period($data) {
|
|||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
* Check if the files in a directory are the expected for a preset.
|
||||
*
|
||||
* @return bool Wheter the defined $directory has or not all the expected preset files.
|
||||
*
|
||||
* @deprecated since Moodle 4.1 MDL-75148 - please, use the preset::is_directory_a_preset() function instead.
|
||||
* @todo MDL-75189 This will be deleted in Moodle 4.5.
|
||||
* @see manager::is_directory_a_preset()
|
||||
*/
|
||||
function is_directory_a_preset($directory) {
|
||||
$directory = rtrim($directory, '/\\') . '/';
|
||||
$status = file_exists($directory.'singletemplate.html') &&
|
||||
file_exists($directory.'listtemplate.html') &&
|
||||
file_exists($directory.'listtemplateheader.html') &&
|
||||
file_exists($directory.'listtemplatefooter.html') &&
|
||||
file_exists($directory.'addtemplate.html') &&
|
||||
file_exists($directory.'rsstemplate.html') &&
|
||||
file_exists($directory.'rsstitletemplate.html') &&
|
||||
file_exists($directory.'csstemplate.css') &&
|
||||
file_exists($directory.'jstemplate.js') &&
|
||||
file_exists($directory.'preset.xml');
|
||||
debugging('is_directory_a_preset() is deprecated. Please use preset::is_directory_a_preset() instead.', DEBUG_DEVELOPER);
|
||||
|
||||
return $status;
|
||||
return preset::is_directory_a_preset($directory);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2350,7 +2315,7 @@ abstract class data_preset_importer {
|
|||
require_once($CFG->libdir.'/xmlize.php');
|
||||
|
||||
$fs = $fileobj = null;
|
||||
if (!is_directory_a_preset($this->directory)) {
|
||||
if (!preset::is_directory_a_preset($this->directory)) {
|
||||
//maybe the user requested a preset stored in the Moodle file storage
|
||||
|
||||
$fs = get_file_storage();
|
||||
|
@ -3650,7 +3615,7 @@ function data_presets_export($course, $cm, $data, $tostorage=false) {
|
|||
fclose($asearchtemplate);
|
||||
|
||||
// Check if all files have been generated
|
||||
if (! is_directory_a_preset($exportdir)) {
|
||||
if (! preset::is_directory_a_preset($exportdir)) {
|
||||
throw new \moodle_exception('generateerror', 'data');
|
||||
}
|
||||
|
||||
|
|
|
@ -28,21 +28,27 @@
|
|||
* @package mod_data
|
||||
*/
|
||||
|
||||
use mod_data\manager;
|
||||
|
||||
require_once('../../config.php');
|
||||
require_once($CFG->dirroot.'/mod/data/lib.php');
|
||||
require_once($CFG->dirroot.'/mod/data/preset_form.php');
|
||||
|
||||
$id = optional_param('id', 0, PARAM_INT); // The course module id.
|
||||
// The course module id.
|
||||
$id = optional_param('id', 0, PARAM_INT);
|
||||
|
||||
$manager = null;
|
||||
if ($id) {
|
||||
$cm = get_coursemodule_from_id('data', $id, null, null, MUST_EXIST);
|
||||
$course = $DB->get_record('course', array('id' => $cm->course), '*', MUST_EXIST);
|
||||
$data = $DB->get_record('data', array('id' => $cm->instance), '*', MUST_EXIST);
|
||||
list($course, $cm) = get_course_and_cm_from_cmid($id, manager::MODULE);
|
||||
$manager = manager::create_from_coursemodule($cm);
|
||||
$data = $manager->get_instance();
|
||||
} else {
|
||||
$d = required_param('d', PARAM_INT); // database activity id
|
||||
$data = $DB->get_record('data', array('id' => $d), '*', MUST_EXIST);
|
||||
$course = $DB->get_record('course', array('id' => $data->course), '*', MUST_EXIST);
|
||||
$cm = get_coursemodule_from_instance('data', $data->id, $course->id, null, MUST_EXIST);
|
||||
// We must have the database activity id.
|
||||
$d = required_param('d', PARAM_INT);
|
||||
$data = $DB->get_record('data', ['id' => $d], '*', MUST_EXIST);
|
||||
$manager = manager::create_from_instance($data);
|
||||
$cm = $manager->get_coursemodule();
|
||||
$course = get_course($cm->course);
|
||||
}
|
||||
|
||||
$action = optional_param('action', 'view', PARAM_ALPHA); // The page action.
|
||||
|
@ -52,7 +58,8 @@ if (!in_array($action, $allowedactions)) {
|
|||
throw new moodle_exception('invalidaccess');
|
||||
}
|
||||
|
||||
$context = context_module::instance($cm->id, MUST_EXIST);
|
||||
$context = $manager->get_context();
|
||||
|
||||
require_login($course, false, $cm);
|
||||
require_capability('mod/data:managetemplates', $context);
|
||||
|
||||
|
@ -70,7 +77,7 @@ $data->cmidnumber = $cm->idnumber;
|
|||
$data->instance = $cm->instance;
|
||||
|
||||
$renderer = $PAGE->get_renderer('mod_data');
|
||||
$presets = data_get_available_presets($context);
|
||||
$presets = $manager->get_available_presets();
|
||||
|
||||
if ($action === 'export') {
|
||||
if (headers_sent()) {
|
||||
|
|
|
@ -18,6 +18,7 @@ namespace mod_data;
|
|||
|
||||
use context_module;
|
||||
use moodle_url;
|
||||
use core_component;
|
||||
|
||||
/**
|
||||
* Manager tests class for mod_data.
|
||||
|
@ -161,4 +162,215 @@ class manager_test extends \advanced_testcase {
|
|||
$this->assertEventContextNotUsed($event);
|
||||
$this->assertNotEmpty($event->get_name());
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for get_available_presets().
|
||||
*
|
||||
* @covers ::get_available_presets
|
||||
*/
|
||||
public function test_get_available_presets() {
|
||||
global $DB;
|
||||
|
||||
$this->resetAfterTest();
|
||||
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$user = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
|
||||
$this->setUser($user);
|
||||
|
||||
$activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]);
|
||||
$cm = get_coursemodule_from_id(manager::MODULE, $activity->cmid, 0, false, MUST_EXIST);
|
||||
|
||||
// Check available presets meet the datapreset plugins when there are no any preset saved by users.
|
||||
$datapresetplugins = core_component::get_plugin_list('datapreset');
|
||||
$manager = manager::create_from_coursemodule($cm);
|
||||
$presets = $manager->get_available_presets();
|
||||
$this->assertCount(count($datapresetplugins), $presets);
|
||||
// Confirm that, at least, the "Image gallery" is one of them.
|
||||
$namepresets = array_map(function($preset) {
|
||||
return $preset->name;
|
||||
}, $presets);
|
||||
$this->assertContains('Image gallery', $namepresets);
|
||||
|
||||
// Login as admin and create some presets saved manually by users.
|
||||
$this->setAdminUser();
|
||||
$plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data');
|
||||
$savedpresets = [];
|
||||
for ($i = 1; $i <= 3; $i++) {
|
||||
$preset = (object) [
|
||||
'name' => 'Preset name ' . $i,
|
||||
];
|
||||
$plugingenerator->create_preset($activity, $preset);
|
||||
$savedpresets[] = $preset;
|
||||
}
|
||||
$savedpresetsnames = array_map(function($preset) {
|
||||
return $preset->name;
|
||||
}, $savedpresets);
|
||||
$this->setUser($user);
|
||||
|
||||
// Check available presets meet the datapreset plugins + presets saved manually by users.
|
||||
$presets = $manager->get_available_presets();
|
||||
$this->assertCount(count($datapresetplugins) + count($savedpresets), $presets);
|
||||
// Confirm that, apart from the "Image gallery" preset, the ones created manually have been also returned.
|
||||
$namepresets = array_map(function($preset) {
|
||||
return $preset->name;
|
||||
}, $presets);
|
||||
$this->assertContains('Image gallery', $namepresets);
|
||||
foreach ($savedpresets as $savedpreset) {
|
||||
$this->assertContains($savedpreset->name, $namepresets);
|
||||
}
|
||||
// Check all the presets have the proper value for the isplugin attribute.
|
||||
foreach ($presets as $preset) {
|
||||
if (in_array($preset->name, $savedpresetsnames)) {
|
||||
$this->assertFalse($preset->isplugin);
|
||||
} else {
|
||||
$this->assertTrue($preset->isplugin);
|
||||
}
|
||||
}
|
||||
|
||||
// Unassign the capability to the teacher role and check that only plugin presets are returned (because the saved presets
|
||||
// have been created by admin).
|
||||
$teacherrole = $DB->get_record('role', ['shortname' => 'teacher']);
|
||||
unassign_capability('mod/data:viewalluserpresets', $teacherrole->id);
|
||||
$presets = $manager->get_available_presets();
|
||||
$this->assertCount(count($datapresetplugins), $presets);
|
||||
// Confirm that, at least, the "Image gallery" is one of them.
|
||||
$namepresets = array_map(function($preset) {
|
||||
return $preset->name;
|
||||
}, $presets);
|
||||
$this->assertContains('Image gallery', $namepresets);
|
||||
foreach ($savedpresets as $savedpreset) {
|
||||
$this->assertNotContains($savedpreset->name, $namepresets);
|
||||
}
|
||||
|
||||
// Create a preset with the current user and check that, although the viewalluserpresets is not assigned to the teacher
|
||||
// role, the preset is returned because the teacher is the owner.
|
||||
$savedpreset = (object) [
|
||||
'name' => 'Preset created by teacher',
|
||||
];
|
||||
$plugingenerator->create_preset($activity, $savedpreset);
|
||||
$presets = $manager->get_available_presets();
|
||||
// The presets total is all the plugin presets plus the preset created by the teacher.
|
||||
$this->assertCount(count($datapresetplugins) + 1, $presets);
|
||||
// Confirm that, at least, the "Image gallery" is one of them.
|
||||
$namepresets = array_map(function($preset) {
|
||||
return $preset->name;
|
||||
}, $presets);
|
||||
$this->assertContains('Image gallery', $namepresets);
|
||||
// Confirm that savedpresets are still not returned.
|
||||
foreach ($savedpresets as $savedpreset) {
|
||||
$this->assertNotContains($savedpreset->name, $namepresets);
|
||||
}
|
||||
// Confirm the new preset created by the teacher is returned too.
|
||||
$this->assertContains('Preset created by teacher', $namepresets);
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for get_available_plugin_presets().
|
||||
*
|
||||
* @covers ::get_available_plugin_presets
|
||||
*/
|
||||
public function test_get_available_plugin_presets() {
|
||||
$this->resetAfterTest();
|
||||
$this->setAdminUser();
|
||||
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]);
|
||||
|
||||
// Check available plugin presets meet the datapreset plugins.
|
||||
$datapresetplugins = core_component::get_plugin_list('datapreset');
|
||||
$manager = manager::create_from_instance($activity);
|
||||
$presets = $manager->get_available_plugin_presets();
|
||||
$this->assertCount(count($datapresetplugins), $presets);
|
||||
// Confirm that, at least, the "Image gallery" is one of them.
|
||||
$namepresets = array_map(function($preset) {
|
||||
return $preset->name;
|
||||
}, $presets);
|
||||
$this->assertContains('Image gallery', $namepresets);
|
||||
|
||||
// Create a preset saved manually by users.
|
||||
$savedpreset = (object) [
|
||||
'name' => 'Preset name 1',
|
||||
];
|
||||
$plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data');
|
||||
$plugingenerator->create_preset($activity, $savedpreset);
|
||||
|
||||
// Check available plugin presets don't contain the preset saved manually.
|
||||
$presets = $manager->get_available_plugin_presets();
|
||||
$this->assertCount(count($datapresetplugins), $presets);
|
||||
// Confirm that, at least, the "Image gallery" is one of them.
|
||||
$namepresets = array_map(function($preset) {
|
||||
return $preset->name;
|
||||
}, $presets);
|
||||
$this->assertContains('Image gallery', $namepresets);
|
||||
// Confirm that the preset saved manually hasn't been returned.
|
||||
$this->assertNotContains($savedpreset->name, $namepresets);
|
||||
// Check all the presets have the proper value for the isplugin attribute.
|
||||
foreach ($presets as $preset) {
|
||||
$this->assertTrue($preset->isplugin);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for get_available_saved_presets().
|
||||
*
|
||||
* @covers ::get_available_saved_presets
|
||||
*/
|
||||
public function test_get_available_saved_presets() {
|
||||
global $DB;
|
||||
|
||||
$this->resetAfterTest();
|
||||
|
||||
$course = $this->getDataGenerator()->create_course();
|
||||
$user = $this->getDataGenerator()->create_and_enrol($course, 'teacher');
|
||||
$this->setUser($user);
|
||||
|
||||
$activity = $this->getDataGenerator()->create_module(manager::MODULE, ['course' => $course]);
|
||||
$cm = get_coursemodule_from_id(manager::MODULE, $activity->cmid, 0, false, MUST_EXIST);
|
||||
|
||||
// Check available saved presets is empty (because, for now, no user preset has been created).
|
||||
$manager = manager::create_from_coursemodule($cm);
|
||||
$presets = $manager->get_available_saved_presets();
|
||||
$this->assertCount(0, $presets);
|
||||
|
||||
// Create some presets saved manually by the admin user.
|
||||
$this->setAdminUser();
|
||||
$plugingenerator = $this->getDataGenerator()->get_plugin_generator('mod_data');
|
||||
$savedpresets = [];
|
||||
for ($i = 1; $i <= 3; $i++) {
|
||||
$preset = (object) [
|
||||
'name' => 'Preset name ' . $i,
|
||||
];
|
||||
$plugingenerator->create_preset($activity, $preset);
|
||||
$savedpresets[] = $preset;
|
||||
}
|
||||
// Create one more preset saved manually by the teacher user.
|
||||
$this->setUser($user);
|
||||
$teacherpreset = (object) [
|
||||
'name' => 'Preset created by teacher',
|
||||
];
|
||||
$plugingenerator->create_preset($activity, $teacherpreset);
|
||||
$savedpresets[] = $teacherpreset;
|
||||
|
||||
$savedpresetsnames = array_map(function($preset) {
|
||||
return $preset->name;
|
||||
}, $savedpresets);
|
||||
|
||||
// Check available saved presets only contain presets saved manually by users.
|
||||
$presets = $manager->get_available_saved_presets();
|
||||
$this->assertCount(count($savedpresets), $presets);
|
||||
// Confirm that it contains only the presets created manually.
|
||||
foreach ($presets as $preset) {
|
||||
$this->assertContains($preset->name, $savedpresetsnames);
|
||||
$this->assertFalse($preset->isplugin);
|
||||
}
|
||||
|
||||
// Unassign the mod/data:viewalluserpresets capability to the teacher role and check that saved presets are not returned.
|
||||
$teacherrole = $DB->get_record('role', ['shortname' => 'teacher']);
|
||||
unassign_capability('mod/data:viewalluserpresets', $teacherrole->id);
|
||||
|
||||
$presets = $manager->get_available_saved_presets();
|
||||
$this->assertCount(1, $presets);
|
||||
$preset = reset($presets);
|
||||
$this->assertEquals($teacherpreset->name, $preset->name);
|
||||
}
|
||||
}
|
||||
|
|
89
mod/data/tests/preset_test.php
Normal file
89
mod/data/tests/preset_test.php
Normal file
|
@ -0,0 +1,89 @@
|
|||
<?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/>.
|
||||
|
||||
namespace mod_data;
|
||||
|
||||
/**
|
||||
* Preset tests class for mod_data.
|
||||
*
|
||||
* @package mod_data
|
||||
* @category test
|
||||
* @copyright 2022 Sara Arjona <sara@moodle.com>
|
||||
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
||||
* @coversDefaultClass \mod_data\preset
|
||||
*/
|
||||
class preset_test extends \advanced_testcase {
|
||||
|
||||
/**
|
||||
* Test for is_directory_a_preset().
|
||||
*
|
||||
* @dataProvider is_directory_a_preset_provider
|
||||
* @covers ::is_directory_a_preset
|
||||
* @param string $directory
|
||||
* @param bool $expected
|
||||
*/
|
||||
public function test_is_directory_a_preset(string $directory, bool $expected): void {
|
||||
$this->resetAfterTest();
|
||||
$this->setAdminUser();
|
||||
|
||||
$result = preset::is_directory_a_preset($directory);
|
||||
$this->assertEquals($expected, $result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Data provider for test_is_directory_a_preset().
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function is_directory_a_preset_provider(): array {
|
||||
global $CFG;
|
||||
|
||||
return [
|
||||
'Valid preset directory' => [
|
||||
'directory' => $CFG->dirroot . '/mod/data/preset/imagegallery',
|
||||
'expected' => true,
|
||||
],
|
||||
'Invalid preset directory' => [
|
||||
'directory' => $CFG->dirroot . '/mod/data/field/checkbox',
|
||||
'expected' => false,
|
||||
],
|
||||
'Unexisting preset directory' => [
|
||||
'directory' => $CFG->dirroot . 'unexistingdirectory',
|
||||
'expected' => false,
|
||||
],
|
||||
];
|
||||
}
|
||||
|
||||
/**
|
||||
* Test for get_name_from_plugin().
|
||||
*
|
||||
* @covers ::get_name_from_plugin
|
||||
*/
|
||||
public function test_get_name_from_plugin() {
|
||||
$this->resetAfterTest();
|
||||
$this->setAdminUser();
|
||||
|
||||
// The expected name for plugins with modulename in lang is this value.
|
||||
$name = preset::get_name_from_plugin('imagegallery');
|
||||
$this->assertEquals('Image gallery', $name);
|
||||
|
||||
// However, if the plugin doesn't exist or the modulename is not defined, the preset shortname will be returned.
|
||||
$presetshortname = 'nonexistingpreset';
|
||||
$name = preset::get_name_from_plugin($presetshortname);
|
||||
$this->assertEquals($presetshortname, $name);
|
||||
}
|
||||
|
||||
}
|
|
@ -5,6 +5,11 @@ information provided here is intended especially for developers.
|
|||
* The method data_view is now deprecated. Use $maganer->set_module_viewed instead.
|
||||
* The data_print_template function is now deprecated and replaced by mod_data\template class.
|
||||
* The data_print_ratings function now has an extra $print to get the ratings output instead of printing it directly.
|
||||
* The following functions have been deprecated because they have been moved to the manager class:
|
||||
- data_get_available_presets
|
||||
- data_get_available_site_presets
|
||||
- data_preset_name
|
||||
- is_directory_a_preset
|
||||
|
||||
=== 3.7 ===
|
||||
* External functions get_entries, get_entry and search_entries now return an additional field "tags" containing the entry tags.
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue